Archive - bitspook.inhttps://bitspook.in/archive/feed.xml2024-01-04T08:18:20.204473ZCharanjit Singhhttps://bitspook.in/images/avatar.pngThoughts on HPI and future of cl-ownpresshttps://bitspook.in/blog/thoughts-on-hpi-and-future-of-cl-ownpress2024-01-01T10:54:00.000000ZCharanjit Singh2024-01-01T10:54:00.000000Z<blockquote id="org89bc37c">
<p>
Reflecting on similarities and differences b/w HPI and what I want cl-ownpress to build into.
Thinking out loud.
</p>
</blockquote>
<p>
Recently I came across <a href="https://github.com/karlicoss/HPI">HPI</a> again. HPI has a lot of similarities to what I want cl-ownpress to be.
Its goal seem to be enabling a user to take ownership of their own data that's locked in online
platforms. This is exactly what I want cl-ownpress to do for me. This realization gave me pause, and
here I am rationalizing continued existence of cl-ownpress.
</p>
<p>
cl-ownpress is supposed to be a part of a bigger ecosystem for personal computing. By personal
computing I mean hooking into every aspect of my personal life. My thoughts (daily journal, captured
ideas), finances, things I own, people I interact with, work I do and everything else. In my ideal
personal computing ecosystem, different independent pieces interact with and build upon each other.
</p>
<p>
<i>For example</i>, I want to have a CRM to manage people and my relationships with them. I want the
ability to mention people from my CRM in my daily journal, and then be able to make queries like
"all interactions with person <X>". Similarly, I want to utilize my CRM to also mention people in my
blog-posts. These mentions however should get intelligently published. e.g on my personal website,
mention of a person should become a link to their own personal website. When publishing to mastodon,
it should become a mastodon mention.
</p>
<p>
<i>Another example</i>, I'd like to maintain an accounting ledger of all the money I spend. I want to
utilize this to also maintain a list of things I own. I'd like to utilize this in turn to review
things I use, and publish my reviews to my personal website and/or where I purchased it from.
</p>
<p>
Publishing a subset of all the data in my personal computing ecosystem is where cl-ownpress comes
in.
</p>
<p>
At present, cl-ownpress happens to be the most complete component of my ecosystem. I have a <a href="https://github.com/bitspook/brandi">few</a>
<a href="https://github.com/bitspook/saunf">other</a> <a href="https://github.com/bitspook/kharcha">pieces</a> in pretty-much abandoned state while I have replaced them with some untracked lisp code
(mostly in my Emacs setup).
</p>
<p>
HPI seems to provide same functionality as cl-ownpress's <a href="https://github.com/bitspook/cl-ownpress/blob/master/src/provider/package.lisp#L1-L4">providers</a>. So why not replace <code>provider</code>-s
with HPI and build on already done work? Well, things I wanted so far (converting my denote notes to
blog posts while using my Emacs configuration to do the conversion from org to html) don't have a
replacement in HPI. In future, when I want to deal with an external data source and there is an HPI
module available for it, perhaps I'll create an <code>hpi-provider</code>.
</p>
<p>
That settles one aspect of relationship of cl-ownpress and HPI. They're complimentary instead of
contradictory. HPI is essentially a set of cl-ownpress <code>provider</code>-s. But I believe there is a
philosophical difference in how both these projects approach gaining ownership over user's data.
</p>
<p>
HPI <b>accepts</b> that data is going to be produced on walled platforms, while cl-ownpress establishes
user's own platform where data is originally published. Cl-ownpress then uses the walled platforms
for interacting with people these platforms have managed to hold hostage.
</p>
<p>
Admittedly HPI has a broader scope, it deals with more than just getting data back from walled
platforms, but in the aspect of 'publishing', I believe this holds true. With cl-ownpress, I want to
invert the relationship. Instead of "the platform <X> uses me and locks in <b>my</b> content", I want it
to be "<b>I</b> own my content, and use the walled garden to interact with its hostages".
</p>
<p>
The subtle difference is important to me. This is an attitude I'd like to have towards life, and
what is my personal computing ecosystem if not its reflection.
</p>
Reading, and not forgettinghttps://bitspook.in/blog/reading-and-not-forgetting2023-01-15T19:46:00.000000ZCharanjit Singh2023-01-15T19:46:00.000000Z<div id="outline-container-org3d2189f" class="outline-2">
<h2 id="org3d2189f">Problem</h2>
<div class="outline-text-2" id="text-org3d2189f">
<p>
I forget everything I read, as soon as I am done reading (a sentence). Over
time, reading turned from leisure to labor. Pressure of having to remember
things took the fun out of reading. Small attention span and easily getting
distracted made it even worse.
</p>
</div>
</div>
<div id="outline-container-org57dd7ea" class="outline-2">
<h2 id="org57dd7ea">Solution</h2>
<div class="outline-text-2" id="text-org57dd7ea">
<p>
Take notes to outsource remembering, and make reading more engaging.
</p>
<p>
Creating well-organized notes take the burden of remembering away. The act of
taking notes keep my attention tethered.
</p>
</div>
</div>
<div id="outline-container-orge853137" class="outline-2">
<h2 id="orge853137">Implementation</h2>
<div class="outline-text-2" id="text-orge853137">
<p>
Note taking process need to be designed to reduce the burden that note-taking
itself can become. Key here is not taking notes, it is crafting a smooth
note-taking workflow.
</p>
</div>
<div id="outline-container-org3472d81" class="outline-3">
<h3 id="org3472d81">Components</h3>
<div class="outline-text-3" id="text-org3472d81">
<p>
My reading workflow involves 3 major components
</p>
<ol class="org-ol">
<li>Emacs</li>
<li>Denote, an Emacs package for managing notes</li>
<li>Spookfox: An Emacs package for controlling Firefox from Emacs</li>
</ol>
</div>
<div id="outline-container-orgd51d73c" class="outline-4">
<h4 id="orgd51d73c">Emacs</h4>
<div class="outline-text-4" id="text-orgd51d73c">
<p>
Emacs is the center stage on which everything else plays. I chose Emacs, because
</p>
<ol class="org-ol">
<li>It is where I spend most time on my computer</li>
<li>I am very comfortable hacking on it, so tuning things to make my workflow
smoother is an already acquired habit.</li>
<li>I already have a thriving documenting system/workflow in Emacs. I have to
externalize a lot of my mind, for which I've been using Emacs for over a
decade now.</li>
</ol>
</div>
</div>
<div id="outline-container-org7b85c12" class="outline-4">
<h4 id="org7b85c12">Denote</h4>
<div class="outline-text-4" id="text-org7b85c12">
<p>
<a href="https://github.com/protesilaos/denote">Denote</a> is my present choice of note-taking Emacs package. It provide structure
to my notes, and thin tooling to navigate this structure. Notes are kept in
<code><timestamp>-<slug>__<tags>.org</code> format. This makes it easy to find a note by
keywords and tags even from outside Emacs.
</p>
</div>
</div>
<div id="outline-container-org3d871f6" class="outline-4">
<h4 id="org3d871f6">Spookfox</h4>
<div class="outline-text-4" id="text-org3d871f6">
<p>
<a href="https://github.com/bitspook/spookfox">Spookfox</a> is my answer to "but what about when you need to leave Emacs?".
</p>
<p>
I consume most of the educational content on the web, that usually means
Firefox. I built myself a small system (Spookfox) to make Emacs speak with
Firefox.
</p>
<p>
It is sort of a launch-pad for quickly creating Firefox addons which talk to
Emacs. Most commonly I use it for accessing content I have in browser, e.g
getting information about current browser tab, video being played etc.
</p>
</div>
</div>
</div>
<div id="outline-container-org34c82d8" class="outline-3">
<h3 id="org34c82d8">The workflow</h3>
<div class="outline-text-3" id="text-org34c82d8">
<p>
It boils down to a single key-combo: <code>C-c n r</code> open a "reading note" in my
scratchpad. <code>C-c n r</code> opens the same note regardless of when I open it; i.e it
don't re-create a new note every time. This is super useful when you are blessed
with the combo of laziness and forgetfulness.
</p>
<p>
Scratchpad is a mechanism for quickly launching an Emacs window for capturing
some information. This usually means bringing an Emacs window to focus with a
keypress.
</p>
<p>
A reading note is a note which has
</p>
<ol class="org-ol">
<li><code>reading</code> tag</li>
<li>A <code>source</code> property, which is 95% of the times the web URL (from Firefox)</li>
<li><p>
<code>reading</code> subdirectory in my notes
</p>
<p>
It seems redundant given that there is already a <code>reading</code> tag, but I keep it
not for categorizing the notes but to keep them out of my normal
notes-search.
</p></li>
</ol>
<p>
My "normal" notes are conceptual, they come from different sources and are
essence of my understanding from different sources. My reading notes <b>are</b> these
sources.
</p>
<p>
"Reading" notes free me up to not worry about the structure of the notes I am
taking or its impact on other notes. After taking the "reading" notes, I review
them and move appropriate parts (or summary/rephrase) them in my "normal"
note(s), while linking back to the reading note.
</p>
<p>
This create a neat web of sources and concepts. I get to be free from the burden
of keeping track of where the knowledge in my notes is coming from. When I need
to track something back to its source, I get nice hand-drafted summary of the
original source.
</p>
<p>
With Spookfox I extend this workflow to (Youtube) videos as well. In addition to
automatically opening the note, I have <a href="https://github.com/bitspook/spookmax.d/blame/7f5f0fbde3777662d2d2fb2baefc18a71c012855/readme.org#L1528-L1610">Emacs configured to insert video
timestamps with my notes</a>. This essentially annotate Youtube videos, and have
come super handy recently in my German language study.
</p>
</div>
</div>
</div>
I am moving to Berlinhttps://bitspook.in/blog/i-am-moving-to-berlin2022-11-22T15:12:00.000000ZCharanjit Singh2022-11-22T15:12:00.000000Z<div id="outline-container-org9f40b28" class="outline-2">
<h2 id="org9f40b28">Why</h2>
<div class="outline-text-2" id="text-org9f40b28">
<p>
There are several reasons I stated in my <a href="https://bitspook.in/blog/after-6-months-of-voluntary-unemployment/">previous blog post</a>. Other than those,
here are a few more:
</p>
<ol class="org-ol">
<li><p>
Peer pressure
</p>
<p>
At this point it is customary for Punjabis to immigrate to a foreign country.
Since I was little I was conditioned to want to go to a developed country, so
it had become a deep rooted desire. My choice was of <b>which</b> country, and
going against the advice of almost everyone in my family, I chose to not go
to Canada or Australia. I was promised more money and easier life in those
countries, but I see more of my personal goals in alignment in Germany.
</p></li>
<li><p>
Cold weather
</p>
<p>
Punjab has colder weather than most parts of India, and they're my favorite
part of the year. I absolutely abhor Punjab's summers. Germany's cold weather
was appealing.
</p></li>
<li><p>
Europe
</p>
<p>
The fact that I get access to more than one country was also a factor. If I
still have the appetite, I can move to a different culture relatively easily.
</p></li>
<li><p>
Rules
</p>
<p>
I am a sucker for rules. If they are sensible and sensibly implemented, they
can free you up in so many ways. Many lines-of-thought can be short-circuited
and mental resources invested in more interesting things. Germany as far as I
have researched online have more sensible rules, and a culture of mostly
following them.
</p></li>
</ol>
</div>
</div>
<div id="outline-container-orga1f5c65" class="outline-2">
<h2 id="orga1f5c65">How I am feeling</h2>
<div class="outline-text-2" id="text-orga1f5c65">
<p>
I am scared shitless. I am full of stress and anxiety, I can barely sleep and
can't focus on anything. I have stopped drinking coffee because I no longer need
caffeine for the jitters.
</p>
<p>
It is way more scarier than what I imagined. When I decided to move to Berlin I
was excited, a little scared too but also looking forward to it. Now I am
fighting myself to not just drop the whole thing every second of the day.
</p>
<p>
I am not an adventurous person, I find all forms of traveling tiresome. I stay
at home to recharge. Fear I am feeling right now however is more than the
ambiguity of going somewhere new. Me burning through my savings during past few
months is also a major contributor. I have made this huge decision, and spent
almost all my remaining funds to book housing, tickets and stuff.
</p>
</div>
</div>
<div id="outline-container-org86c9ad4" class="outline-2">
<h2 id="org86c9ad4">What lies ahead</h2>
<div class="outline-text-2" id="text-org86c9ad4">
<p>
I intend to come back to India after at most 2 years and at least 1 year.
</p>
<p>
1 year minimum because 1 year is the limit I am putting for myself to buckle up
and stay in Berlin, experience stuff even if I don't want to. I am hoping it'll
be enough to reveal whether my feeling that being outside my comfort zone will
make me do more fulfilling things is true or not. 2 year maximum because I think
2 years should be enough for personal growth by being in a foreign country.
</p>
<p>
I find the ideas of e-governance and using technology in public administration
most exciting. I think India is the right place to make most impact with these.
I want to establish a parallel social administration system, which can help the
State's system, or fight it to make a positive impact. This is also one of the
reasons I have decided to go work outside India. Because it is a significant
commitment and I don't want to find myself taking breaks from it for other
things I wanted to do which might significantly disrupt this commitment.
</p>
<p>
Or all this could just be fantasies. In almost every phase of life, whenever I
felt like things need to be improved I have fantasized about how things could
have been made better. At my home, in school, in college, in software companies,
in my village, in my city, in the companies I worked in; pretty much everywhere.
I have not always taken action, and often moved to the newer set of problems
forgetting the old ones as they became irrelevant to me. I won't fight it if it
happens this time as well. I can't fight every battle, I prefer letting the
fights pick themselves for me. But so far I am fully intent on returning to
India and participate somehow in public administration.
</p>
</div>
</div>
Insolent Softwarehttps://bitspook.in/blog/insolent-software2022-11-07T00:00:00.000000ZCharanjit Singh2022-11-07T00:00:00.000000Z<p>
I am used to put limits on myself. Finding reasons, some in authority, most in
circumstance; to not solve the problems I've judged solvable.
</p>
<p>
People putting limits on themselves is not something new or unique to building
software. It is a recurring pattern in human behavior. Well meaning reasons are
often rationalizations for fear of unknown, or that of actually putting in the
work. Just as often, there are actual limits universe has put on us, crossing
which come at great cost.
</p>
<p>
But software is <b>our</b> domain. Things writ in stone in "real" world are not
necessarily so in the wonderful world of software development. What is subjected
to physical laws in real world is a matter of choice of constraints. Often we
get to pick and choose, trade the expensive ones for those inconvenient, but
still make the impossible probable.
</p>
<p>
When the imaginary constraints are dropped, what is left behind is curiosity and
wonder. It is in essence, a source of joy. It is similar to re-discovering joy
in tending to fruitless flowers after a lifetime of growing crops for commerce.
</p>
<p>
When I say imaginary constraints, I am speaking in the sense of Max Stirner's
spooks. Imaginary constraints, for example those of
</p>
<ul class="org-ul">
<li>authority: am I allowed to do this?</li>
<li>tribalism: will my team adopt it?</li>
<li>economy: can I monetize it?</li>
<li>romance: will it scale?</li>
<li>vanity: is it elegant?</li>
</ul>
<p>
I wanted a term to express this kind of software. Anarchism comes close to the
meaning I want to convey, but it is too nuanced. What I mean is simpler. An
unapologetic form of <i>"works on my machine"</i>. Software which is deliberately
insolent toward the processes which the creator believes get in their way.
</p>
<p>
It is a deceptively simple thing. It is not easy reaching a solution so free.
This line of thinking is very much going against the grain of human
civilization. Unlearning the lessons society has taught us before we knew
learning, does not come easy.
</p>
<p>
What is even harder is identifying problems which can be solved with insolence.
These problems are often invisible. Problems we accept and get used to, and
don't see as problems at all. Until someone solves them and obviousness of it
hit us like a brick. Perhaps recognizing and solving such problems is what
separates inventors from the rest of us.
</p>
<p>
As a kid, reading of inventors of the golden age of science would fill me up
with fantasies of becoming one myself someday. It saddens me to think that I
have not yet become one.
</p>
<p>
Not all software can be written this way. Line between imaginary and real
becomes blurry as more people believe in something. Very often we need to
maintain the charades of make-believe, simply because we can not be alone in the
solution.
</p>
<p>
There is one form of software, which almost always can be insolent. Software
built for yourself. Not apps to sell or startups to change the world. Simple
scripts, big and small, to solve your personal problems. Over last few months, I
have come to associate personal computing with same feelings I have when playing
something like Factorio or Cities Skylines. It is a joyous endeavor, we shall
talk of on another day.
</p>
After 6 months of voluntary unemploymenthttps://bitspook.in/blog/after-6-months-of-voluntary-unemployment2022-10-03T00:00:00.000000ZCharanjit Singh2022-10-03T00:00:00.000000Z<p>
For the last six months, I have been <a href="https://bitspook.in/blog/i-have-quit-my-job">voluntarily unemployed</a>. Here's a brief
summary of how the last six months shaped my thoughts, and an abstract plan of
what I intend to do next.
</p>
<div id="outline-container-orgb08ea39" class="outline-2">
<h2 id="orgb08ea39">Mental health</h2>
<div class="outline-text-2" id="text-orgb08ea39">
<p>
I needed this break a lot more than I thought I did. Being perpetually restless
had been my state of being for too long. It felt good, to breath out.
</p>
<p>
When writing software, you reach a certain point where things start falling into
place, the uncertainties are answered for and you can feel that the decisions
you made were right. Those few seconds of invincibility spanned over several
(not always consequent) days, because I felt it was me in control. Them I
remember most cherishingly. It was a kind of high I intend to chase again in
life.
</p>
<p>
Primary reason for which I quit my job was the curiosity about whether I can
manage my ADHD now; or if I still need the crutches of accountability. On job, I
could effortlessly perform well, in contrast to solo freelancing. My therapist
had suggested it will get better with age.
</p>
<p>
I had more good days than bad, which is a win. Unfortunately I still don't have
a definite answer to consider the matter resolved. More on this later (below).
</p>
</div>
</div>
<div id="outline-container-org1e3a7ad" class="outline-2">
<h2 id="org1e3a7ad">Social work</h2>
<div class="outline-text-2" id="text-org1e3a7ad">
<p>
When busy with material responsibilities, I used to fantasize that if I had more
free time I could do so much more for people around me. When I had it, I tried
to start with the place closest to my heart.
</p>
<p>
I tried to "help" my village by contributing to its small primary school, least
politically charged of situations there. Well, not so much as tried to help as
probed with a long stick to assess the willingness to be helped. I quickly found
out that a significant involvement there is a luxury I can't afford just yet.
Established power structures see everything new as threat, and eagerly sabotage
what they can get away with.
</p>
<p>
So I chose a different avenue. One just as dear to me, but where I have more
experience and room to maneuver. I decided to make <a href="https://entropyhacker.space/">another attempt</a> to nurture a
healthy tech culture in my city. It produced mixed results because I was not
able to put in as much energy as it demanded.
</p>
</div>
</div>
<div id="outline-container-org688bd53" class="outline-2">
<h2 id="org688bd53">Mistake of learning Common Lisp</h2>
<div class="outline-text-2" id="text-org688bd53">
<p>
I was running full speed building <a href="https://github.com/bitspook/press.el">foolish</a> <a href="https://github.com/bitspook/spookfox">things</a>. Then lisp came calling.
</p>
<video autoplay="" loop="" alt="Wile E Coyote hitting the tunnel. Tunnel hits back.">
<source src="/videos/hit-it.webm" type="video/webm">
</video>
<p>
I was working on <a href="https://github.com/bitspook/entropy">Entropy</a>, to build a software to help me do the leg work of
building a tech community. Thought came that it is for hackers, so it should be
hackable. Lisp is praised for how hackable it is. It is also praised for its
expressiveness. Momentum is something I was finding hard to achieve with Rust,
because of my inexperience and perhaps the nature of the language and problem I
was trying to solve with it. At least checking lisp out seemed reasonable.
</p>
<p>
After 30 years of living with them, I have come to recognize desires of pivotal
nature. In the face of these sublimely consuming whims, I can either do what
they say, or not do anything at all (I am told it is common with ADHD, so not to
beat myself too much about it).
</p>
<p>
I've learned that it is possible to suppress these urges by feigning blindness.
My mistake was that of indecision. It is not possible to take a sip and not
gulp. I chose to look at it, but took too long to engage. I got thrown off the
build-mode.
</p>
<p>
I have observed that I operate in two distinct modes: build-mode and study-mode.
Although building something is always a learning experience, and to learn
something I gotta build something; it is efficient to treat them as separate. It
is also easier on my mental peace.
</p>
<p>
This time, the transition between the two modes was not smooth. Getting
involuntarily thrown out of the workshop left me with (mental) bruises. This
incident is the reason I still consider the matter of my self-discipline
unresolved. Although the fact that there were only 2 such incidents over 6
months is a win by itself (another was when I fell in love with a <a href="https://practicalguidetoevil.wordpress.com">book</a>, and
spent weeks doing nothing else).
</p>
<p>
I filled the downtime during transition with another thing I wanted to do, and
probably would not have done otherwise. I traveled.
</p>
</div>
</div>
<div id="outline-container-orgf8e4ea0" class="outline-2">
<h2 id="orgf8e4ea0">Travel</h2>
<div class="outline-text-2" id="text-orgf8e4ea0">
<p>
I am not much of a site-seeing kind of guy. I find traveling exhausting,
regardless of how beautiful the views or how fun the activities. Being a tourist
is not for me. I like to stay and experience. I enjoy exploring/observing people
(people watching?). Witnessing people go by their lives is soothing. There is a
warm fuzzy feeling behind every smile, however mundane.
</p>
<p>
So I traveled the way I truly like, perhaps for the first time. For about 3
months trotting around the mountains of Uttrakhand, visiting people in their
homes (home stays). Observing a way of life familiar yet strange.
</p>
<p>
It came as a surprise how eye-opening the experience turned out to be, despite
being quite event-less. It was like learning a new language or studying math. I
could almost feel my brain building new connections. This is one of the few
feelings which still stays exciting even when the rat-race and hoarding have
stopped being as stimulating. I did not expect to find an entirely new source of
it in an experience like this.
</p>
<p>
It is also the easiest methods in terms of active participation, compared to all
the other sources (most are a variations of intellectual exercises; solving a
challenging problem, crafting an elegant solution etc). It does have its costs,
but I believe they do not overlap with those of other methods; so they can be
employed at the same time.
</p>
<p>
I take it to mean I can have twice of what makes me feel most alive, just by
putting myself in a place ๐คฏ
</p>
</div>
</div>
<div id="outline-container-org6b8b81b" class="outline-2">
<h2 id="org6b8b81b">What comes next?</h2>
<div class="outline-text-2" id="text-org6b8b81b">
<p>
I can perhaps spend a few more months before I run out of savings, but the
dimming safety net has already started making me anxious. I miss the tribe-like
feeling of working in a team, so I am actually looking forward to join work for
that.
</p>
<p>
Most freeing would be to start a business of my own; not because it will leave
me with more free time, but because I can feel more like myself when working on
something I find meaningful. But that won't be profitable right out of the door,
so perhaps after a bit more grinding I can save up to give myself a chance.
</p>
<p>
The grind is decided, but I will not choose misery along with. I intend to chase
the feeling of growth and fulfillment. With these constraints, some more
decisions make themselves:
</p>
<ol class="org-ol">
<li>I can't stay at home. Being home is extremely comfortable, but with
comfort comes stagnation.</li>
<li>I need a job which leaves me with enough time I can invest in something
demanding like math</li>
<li>I need to put myself in a foreign culture</li>
</ol>
<p>
Putting these into practice, I have decided I'll move to Berlin for a few years.
The city makes itself a good place to be for me for a few reasons:
</p>
<ul class="org-ul">
<li>Practically, it is perhaps the easiest to immigrate to for an individual
Indian citizen, with a job in hand</li>
<li>It has a good hacker culture, something I've always wanted to experience but
have only ever read about</li>
<li>German culture seem like a great fit for my personal tastes</li>
<li>I get to learn a new language</li>
<li>German work culture is praised (on the Internet) for respecting boundaries and
giving a priority to life over money</li>
<li>If I ever decide to seek higher education (which is likely), German education
policies are good</li>
</ul>
<p>
Now that that is decided, what's left to figure out is how to go about it.
</p>
</div>
</div>
<div id="outline-container-org0d1ca57" class="outline-2">
<h2 id="org0d1ca57">Conclusion</h2>
<div class="outline-text-2" id="text-org0d1ca57">
<p>
After 6 months of voluntary unemployment, I am the same man I was before it.
Things I experienced and burdens I unburdened could be achieved by other means
as well. Perhaps I've sown seeds to make me a different person in future, but
they will take time to bloom. It is a guessing game, same as what might have
happened had I done it differently.
</p>
<p>
As for the journey to be where I already was, I'll do it again if I can.
</p>
</div>
</div>
Extending org-mode to handle youtube linkshttps://bitspook.in/blog/extending-org-mode-to-handle-youtube-links2022-09-26T00:00:00.000000ZCharanjit Singh2022-09-26T00:00:00.000000Z<p>
<iframe width="560" height="315" src="//youtube.com/embed/eaZUZCzaIgw" title="nil" frameborder="0" allowfullscreen=""></iframe>
</p>
<div id="outline-container-org8622c33" class="outline-2">
<h2 id="org8622c33">Requirement</h2>
<div class="outline-text-2" id="text-org8622c33">
<ol class="org-ol">
<li>I want to open youtube links in my notes in <code>mpv</code> instead of opening the
browser</li>
<li>When exporting to HTML, youtube links should become embedded videos instead
of hyperlinks</li>
</ol>
</div>
</div>
<div id="outline-container-org7ad6279" class="outline-2">
<h2 id="org7ad6279">Implementation</h2>
<div class="outline-text-2" id="text-org7ad6279">
<p>
Org has a concept of 'link types'. We can add a new type of link and have it
behave the way we want.
</p>
<ul class="org-ul">
<li><p>
<code>org-link-parameters</code>
</p>
<p>
This variable contains link types and how they behave on follow (i.e when
someone opens the link with <code>C-c C-o</code>), export etc. A type of a link is
determined by the string before first ":" in it. e.g "<a href="https://bitspook.in">https://bitspook.in</a>" has
<code>https</code> type, "<a href="file:///etc">file:///etc</a>" has <code>file</code> type.
</p>
<p>
Items in this list has 2 main components:
</p>
<ol class="org-ol">
<li>First element is string representing the link type</li>
<li>Key-value pairs of behavior name (e.g <code>:follow</code>, <code>:export</code>) and
function which handles that behavior</li>
</ol>
<p>
For example:
</p>
<div class="org-src-container">
<pre class="src src-elisp">((<span style="color: #6aaf50;">"yt"</span> <span style="color: #7f7dca;">:follow</span> spook-org--follow-yt-link <span style="color: #7f7dca;">:export</span> spook-org--export-yt-link)
(<span style="color: #6aaf50;">"eww"</span> <span style="color: #7f7dca;">:follow</span> org-eww-open <span style="color: #7f7dca;">:store</span> org-eww-store-link))
</pre>
</div></li>
<li><p>
<code>org-link-set-parameters</code>
</p>
<p>
This function is used to add new link-types (and also to add new behavior to
existing ones). You can check the docs for <code>org-link-parameters</code> (with <code>C-h v
org-link-parameters</code>) to see arguments provided to each type of callback.
</p></li>
</ul>
<p>
Here's the code I've added in <a href="https://github.com/bitspook/spookmax.d">my emacs config</a>:
</p>
<div class="org-src-container">
<pre class="src src-elisp">(<span style="color: #598bc1;">defun</span> <span style="color: #1d9a79;">spook-org--follow-yt-link</span> (path prefix)
(<span style="color: #598bc1;">let*</span> ((url (format <span style="color: #6aaf50;">"https:%s"</span> path))
(proc-name (format <span style="color: #6aaf50;">"*yt://%s*"</span> url)))
(<span style="color: #598bc1;">if</span> (<span style="color: #598bc1;">and</span> prefix (executable-find <span style="color: #6aaf50;">"mpv"</span>))
(browse-url url)
(make-process <span style="color: #7f7dca;">:name</span> proc-name <span style="color: #7f7dca;">:buffer</span> proc-name <span style="color: #7f7dca;">:command</span> `(<span style="color: #6aaf50;">"mpv"</span> ,url))
(message <span style="color: #6aaf50;">"Launched mpv in buffer: %s"</span> proc-name))))
(<span style="color: #598bc1;">defun</span> <span style="color: #1d9a79;">spook-org--export-yt-link</span> (path desc backend)
(<span style="color: #598bc1;">when</span> (eq backend 'html)
(<span style="color: #598bc1;">let*</span> ((video-id (cadar (url-parse-query-string path)))
(url (<span style="color: #598bc1;">if</span> (string-empty-p video-id) path
(format <span style="color: #6aaf50;">"//youtube.com/embed/%s"</span> video-id))))
(format
<span style="color: #6aaf50;">"<iframe width=\"560\" height=\"315\" src=\"%s\" title=\"%s\" frameborder=\"0\" allowfullscreen></iframe>"</span>
url desc))))
(org-link-set-parameters <span style="color: #6aaf50;">"yt"</span> <span style="color: #7f7dca;">:follow</span> #'spook-org--follow-yt-link <span style="color: #7f7dca;">:export</span> #'spook-org--export-yt-link)
</pre>
</div>
<p>
<code>make-process</code> will create a background buffer named <code>*yt://<url>*</code> which
allow monitoring and killing the mpv process.
</p>
<p>
<i>Update</i>: Use <code>make-process</code> instead of <code>async-shell-command</code> for launching mpv.
Thanks to <a href="https://www.reddit.com/r/emacs/comments/xls0ih/extending_orgmode_to_handle_youtube_links/iplpk57/">nv-elisp on /r/emacs</a>
</p>
</div>
</div>
<div id="outline-container-org3d90883" class="outline-2">
<h2 id="org3d90883">Result</h2>
<div class="outline-text-2" id="text-org3d90883">
<ol class="org-ol">
<li><code>C-c C-o</code> (i.e <code>org-open-at-point</code>) on a <code>yt://</code> link opens the youtube video
in mpv</li>
<li><code>C-u C-c C-o</code> (i.e <code>org-open-at-point</code> with an prefix argument) on a <code>yt://</code>
link opens the video in browser</li>
<li>When exported to HTML, all <code>yt://</code> links file are exported as embedded
youtube videos</li>
</ol>
</div>
</div>
<div id="outline-container-org7236c92" class="outline-2">
<h2 id="org7236c92">Bonus gains ๐ช</h2>
<div class="outline-text-2" id="text-org7236c92">
<p>
Recently I've been building a tool (<a href="https://github.com/bitspook/cl-ownpress">cl-ownpress</a>) which to make blogging a
zero-effort activity for me. Since I have already built a habit of judicious
note taking, publishing a subset of my notes will enable maintaining an active
blog without doing any "work".
</p>
<p>
I've also been making thickly-accented-awkardly-narrated youtube videos. These
are almost always <i>tldr;</i> videos for my blog posts. So they get embedded in my
blog posts.
</p>
<p>
'Blog with notes + embed youtube videos' become easier to do with this little
tinkering. Since <a href="https://github.com/bitspook/cl-ownpress">cl-ownpress</a> uses my running Emacs to publish my posts, I don't
need to make any change in my blogging setup. I can embed my <i>tldr;</i> videos in
my blog posts by just prefixing youtube links with <code>yt://</code> instead of
<code>https://</code>.
</p>
<p>
I am pretty happy that I got zero work blogging-setup, and zero work
extending-the-blogging-setup as well.
</p>
</div>
</div>
How I manage my passwordshttps://bitspook.in/blog/how-i-manage-my-passwords2022-09-19T00:00:00.000000ZCharanjit Singh2022-09-19T00:00:00.000000Z<iframe width="560" height="315" src="https://www.youtube.com/embed/faFJzaAjy0E" title="tldr; video" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe>
<div id="outline-container-orgc4540cd" class="outline-2">
<h2 id="orgc4540cd">My requirements</h2>
<div class="outline-text-2" id="text-orgc4540cd">
<ol class="org-ol">
<li><p>
<b>No third-parties</b>
</p>
<p>
I don't want to put my trust in any third party. Be it Google/Mozilla (via
saved passwords in browser), or some dedicated password manager like KeyPass.
</p></li>
<li><p>
<b>Simplicity</b>
</p>
<p>
Simple tools are easier to understand and bend to my will. It also means I'll
be able to intervene when something goes wrong.
</p></li>
<li><p>
<b>Composability</b>
</p>
<p>
I should be able to make the tool a part of my forever changing workflow. It
should play nice with presence/absence of other tools.
</p></li>
</ol>
</div>
</div>
<div id="outline-container-org30b3ee1" class="outline-2">
<h2 id="org30b3ee1">Tools I chose</h2>
<div class="outline-text-2" id="text-org30b3ee1">
<ol class="org-ol">
<li><p>
<a href="http://www.passwordstore.org/">Pass</a> - <i>The simple password manager</i>
</p>
<p>
I think it is as simple as it gets. A password-store in pass is a git repo
(so a directory) which contains gpg encrypted files. Each file represent one
set of credentials, and can contain all the plain-text, not just password and
username. E.g I often end up storing recovery codes for accounts in these.
</p>
<p>
There are no third-parties involved, encryption happens on my machine, and I
can store my password store anywhere I want (e.g a private git repo on
github).
</p>
<p>
Most pass operations are convenience wrappers on basic operations provided by
other tools; e.g <code>edit = decrypting a file + open it in an editor +
re-encrypting + git-commit</code>.
</p>
<p>
Pass has a whole ecosystem of tools written around it, which makes it an easy
choice considering how much work it saves me when integrating it in my
workflow.
</p></li>
<li><p>
<a href="https://github.com/carnager/rofi-pass">rofi-pass</a> - <i>Rofi-based UI for pass for desktop</i>
</p>
<p>
<a href="https://github.com/davatorium/rofi">Rofi</a> is a lightweight popup choice-selection UI, which has so far worked
out-of-the-box on all window-managers I have used. <i>rofi-pass</i> extends rofi
with:
</p>
<ol class="org-ol">
<li>Ability to search and select credentials stored in pass</li>
<li>Auto-fill credentials into any GUI app</li>
</ol></li>
<li><p>
<a href="https://github.com/bitspook/fireword">fireword</a> - <i>Converting easy-to-remember passwords to hard-to-crack ones</i>
</p>
<p>
Not all credentials need to be saved. Occasionally I need to create
<i>throwaway</i> accounts, for which I like to keep easy-to-guess (for me)
passwords. But I want even these password to be opaque (so analyzing them
wouldn't reveal a theme of my throwaway passwords).
</p>
<p>
Fireword is a small script I wrote many years ago which create insane
passwords from any string. Even a single change of character in a string
creates wildly different output. So instead of passing a plain easy-to-guess
password, I give them to fireword and use its output.
</p>
<p>
For example, <code>pass</code> becomes <code>5B72?[30:F</code> but <code>passs</code> is <code>3Ec012aD5(</code>.
</p></li>
<li><p>
<a href="https://github.com/android-password-store/Android-Password-Store#readme">Android Password Store</a> - Android app for accessing pass
</p>
<p>
Password store on android allows using the passwords I create/edit on my
desktop on my mobile and tablet. I use <a href="https://syncthing.net/">syncthing</a> to sync my password store to
my mobile devices.
</p></li>
</ol>
</div>
</div>
<div id="outline-container-org885f2bb" class="outline-2">
<h2 id="org885f2bb">Workflow</h2>
<div class="outline-text-2" id="text-org885f2bb">
</div>
<div id="outline-container-org97db652" class="outline-3">
<h3 id="org97db652">Add/edit/delete a password</h3>
<div class="outline-text-3" id="text-org97db652">
<p>
For all these operations, I use the <code>pass</code> cli. It is simple and intuitive, and
mostly just delegates to other Linux utilities. For example, deleting a password
for <i>my-acc</i> account in <i>example.com</i> is <code>pass rm example.com/my-acc</code>; and
deleting all accounts in <i>example.com</i> is <code>pass rm -r example.com</code>.
</p>
<video autoplay="" loop="">
<source src="/videos/how-i-manage-my-passwords/1--pass-cli.webm" type="video/webm">
</video>
<p>
I used to use <code>pass generate</code> for creating new passwords, which creates cryptic
hard (impossible?) to crack strings. Over time however, I have come to prefer
password phrases which are easy to type by hand. I pick 3-4 words that come to
my mind at a time, and make a loose sentence out of them to create a new
password. For example <code>libauvutilcelingfan</code>
</p>
</div>
</div>
<div id="outline-container-orgeae3d6f" class="outline-3">
<h3 id="orgeae3d6f">Using a password</h3>
<div class="outline-text-3" id="text-orgeae3d6f">
<p>
Using <code>pass</code> CLI for using a password gets tedious quickly. Using a password is
much more common than adding/editing/deleting one. So I use <i>rofi-pass</i>.
</p>
<p>
It gives me a nice prompt to search and select the credentials I want, and
autofills them. It is smart enough to recognize that credentials are more than
just a password; so if you edit your password file to look like:
</p>
<div class="org-src-container">
<pre class="src src-text">mypassword
user: myuser
some-other-key: some-val
</pre>
</div>
<p>
<i>rofi-pass</i> will allow you to select the key and auto-type its value. It
recognizes first line as the password, and a value with <code>user</code> key to autotype
both username and password in forms which ask for first username and then
password (on the same form).
</p>
<video autoplay="" loop="">
<source src="/videos/how-i-manage-my-passwords/2--using-rofi-pass.webm" type="video/webm">
</video>
</div>
</div>
<div id="outline-container-org2f20c29" class="outline-3">
<h3 id="org2f20c29">Throwaway passwords</h3>
<div class="outline-text-3" id="text-org2f20c29">
<p>
I don't "install" fireword since it is just a self-contained python script. But
because throwaway passwords, although temporary, tend to be entered frequently
(private browsing), I have created a small command in <a href="https://github.com/bitspook/stumpwm.d">my stumpwm configuration</a>
to make it easy.
</p>
<div class="org-src-container">
<pre class="src src-lisp">(<span style="color: #598bc1;">defvar</span> <span style="color: #b6b635;">spook/fireword-bin</span> <span style="color: #6aaf50;">"~/Documents/work/fireword/fireword"</span>)
(defcommand fireword (pass len)
((<span style="color: #7f7dca;">:password</span> <span style="color: #6aaf50;">"Password: "</span>)
(<span style="color: #7f7dca;">:password</span> <span style="color: #6aaf50;">"Length: "</span>))
(run-shell-command (format nil <span style="color: #6aaf50;">"~a ~a ~a | xclip -sel clip"</span> spook/fireword-bin pass len)))
(<span style="color: #598bc1;">define-key</span> *top-map* (kbd <span style="color: #6aaf50;">"s-P"</span>) <span style="color: #6aaf50;">"fireword"</span>)
</pre>
</div>
<p>
In the end I get a nice prompt on pressing <code>C-P</code> to enter my password and
desired length, get the fireword copied to clipboard which I then paste in a
private browser window.
</p>
<video autoplay="" loop="">
<source src="/videos/how-i-manage-my-passwords/3-using-fireword-with-stumpwm.webm" type="video/webm">
</video>
</div>
</div>
</div>
Using ELisp as an HTML templating enginehttps://bitspook.in/blog/using-elisp-as-an2022-04-08T00:00:00.000000ZCharanjit Singh2022-04-08T00:00:00.000000Z<p>
<iframe width="560" height="315" src="//www.youtube.com/embed/9Pcv5W1Gnvg" title="TLDR Video" frameborder="0" allowfullscreen=""></iframe>
</p>
<p>
HTML templating engines like <a href="https://jinja.palletsprojects.com/en/3.1.x/">Jinja</a> or <a href="https://handlebarsjs.com/">handlebars</a> are commonly used in web
development for weaving data into HTML.
</p>
<p>
For last couple of days, I've been porting <a href="https://github.com/bitspook/brandi">my Hakyll based static-site generator</a>
to <a href="https://github.com/bitspook/press.el">Emacs Lisp</a>, for a more fluent thought-publishing workflow. I found myself in
need of an HTML templating engine so I could convert data about my blog posts
and notes to HTML.
</p>
<p>
I found that we actually don't need an HTML templating engine to convert ELisp
to HTML. Emacs has built-in capability to work with HTML, we can piggy back on
that to get a templating engine without adding any new code.
</p>
<p>
We can represent DOM, which is a tree data-structure, as a lisp form
</p>
<p>
Consider following HTML element
</p>
<div class="org-src-container">
<pre class="src src-html"><<span style="color: #1d9a79;">div</span> <span style="color: #b6b635;">class</span>=<span style="color: #6aaf50;">"container"</span>>
<<span style="color: #1d9a79;">a</span> <span style="color: #b6b635;">href</span>=<span style="color: #6aaf50;">"https://google.com"</span>>Google</<span style="color: #1d9a79;">a</span>>
</<span style="color: #1d9a79;">div</span>>
</pre>
</div>
<p>
We can write it as a lisp form like this:
</p>
<div class="org-src-container">
<pre class="src src-elisp">'(div ((class . <span style="color: #6aaf50;">"container"</span>))
(a ((href . <span style="color: #6aaf50;">"https://google.com"</span>))
<span style="color: #6aaf50;">"Google"</span>))
</pre>
</div>
<p>
Note that this is a quoted lisp form. Which means this code isn't actually
executed, <code>div</code> or <code>a</code> aren't lisp functions. We can just put in any symbol
there, and it is treated as a DOM node.
</p>
<p>
<code>shr-dom-to-xml</code> converts this lisp form to an HTML string:
</p>
<div class="org-src-container">
<pre class="src src-elisp">(<span style="color: #598bc1;">let</span> ((my-url <span style="color: #6aaf50;">"https://google.com"</span>))
(shr-dom-to-xml
`(div ((class . <span style="color: #6aaf50;">"container"</span>))
(a ((href . ,my-url))
<span style="color: #6aaf50;">"Google"</span>))))
</pre>
</div>
<pre class="example">
<div class="container"> <a href="https://google.com">Google</a></div>
</pre>
<p>
In this example we changed the quote used to showcase how we can run arbitrary
lisp forms in our DOM to weave data into it.
</p>
<p>
You can check <a href="https://github.com/bitspook/press.el">my wip ELisp blogging setup</a> for more complex examples, and some
glue code I've written to make using ELisp as HTML templating engine easier.
</p>
เจจเจถเฉเฉเฉhttps://bitspook.in/poems/poem-nashedi2022-03-30T00:00:00.000000ZCharanjit Singh2022-03-30T00:00:00.000000Z<p>
เจฎเฉเจฐเฉ เจชเจฟเฉฐเจก เจฆเจพ เจจเจถเฉเฉเฉ เจเจฆ เจจเจฟเฉฑเจเจพ เจธเฉ,
</p>
<p>
เจเจนเจฆเจพ เจชเจฟเจ เจฎเจฐ เจเจฟเจ,
</p>
<p>
เจเจฐ เจฆเฉ เจเจฒเฉเจถ เจคเฉเจ เจคเฉฐเจ, เจธเจฒเฉเจพเจธ เจชเฉ เจเฉ,
</p>
<p>
เจเจชเจฃเฉเจเจ เจเฉเจเจพเจ เจเจชเจฃเฉ เจชเฉเฉฑเจค เจฆเฉ เจธเจฟเจนเจฐเฉ เจงเจฐ เจเจฟเจเฅค
</p>
<p>
เจชเจฟเฉฐเจก เจตเจพเจฒเจฟเจเจ เจฆเฉ เจฎเฉเจนเจฃเฉ เจธเจนเจฟเจฃเฉ เจเจฆ เจฎเฉเจฎเจเจฟเจจ เจจเจพ เจฐเจนเฉ,
</p>
<p>
เจคเจพเจ เจจเจถเฉเฉเฉ เจฆเฉ เจฎเจพเจ เจเจธเจจเฉเฉฐ เจตเฉเจนเฉเฉ เจตเจฟเฉฑเจ เจเฉเจขเจฆเฉ เจเฉฑเจก,
</p>
<p>
เจถเจพเจฏเจฆ เจเจชเจฃเฉ เจฒเฉเจฐเฉเจ เจฒเฉเจฐ เจนเฉเจ เจเจฎเจฐ เจจเฉเฉฐ เจธเจฎเฉเจเจฃ,
</p>
<p>
เจเจชเจฃเฉ เจงเฉ เจจเฉเฉฐ เจเฉเฉฑเจเฉ เจเฉเฉฑเจ, เจเจฐเฉเจ เจญเฉฑเจ เจเจเฅค
</p>
<p>
เจฐเฉเฉฐ เจเจฟเจนเฉ เจเจตเจพเจ เจจเฉเฉฐ เจนเจพเจฒเฉ เจฎเจค เจจเจนเฉเจ เจธเฉ,
</p>
<p>
เจเจฟ เจฎเจฐเจจเจพ เจเฉ เจนเฉเฉฐเจฆเจพ เจ,
</p>
<p>
เจเจฆเฉเจ เจขเจฟเฉฑเจก เจตเจฟเฉฑเจ เจชเฉเจเจฆเฉ เจตเจณ เจเจธเจจเฉเฉฐ เจเจน เจธเจฟเจเจพเจฃ เจฒเฉฑเจเฉ,
</p>
<p>
เจเจฟ เจเจพเจฌเฉ เจตเจฟเฉฑเจ เจชเจ เจฐเฉเจเฉ เจฎเฉเฉฑเจ เจตเฉ เจเจพเจเจฆเฉ เจเฅค
</p>
<p>
เจฎเฉเจฐเฉ เจชเจฟเฉฐเจก เจฆเจพ เจจเจถเฉเฉเฉ, เจเจ เจฎเฉเฉฑเจ เจซเฉเฉฑเจ เจเจฟเจนเจพ เจเจตเจพเจ เจ,
</p>
<p>
เจธเจฎเฉเจ เจฆเจพ เจนเจฒเฉเจฃเจฟเจ เจคเฉ เจฌเจเจฟเจเฉเจพเจ เจฆเจพ เจเฉเฉฐเจกเจฟเจ เจ,
</p>
<p>
เจชเจฟเฉฐเจก เจฆเฉ เจเจตเจพเจเจพเจ เจจเฉเฉฐ เฉเจนเจฟเจฐ เจตเฉเจ เจเฉ,
</p>
<p>
เจเจชเจฃเฉ เจนเฉฑเจกเฉเจเจ เจฆเฉ เจชเฉฐเจก เจชเจพเจณ เจฐเจฟเจนเจพ เจเฅค
</p>
<hr>
<p>
Drug problem in Punjab is real. But it isn't always the addict's own
doing. Sometimes, the society which love to hate them, is itself
responsible for the demise of entire families.
</p>
<p>
This poem tells the story of a young man I know of, who bears the brunt
of passionate hate from almost everyone in his village. From people who
saw his slow death over <b>years</b>, who are now angry that his <i>existence</i>
is corrupting their children.
</p>
I have quit my jobhttps://bitspook.in/blog/i-have-quit-my-job2022-03-24T00:00:00.000000ZCharanjit Singh2022-03-24T00:00:00.000000Z<p>
Several years ago, I decided to quit freelancing and do a day job. The
job would pay much less but I was struggling with mental health (ADHD).
On my therapist's suggestion, I decided to give the job thing a try. It
worked wonderfully, my struggles with discipline are a thing of past. Or
so I believe.
</p>
<p>
Once again, I have decided to take a drastic step. I have decided to
quit my day job. This is my last week at work, coming Monday I will be
unemployed.
</p>
<p>
I don't have a plan. I haven't planned to leave work permanently. I
don't have an ambition either, world changing or otherwise. This post is
me deciding to take a break from work and finding reasons for doing so,
after the fact.
</p>
<div id="outline-container-curiosity" class="outline-3">
<h3 id="curiosity">Curiosity</h3>
<div class="outline-text-3" id="text-curiosity">
<p>
It is exciting. The possibilities are endless. It is scary. Endless
possibilities means a lot of them lead to failure. Odds are stacked in
my favor in some regards; I am good at what I do, world will still need
good software engineers 6 months down the road. They are not so much in
my favor in some regards; precedence says I will fall into inaction and
misery, and achieve nothing. Complete nothing. I've almost always lost
in my struggles with ADHD in past. There is a good chance that I am
deluding myself into believing that this time will be any different.
</p>
<p>
I am curios of whether it is me who has finally tamed the beast, or if I
am going to need the structure a formal job as crutches.
</p>
</div>
</div>
<div id="outline-container-exhaustion" class="outline-3">
<h3 id="exhaustion">Exhaustion</h3>
<div class="outline-text-3" id="text-exhaustion">
<p>
I am sort of exhausted from making pragmatic decisions all the time.
Building software needs a delicate balance between what makes your
software technically good, and what makes it actually good. Actually
good software solve problems despite its own imperfections.
</p>
<p>
I want to spend some time making impractical decisions. I want to build
software which solve the problem of making me happy, or at least
entertained.
</p>
</div>
</div>
<div id="outline-container-heartbreak" class="outline-3">
<h3 id="heartbreak">Heartbreak</h3>
<div class="outline-text-3" id="text-heartbreak">
<p>
I joined my last company because I was sold on an idea. An idea of a
project which was solving a meaningful problem, and was challenging
enough to keep me engaged. I dedicated myself to that, gladly making
many sacrifices in my personal life. I got to build a team and lead it
with autonomy, we built a stolid product (actually, a part of it). And
then I was taken off that project, with what felt like without warning.
I accepted that decision because it was practical for the company.
</p>
<p>
But I was unprepared for the aftershock. It was traumatizing. With a
snap I was plucked out of one project, and added into another with the
expectation of establishing myself into a similar critical role. The
fact that I did it without a break didn't help. I could no longer find
that sense of belonging anymore, in this new project, or others that
came after.
</p>
<p>
Perhaps I am not suited for working in a services company with rapid
transitions. Perhaps I set my expectations wrong. Perhaps there was a
lapse in communication. Perhaps, I need to spend some time grieving.
Regardless, I need a break.
</p>
</div>
</div>
<div id="outline-container-self-growth" class="outline-3">
<h3 id="self-growth">Self growth</h3>
<div class="outline-text-3" id="text-self-growth">
<p>
As good a workplace as Trantor has been, I've been feeling stagnated for
a while. I have learned a lot outside of work, but work has started to
feel like work, which makes me miserable. Overlap between things I want
to learn and things which my job needs have been steadily and
increasingly decreasing.
</p>
<p>
Many of the things I want to learn need dedication which I can't afford
while working full-time as a software engineer. There is no off-switch,
I am always working; even when I am not sitting in front of a computer.
Things I want to learn need me 100% there.
</p>
</div>
</div>
<div id="outline-container-social-work" class="outline-3">
<h3 id="social-work">Social work</h3>
<div class="outline-text-3" id="text-social-work">
<p>
This is the most delusional of all the reasons I've cooked up. I imagine
building solutions to problems I see in my surroundings. For some
irrational reason, I feel a desire to give back to society. This is
perhaps narcissism finding its way around my reasoning, coloring itself
righteous. More logical would be to uproot myself and immigrate to a
place where people have already solved the basic problems of human
coexistence.
</p>
<p>
When I was in school I used to imagine how the school can be reformed,
in college it was the education system, as a freelance developer I
actually started acting on my imaginations and trying to improve my
local tech community. Several times. As an employee, I tried to uplift
my team (and imagined work reform, but never acted on it). Now, I
imagine solutions for many of the problems I see my village face. I am
curious if I will put them into action.
</p>
</div>
</div>
<div id="outline-container-what-lies-ahead" class="outline-2">
<h2 id="what-lies-ahead">What lies ahead?</h2>
<div class="outline-text-2" id="text-what-lies-ahead">
<p>
I don't know. There are too many things. There is a very good chance
that I am going to freeze in the face of choice, be miserable for a few
weeks, and get back to doing a day job. I am going to take time off for
as long as I feel like it, or run out of money. During this time I will
try to learn things and build software that bring me joy. Try to teach
myself how to focus more on the journey.
</p>
<p>
I've observed that many activities (including building software) can be
a meditative experience. If you can let go of the goals, you can quite
enjoy the act. Counter intuitively, the result is often much better. But
it is not always on time, which makes this a dangerous thing to do when
someone else is paying for my work. Perhaps the last bit is because I am
not yet well versed in it. This too might be a matter of finding a
balance. I'll explore.
</p>
</div>
</div>