<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="https://coffee-and-dreams.uk/feed.xml" rel="self" type="application/atom+xml" /><link href="https://coffee-and-dreams.uk/" rel="alternate" type="text/html" /><updated>2025-07-30T17:32:31+00:00</updated><id>https://coffee-and-dreams.uk/feed.xml</id><title type="html">Coffee and Dreams</title><subtitle>A sad weeb thinks things</subtitle><entry><title type="html">1 year of akkoma: a second retrospective</title><link href="https://coffee-and-dreams.uk/development/2023/07/24/1-year-of-akkoma.html" rel="alternate" type="text/html" title="1 year of akkoma: a second retrospective" /><published>2023-07-24T00:00:00+00:00</published><updated>2023-07-24T00:00:00+00:00</updated><id>https://coffee-and-dreams.uk/development/2023/07/24/1-year-of-akkoma</id><content type="html" xml:base="https://coffee-and-dreams.uk/development/2023/07/24/1-year-of-akkoma.html"><![CDATA[<p>I said i'd come back to this in a few months, and so i have. it has now been just over 1 year since i properly started releasing
akkoma - the <a href="https://meta.akkoma.dev/t/akkoma-stable-2022-07-the-curse-begins/29/3">first release</a> was 2022-07, so 2023-07 is as
good a time as any.</p>
<p>as last time, i am going to go over some of what went well, and what didn't go so well, to reflect upon and maybe try and improve in
the next 6 months.</p>
<p>also again, this is <em>intensely</em> personal so no bully</p>
<h1>things that went well</h1>
<h3>adoption is still going strong</h3>
<p>as twitter continues to die, we continue to prosper. server count is up to 530 at time of writing, comprising around 17,000 users.
not bad i think. very scary though. very scary. it makes me nervous.</p>
<p>however, instance turnover seems to have settled down as instances stake their claim and people stop migrating every 5 picoseconds.</p>
<h3>some more contributors appeared</h3>
<p>not many, but a few. some PRs from people i'd never heard of before. which is something. takes some of the weight off, which is very
nice. hopefully we can get a few properly involved and indoctrinated in the ways of AP so that everything doesn't just fall to like... me</p>
<h3>the landing page is doing well on google</h3>
<p>last time i did this i noted that getting the non-technical page up was a good thing - well, it's doing <em>really</em> well now; clicks to
that homepage are up to 600 a month - though the technical dev page is on 2000. not sure how to best redirect people across, but it's 100%
there in the results.</p>
<h3>stability seems to be improving</h3>
<p>IHBA is naturally rock-solid, but i have been reciving far fewer critical bug reports of late, which indicates that people aren't hitting
the database &quot;rot&quot; issue that used to exist. whether this is due to improvements in query design or whatever else, i am unsure, but i won't
complain.</p>
<h1>things that did not go so well</h1>
<h3>extremely poor communication around security issues</h3>
<p>when the media domain issue hit earlier in the year, nobody knew what was going on. nobody from any other project
said anything, and we have no good ties with any of them, so i had to mitigate based on second and third hand information,
and had to guess at details.</p>
<p>given that i'm pretty sure the shell of pleroma's team still hates me, and the <em>other</em> fork naturally does, i don't think
i could have mitigated this at the time. and now that our one close ally in foundkey has more or less died, that leaves
us exceptionally isolated.</p>
<p>hm.</p>
<h3>the big sad stalling development</h3>
<p>early in 2023 i hit another depressive episode which i'm only just sorta pulling myself out of the depths of. this
massively cut into my motivation to be doing <em>anything</em>, let alone thankless fedi dev work. as such, i... just didn't
do any. if it wasn't for a security issue in like may, i doubt i'd have looked at akkoma stuff at all in that time.</p>
<p>this is a really hard one to address since i struct out on my own, i am solely responsible for this project. but
i must also make sure i'm ok in and of myself. i know it may be dissapointing for many people to see not a lot of activity
on the project outside of maintenance, but... yeah i'm not quite sure what i'm supposed to say. sorry.</p>
<p>i think this ties into a wider theme of this project being <em>far</em> too broad for a single person to maintain alongside a fulltime
job. it's just not feasible. i'm going to have to either project that this <em>is</em> a hobby project and will have lower expectations,
or attempt to ignore the big sad. neither sound particularly good.</p>
<h3>scope creep from pleroma days still causing issues</h3>
<p>in the IRC we had a few people with very unusual setups, that proved really hard to assist in any meaningful way. this is
due to the fact that pleroma and hence akkoma has a thousand configuration switches and potential setups that make it
work any one of many different ways. this is hellish. just getting a user to coherently explain their setup and problem is tough enough,
but when they could have toggled any one of 219831 switches into any configuration?</p>
<p>we lost a few potential instances due to this. we should reduce option bloat.</p>
<h3>but also, not <em>enough</em> scope is also causing issues</h3>
<p>when reddit decided to commit ritual suicide, the lack of support for its AP-enabled replacement caused many people to be upset.
supporting it would increase the already horrifying size of transmogrifier, but not supporting it makes people sad.</p>
<p>aaa.</p>
<p>people keep asking for <em>more deployment methods</em>, which i am really hesitant about doing. i sorta want to reduce deployment methods to
a bare minimum due to how difficult it is to figure out issues on non-standard deployments...</p>
<h3>support is still extremely difficult</h3>
<p>there are too many users for me to manage. too many that are new to hosting software and need extra attention when providing support.
too many that x-y-problem us in IRC.</p>
<p>i find it extremely difficult to get to even half of them, and have to hope someone else does (which does sometimes happen) - i'm not sure
how to improve this in the slightest save for trying to recruit people.</p>
<h1>things to improve by the next time I do one of these (november)</h1>
<ul>
<li>reduce the number of potential options to reduce the support workload. this WILL upset people. i will probably tell you in nov that it has been hard to deal with that.</li>
<li>update the FAQ section of the documentation with common support questions</li>
<li>ensure pleroma-&gt;akkoma migration is still easy and possible</li>
<li>don't treat myself too badly for having the sadde episode</li>
<li>continue managing the influx of users, try and provide targeted support to those that won't burn me out too fast (that is, don't help with standard sysadmin stuff as much)</li>
<li>create a proper way for people to report security issues?</li>
</ul>]]></content><author><name></name></author><category term="development" /><summary type="html"><![CDATA[I said i'd come back to this in a few months, and so i have. it has now been just over 1 year since i properly started releasing akkoma - the first release was 2022-07, so 2023-07 is as good a time as any.]]></summary></entry><entry><title type="html">Akkoma Statement on Threads</title><link href="https://coffee-and-dreams.uk/development/2023/07/06/akkoma-statement-on-threads.html" rel="alternate" type="text/html" title="Akkoma Statement on Threads" /><published>2023-07-06T00:00:00+00:00</published><updated>2023-07-06T00:00:00+00:00</updated><id>https://coffee-and-dreams.uk/development/2023/07/06/akkoma-statement-on-threads</id><content type="html" xml:base="https://coffee-and-dreams.uk/development/2023/07/06/akkoma-statement-on-threads.html"><![CDATA[<p>The following is the official Akkoma statement on meta and threads:</p>
<p>cring</p>]]></content><author><name></name></author><category term="development" /><summary type="html"><![CDATA[The following is the official Akkoma statement on meta and threads:]]></summary></entry><entry><title type="html">6 months of akkoma: a retrospective</title><link href="https://coffee-and-dreams.uk/development/2022/11/18/6-months-of-akkoma.html" rel="alternate" type="text/html" title="6 months of akkoma: a retrospective" /><published>2022-11-18T00:00:00+00:00</published><updated>2022-11-18T00:00:00+00:00</updated><id>https://coffee-and-dreams.uk/development/2022/11/18/6-months-of-akkoma</id><content type="html" xml:base="https://coffee-and-dreams.uk/development/2022/11/18/6-months-of-akkoma.html"><![CDATA[<p>So, it's been about 6 months since akkoma went stable for the first time. well ok, a bit less, this week
marks the 4th anniversary since I started my instance (and probably like the 6th since I started using fedi). so it's basically
the 4th anniversary of what would become akkoma. that's as good a point to do this as any.</p>
<p>i thought this would make as good a time as any to have a little bit of a sit down and think about how it's gone,
and I am agile-brained at this point so I am using that as a template to try and organise my trademark
aimless rambling into something less wending and winding.</p>
<p>this will be very personal, so please no bulli, as they say.</p>
<h1>things that went well</h1>
<h3>getting a stable release out early</h3>
<p>i reckon a lot of the early momentum akkoma had would have been lost if i had waited with only a &quot;develop&quot; branch for too long.
even if <code>stable</code> is a mild misnomer in our case and is only truly a snapshot of development which i've had a feature freeze
on for a week or so to check nothing breaks horribly.</p>
<p>there <em>being</em> a stable release probably assured people far more that the project was ready for use than if i'd said &quot;just use
develop&quot; or something similar.</p>
<p>this leads directly into:</p>
<h3>the release cycle</h3>
<p>very early on i settled on a release cycle - the second saturday of the month would be stable day. this doesn't give a massive
amount of wiggle room for massive work to be done, but that is potentially a benefit here. it has forced me to think of how
i can improve the software given constraints, and made me avoid sinking my time into nice-to-haves that are far more difficult
to accomplish.</p>
<p>this has given the project a real rhythm that pleroma lack(s|ed), with steady improvement over the months that keeps people
involved with things rather than there being 3+ months of silence then a release out of nowhere. (or, like a year without a release in some cases).</p>
<h3>velocity (zoom zoom)</h3>
<p>say what you will about the benevolent-dictator-for-life model, it sure has made things go fast. whilst we're not in full &quot;move fast and break things&quot;
territory, experimental changes have made their way into the core software much quicker than they would have ever in pleroma, and later become
key features.</p>
<p>well, let's be honest here, the very first feature (custom emoji reactions) <em>was</em> an experimental change. so it's been the case since the start i suppose.</p>
<h3>infrastructure and idea-sharing with foundkey</h3>
<p>foundkey is a fork of misskey that shares a lot of the core values of akkoma. very early on we decided to share infrastructure
with them. this has led to some level of support overlap as well - both projects very quickly managed to fix federation issues
with the co-operation of everyone. it worked really quite well.</p>
<p>after the initial rush, there's also been idea sharing for the future of the fediverse (or, our part of it) so we can have
features in two pieces of software at once, to improve adoption.</p>
<h3>relations with other projects</h3>
<p>let's not sugar-coat things here, pleroma proper torched quite a few relationships with other projects - instances are known to block
pleroma instances on sight</p>
<p>akkoma's interactions with other projects are much less fraught, which is nice! there's even been some features leaking between them
(eugen taking the deepl/libretranslate option is cool (though it was partially yoinked from misskey) but it would have been nice to make the URL compatible :((((()</p>
<h3>getting new people involved with fedi dev</h3>
<p>fedi development is a demanding task - the more people that share it, the less the burden is. i was lucky in that
pretty early on, people from my corner of fedi started helping out doing bits and bobs. it really does help. plus nearly none  of them had
previous fedi dev experience, which means that the curse of activitypub can be spread to more people instead of remaining esoteric knowledge.</p>
<h1>things that didn't go quite so well</h1>
<h3>the initial conflict</h3>
<p>when I first forked, there were quite some tensions with the main pleroma dev group - although in retrospect i'm not quite sure why.
there was seemingly simultaneous calls to &quot;explain why&quot; i wanted to (and to &quot;collaborate&quot; with pleroma), but at the same time
utter dismissal of any grievance.</p>
<p>to my own discredit, i did not totally disengage from those arguments. i should have.</p>
<p>these days the conflict has entirely disappeared. well, either that or i've blocked the main instigator. either/or honestly. the vibes
have improved immeasurably by now. there may be things i do not see (because they're over in the corner of fedi i pretend does not exist),
but it's far better than it was.</p>
<h3>handling my expectations</h3>
<p>back in <a href="/development/2022/06/24/akkoma.html#you-sure-you-can-manage-this">my original post</a>, i did raise the question of if i could manage this.
i thought i could, but i severely underestimated just how much pressure maintaining something like this puts you under. it was ok at first,
but as the install base grew (and <em>especially</em> during the twitter migration) the stress really started to get to me.</p>
<p>i caught myself responding far more confrontationally than was in any way called for. this is something i need to work on. i must remember
that i am but one person, and holding both a full-time job <em>and</em> maintainership is going to push me harder than i usually would be.</p>
<h3>handling users' expectations</h3>
<p>i never planned for akkoma to be as... popular as it has become (then again, who plans for this?). it was only really ever for instances i personally knew that had issues with pleroma. i tailored the features for our particular use case, which has proven to be controvertial in some isolated instances.</p>
<p>chat removal in particular has caused some sparks - nobody in our fedi bubble ever used them, and they were overly complex. hence, i removed them.</p>
<p>i should have made it more clear earlier on quite what akkoma was so that new people can tell how we differ from pleroma. i have since added
to the readme to tell people that akkoma is not one-for-one with pleroma, but time will tell if that will be enough.</p>
<h3>not getting a non-technical landing page up sooner</h3>
<p>this is very related to the above. i never expected akkoma to spread beyond the confines of my corner of fedi. hence when it did and people messaged like &quot;what even is this?&quot;,
i had no prepared response. there was no way i could explain the concept of the fediverse and all of that to each person. i should have set up a proper
landing page earlier and not expected only technically-capable people to find the project.</p>
<h3>conflation of the personal and the project</h3>
<p>from the start this project was &quot;i personally am going to do pleroma but with blackjack and anime music&quot; - this led to the lines between &quot;maintainer!me&quot;
and &quot;personal!me&quot; blurring. whilst this wasn't a problem early on, as the userbase has grown, the number of people personally asking for support has grown,
and i am ill-equipped to handle that level of interaction</p>
<p>this is something i'm really unusure how to handle, how do i keep my personal life and my &quot;public&quot; maintainer life seperate? is it possible?</p>
<h1>things to improve by the next time I do one of these (next quarter?)</h1>
<ul>
<li>documentation: whilst docs are ever-improving, they're still a far cry from what might be wanted.</li>
<li>tighter integration of communications channels, instead of information being spread across the dev account, meta and gitea, we should try to unify comms</li>
<li>releases, and more specifically specifying what is and is not supported. we do not have the devs available to act as first-line support to every possible installation
<ul>
<li>maybe look into OS packaging. though i doubt we have the dev capacity to handle it</li>
</ul>
</li>
<li>funding; hosting is insanely expensive, and given the ever-increasing costs in real life, i'm not sure how long i can continue justifying hosting costs for everything</li>
<li>definitions; even futher hammer home exactly what akkoma is meant for</li>
</ul>]]></content><author><name></name></author><category term="development" /><summary type="html"><![CDATA[So, it's been about 6 months since akkoma went stable for the first time. well ok, a bit less, this week marks the 4th anniversary since I started my instance (and probably like the 6th since I started using fedi). so it's basically the 4th anniversary of what would become akkoma. that's as good a point to do this as any.]]></summary></entry><entry><title type="html">Akkoma: A vision to refocus Pleroma</title><link href="https://coffee-and-dreams.uk/development/2022/06/24/akkoma.html" rel="alternate" type="text/html" title="Akkoma: A vision to refocus Pleroma" /><published>2022-06-24T00:00:00+00:00</published><updated>2022-06-24T00:00:00+00:00</updated><id>https://coffee-and-dreams.uk/development/2022/06/24/akkoma</id><content type="html" xml:base="https://coffee-and-dreams.uk/development/2022/06/24/akkoma.html"><![CDATA[<p>I figure I should probably put developments of the past two weeks or
so into a more formal format - I tend to be rather too keen on the &quot;doing&quot;
but lax on the telling, so let's fix that shall we?</p>
<p>This post will attempt to lay out why this &quot;Akkoma&quot; has become a thing,
what it intends to do, and why you should care.</p>
<p>But first let's get an obvious question out of the way - &quot;What is with that
name?&quot;. Back when the Pleroma developer split happened (more on that later),
I started referring to my instance's version of pleroma as a fork, half-jokingly.
One of the most popular emoji sets on the instance is the Akko set:</p>
<p><img src="/images/akko.jpg" alt="akko emoji" /></p>
<p>so I figured &quot;yea it's pleroma with more :akko:&quot;. And I'm not changing the
name now because I suck at naming and people know what it is now.</p>
<h3>What even is Akkoma?</h3>
<p>Akkoma is a mostly hard fork of Pleroma, with an intent to focus the
massive blob of software into something with some actual identity.</p>
<p>Pleroma started out trying to be a small and efficient microblogging platform
that could be hosted just about anywhere, but after many years of actually
being used, it has slowly grown into something that isn't any significantly
lighter than misskey or even mastodon. All this whilst trying to cater to
every possible use-case, which has led to it being a jack of all trades,
not particularly good at anything, but it can do most things ok-ish.</p>
<p>We can't reclaim that lost ground, so Akkoma is a fork that embraces that and
tries to find something to do <em>well</em>. More on that later.</p>
<h3>Why fork Pleroma in the first place?</h3>
<p>As many of you will be aware, back in 01/2022, there was something of a
schism in the smallish group of Pleroma developers with no single cause in
my eyes - it was the culmination of years of mounting tensions between two
competing interest groups. Pleroma has ever been an uneasy alliance between
&quot;free speech&quot; people and free software people, and as the project's creator
aligned more with the former group over time, it was only really a matter
of time before something acted as a catalyst to break the alliance.</p>
<p>I shan't elaborate too much on that schism here, but the catalyst was one
developer who both aligned with the &quot;free speech&quot; group and refused to
treat other developers with any sort of respect (whilst being a generally
unpleasant person to boot) - this broke the developer group in two and
spawned the short-lived &quot;newroma&quot; (see, at least I'm not <em>that</em> bad at naming).</p>
<p>This fork never established any actual governance structure, and nobody
took responsibility for it. Being led by a committee led to it having
absolutely no vision, nor direction. Newroma died shortly after its inception.</p>
<p>Most of the developers that split off in the fork then went back to Pleroma,
after a band-aid fix from the almost-never-present project creator.</p>
<p>I do not believe they have meaningfully reformed <em>anything</em> since the schism,
and it's naught but a power vacuum waiting for someone to take up the mantle
of maintainer again - given the track record of the above, I do not trust that
whoever ends up winning that power struggle will be someone I wish to side with.</p>
<p>Thus, I'm doing it myself. With blackjack and anime music.</p>
<h3>Where do you intend for this project to go?</h3>
<p>This is one of the most important questions you can possibly ask any new
project.</p>
<p>My aim is to refocus pleroma. To give it an identity - a niche - not covered
adequately by mastodon or Misskey.</p>
<p>This identity will be defined by focusing on user experience and expression as a first
priority. I have watched in the past 3-4 years as a culture of personal
expression established itself in the area of the Fediverse I live in, as
custom emoji gained more prominence, as people moved to Misskey to gain
access to customization, styling via MFM, and emoji reactions.</p>
<p>This has shown that people really care about how they express themselves on
this federated network of ours - but a lot of this has been added via
unofficial add-ons (absturztaube's mod loader, that one Misskey signature mod)
or poorly-thought-out additions to AP (the <code>isCat</code> Actor property).
It's time to embrace this officially and go all-in on allowing the customization of user experience.</p>
<p>To that end, my short-term roadmap for Akkoma includes things like user roles
inspired by mastodon to allow for standard users to, say, modify the instance's
emoji to get what they want without asking the admin, and allowing any number
of frontends to let instance admins give the widest possible range of options to their users, and so on.</p>
<p>I will also be changing a few of the axioms pleroma was initially developed with -
no longer are we to assume that instances are small or single-user, instead each instance
is a community in its own right, and deserves to be able to put itself across as such.</p>
<p>So yeah. It may not be the most defined direction as yet, but it's
somewhere to start walking towards. Better than newroma ever had, that's
for sure.</p>
<h3>Where do I get involved?</h3>
<p><a href="https://akkoma.dev">akkoma.dev</a></p>
<p>Submit patches, raise issues, whatever you want. Unlike the actual pleroma
maintainers I'm actually somewhat responsive. You won't erode into a skeleton
by the time your PR is looked at is what I'm saying.</p>
<h3>You sure you can manage this?</h3>
<p>I'll give it my best shot. If I don't, I'll be admitting defeat and having
to walk back into the arms of the &quot;free speech&quot; gang. That's some motivation
to succeed if ever I've seen any.</p>
<p>AKKOMA GANG AKKOMA GANG</p>]]></content><author><name></name></author><category term="development" /><summary type="html"><![CDATA[I figure I should probably put developments of the past two weeks or so into a more formal format - I tend to be rather too keen on the &quot;doing&quot; but lax on the telling, so let's fix that shall we? This post will attempt to lay out why this &quot;Akkoma&quot; has become a thing, what it intends to do, and why you should care. But first let's get an obvious question out of the way - &quot;What is with that name?&quot;. Back when the Pleroma developer split happened (more on that later), I started referring to my instance's version of pleroma as a fork, half-jokingly. One of the most popular emoji sets on the instance is the Akko set: so I figured &quot;yea it's pleroma with more :akko:&quot;. And I'm not changing the name now because I suck at naming and people know what it is now. What even is Akkoma? Akkoma is a mostly hard fork of Pleroma, with an intent to focus the massive blob of software into something with some actual identity. Pleroma started out trying to be a small and efficient microblogging platform that could be hosted just about anywhere, but after many years of actually being used, it has slowly grown into something that isn't any significantly lighter than misskey or even mastodon. All this whilst trying to cater to every possible use-case, which has led to it being a jack of all trades, not particularly good at anything, but it can do most things ok-ish. We can't reclaim that lost ground, so Akkoma is a fork that embraces that and tries to find something to do well. More on that later. Why fork Pleroma in the first place? As many of you will be aware, back in 01/2022, there was something of a schism in the smallish group of Pleroma developers with no single cause in my eyes - it was the culmination of years of mounting tensions between two competing interest groups. Pleroma has ever been an uneasy alliance between &quot;free speech&quot; people and free software people, and as the project's creator aligned more with the former group over time, it was only really a matter of time before something acted as a catalyst to break the alliance. I shan't elaborate too much on that schism here, but the catalyst was one developer who both aligned with the &quot;free speech&quot; group and refused to treat other developers with any sort of respect (whilst being a generally unpleasant person to boot) - this broke the developer group in two and spawned the short-lived &quot;newroma&quot; (see, at least I'm not that bad at naming). This fork never established any actual governance structure, and nobody took responsibility for it. Being led by a committee led to it having absolutely no vision, nor direction. Newroma died shortly after its inception. Most of the developers that split off in the fork then went back to Pleroma, after a band-aid fix from the almost-never-present project creator. I do not believe they have meaningfully reformed anything since the schism, and it's naught but a power vacuum waiting for someone to take up the mantle of maintainer again - given the track record of the above, I do not trust that whoever ends up winning that power struggle will be someone I wish to side with. Thus, I'm doing it myself. With blackjack and anime music. Where do you intend for this project to go? This is one of the most important questions you can possibly ask any new project. My aim is to refocus pleroma. To give it an identity - a niche - not covered adequately by mastodon or Misskey. This identity will be defined by focusing on user experience and expression as a first priority. I have watched in the past 3-4 years as a culture of personal expression established itself in the area of the Fediverse I live in, as custom emoji gained more prominence, as people moved to Misskey to gain access to customization, styling via MFM, and emoji reactions. This has shown that people really care about how they express themselves on this federated network of ours - but a lot of this has been added via unofficial add-ons (absturztaube's mod loader, that one Misskey signature mod) or poorly-thought-out additions to AP (the isCat Actor property). It's time to embrace this officially and go all-in on allowing the customization of user experience. To that end, my short-term roadmap for Akkoma includes things like user roles inspired by mastodon to allow for standard users to, say, modify the instance's emoji to get what they want without asking the admin, and allowing any number of frontends to let instance admins give the widest possible range of options to their users, and so on. I will also be changing a few of the axioms pleroma was initially developed with - no longer are we to assume that instances are small or single-user, instead each instance is a community in its own right, and deserves to be able to put itself across as such. So yeah. It may not be the most defined direction as yet, but it's somewhere to start walking towards. Better than newroma ever had, that's for sure. Where do I get involved? akkoma.dev Submit patches, raise issues, whatever you want. Unlike the actual pleroma maintainers I'm actually somewhat responsive. You won't erode into a skeleton by the time your PR is looked at is what I'm saying. You sure you can manage this? I'll give it my best shot. If I don't, I'll be admitting defeat and having to walk back into the arms of the &quot;free speech&quot; gang. That's some motivation to succeed if ever I've seen any. AKKOMA GANG AKKOMA GANG]]></summary></entry><entry><title type="html">Adding Elasticsearch Integration to Pleroma</title><link href="https://coffee-and-dreams.uk/tutorials/2021/12/15/integrating-elasticsearch-with-pleroma.html" rel="alternate" type="text/html" title="Adding Elasticsearch Integration to Pleroma" /><published>2021-12-15T00:00:00+00:00</published><updated>2021-12-15T00:00:00+00:00</updated><id>https://coffee-and-dreams.uk/tutorials/2021/12/15/integrating-elasticsearch-with-pleroma</id><content type="html" xml:base="https://coffee-and-dreams.uk/tutorials/2021/12/15/integrating-elasticsearch-with-pleroma.html"><![CDATA[<h2>If you've moved to Akkoma, this guide is <strong>OUTDATED</strong>, refer to <a href="https://docs.akkoma.dev/main/backend/configuration/search/">the Akkoma docs</a> if you still want to do this</h2>
<p>Pleroma search sucks. Let's face it, it sucks. Searching through an entire
postgres table for matches isn't exactly efficient, and it's common that absolutely
nothing relevent is returned by your query.</p>
<p>So I, being very cool and also the best, have fixed this. For adequately low
values of &quot;fixed&quot;. Basically my solution is to shove activities, users and hashtags
into elasticsearch indices and using the extremely good search provided therein.</p>
<p>It works nicely, it's about 3-4s to search all indices and handles just about everything
you'd want. Less specific queries can take a few seconds more, but they time out after 5s
so it's not the end of the world.</p>
<p>So it is time to walk you through how to set it up. This will require no previous ES knowledge.</p>
<p><img src="/images/elastic/user-search.png" alt="user search" /></p>
<p><strong>WARNING</strong>: Only do this if you are technically competent and don't mind potentially resolving merge conflicts down the line.</p>
<p>You will need:</p>
<ul>
<li>Pleroma from source (OTP will not work)</li>
<li>A VPS</li>
<li>An elasticsearch installation (it's probably in your distro's repo, else see <a href="https://www.elastic.co/downloads/elasticsearch">here</a>)</li>
</ul>
<p>First, please sweet jesus apply a password to your ES. Find your <code>elasticsearch.yml</code> (probably in <code>/etc/elasticsearch</code>) and add:</p>
<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code data-lang="yaml"><span class="na">network.host</span><span class="pi">:</span> <span class="s">127.0.0.1</span>
<span class="na">http.host</span><span class="pi">:</span> <span class="s">127.0.0.1</span>
<span class="na">xpack.security.enabled</span><span class="pi">:</span> <span class="kc">true</span>
</code></pre></div></div>
<p>Then run <code>elasticsearch-setup-passwords</code> (probably in <code>/usr/share/elasticsearch/bin</code>) to set your passwords.</p>
<p>Check that ES is running with <code>curl -u username:password http://localhost:9200/</code></p>
<p>Now we can get down to the complex stuff.</p>
<p>We'll need to add my personal git as a remote so you can merge my branch. There's <a href="https://git.ihatebeinga.live/IHBAGang/pleroma/pulls/2/files">a PR open on the repository</a>
showing the changes against mainline's develop just so you can be sure I'm not backdooring you or anything.</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code data-lang="bash"><span class="nb">cd</span> /path/to/peroma
git remote add elastic-fork https://git.ihatebeinga.live/IHBAGang/pleroma.git
git fetch elastic-fork
git merge elastic-fork/feature/elasticsearch
</code></pre></div></div>
<p>This has now added my changes, hooray. Now we need to configure it.</p>
<p>In config/prod.secret.exs:</p>
<div class="language-elixir highlighter-rouge"><div class="highlight"><pre class="highlight"><code data-lang="elixir"><span class="n">config</span> <span class="ss">:pleroma</span><span class="p">,</span> <span class="ss">:search</span><span class="p">,</span> <span class="ss">provider:</span> <span class="no">Pleroma</span><span class="o">.</span><span class="no">Search</span><span class="o">.</span><span class="no">Elasticsearch</span>
<span class="n">config</span> <span class="ss">:pleroma</span><span class="p">,</span> <span class="ss">:elasticsearch</span><span class="p">,</span> <span class="ss">url:</span> <span class="s2">"http://localhost:9200"</span>

<span class="n">config</span> <span class="ss">:elastix</span><span class="p">,</span>
  <span class="ss">shield:</span> <span class="no">true</span><span class="p">,</span>
  <span class="ss">username:</span> <span class="s2">"my-user"</span><span class="p">,</span>
  <span class="ss">password:</span> <span class="s2">"my-password"</span>
</code></pre></div></div>
<p>Change the URL, username and password as requried.</p>
<p>Now we need to create some indices. This isn't strictly neccesary but we're going to.</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code data-lang="bash">curl <span class="nt">-XPUT</span> http://localhost:9200/activities/ <span class="nt">-u</span> username:password
curl <span class="nt">-XPUT</span> http://localhost:9200/activities/activity/_mapping<span class="se">\?</span>include_type_name <span class="nt">--data-binary</span> @priv/es-mappings/activity.json <span class="nt">-H</span> <span class="s2">"Content-Type: application/json"</span> <span class="nt">-u</span> username:password

curl <span class="nt">-XPUT</span> http://localhost:9200/users/ <span class="nt">-u</span> username:password
curl <span class="nt">-XPUT</span> http://localhost:9200/users/user/_mapping<span class="se">\?</span>include_type_name <span class="nt">--data-binary</span> @priv/es-mappings/user.json <span class="nt">-H</span> <span class="s2">"Content-Type: application/json"</span> <span class="nt">-u</span> username:password

curl <span class="nt">-XPUT</span> http://localhost:9200/hashtags/ <span class="nt">-u</span> username:password
curl <span class="nt">-XPUT</span> http://localhost:9200/hashtags/hashtag/_mapping<span class="se">\?</span>include_type_name <span class="nt">--data-binary</span> @priv/es-mappings/hashtag.json <span class="nt">-H</span> <span class="s2">"Content-Type: application/json"</span> <span class="nt">-u</span> username:password
</code></pre></div></div>
<p>Cool. Nice. Ok data time. This will take a while.</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code data-lang="bash"><span class="nb">export </span><span class="nv">MIX_ENV</span><span class="o">=</span>prod
mix deps.get
mix compile
mix pleroma.search import activities
mix pleroma.search import <span class="nb">users
</span>mix pleroma.search import hashtags
</code></pre></div></div>
<p>This will import all old data from your postgres db into our indices.</p>
<p>You can keep track of your progress by running</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code data-lang="bash">curl http://localhost:9200/activities/_count <span class="nt">-u</span> username:password
curl http://localhost:9200/users/_count <span class="nt">-u</span> username:password
curl http://localhost:9200/hashtags/_count <span class="nt">-u</span> username:password
</code></pre></div></div>
<p>Now in theory you should be able to reboot your instance and have good, fast search.</p>
<p>Hooray.</p>
<h2>Extra Info</h2>
<p><img src="/images/elastic/parser.png" alt="parser" /></p>
<p>Supported filters:</p>
<ul>
<li><code>hashtag:#someTag</code> or <code>hashtag:someTag</code></li>
<li><code>user:someUsername</code></li>
<li><code>instance:someinstance.net</code></li>
</ul>
<p>Also supports <code>&quot;quoted terms&quot;</code> and <code>just random terms</code></p>]]></content><author><name></name></author><category term="tutorials" /><summary type="html"><![CDATA[If you've moved to Akkoma, this guide is OUTDATED, refer to the Akkoma docs if you still want to do this Pleroma search sucks. Let's face it, it sucks. Searching through an entire postgres table for matches isn't exactly efficient, and it's common that absolutely nothing relevent is returned by your query. So I, being very cool and also the best, have fixed this. For adequately low values of &quot;fixed&quot;. Basically my solution is to shove activities, users and hashtags into elasticsearch indices and using the extremely good search provided therein. It works nicely, it's about 3-4s to search all indices and handles just about everything you'd want. Less specific queries can take a few seconds more, but they time out after 5s so it's not the end of the world. So it is time to walk you through how to set it up. This will require no previous ES knowledge. WARNING: Only do this if you are technically competent and don't mind potentially resolving merge conflicts down the line. You will need: Pleroma from source (OTP will not work) A VPS An elasticsearch installation (it's probably in your distro's repo, else see here) First, please sweet jesus apply a password to your ES. Find your elasticsearch.yml (probably in /etc/elasticsearch) and add: network.host: 127.0.0.1 http.host: 127.0.0.1 xpack.security.enabled: true Then run elasticsearch-setup-passwords (probably in /usr/share/elasticsearch/bin) to set your passwords. Check that ES is running with curl -u username:password http://localhost:9200/ Now we can get down to the complex stuff. We'll need to add my personal git as a remote so you can merge my branch. There's a PR open on the repository showing the changes against mainline's develop just so you can be sure I'm not backdooring you or anything. cd /path/to/peroma git remote add elastic-fork https://git.ihatebeinga.live/IHBAGang/pleroma.git git fetch elastic-fork git merge elastic-fork/feature/elasticsearch This has now added my changes, hooray. Now we need to configure it. In config/prod.secret.exs: config :pleroma, :search, provider: Pleroma.Search.Elasticsearch config :pleroma, :elasticsearch, url: "http://localhost:9200" config :elastix, shield: true, username: "my-user", password: "my-password" Change the URL, username and password as requried. Now we need to create some indices. This isn't strictly neccesary but we're going to. curl -XPUT http://localhost:9200/activities/ -u username:password curl -XPUT http://localhost:9200/activities/activity/_mapping\?include_type_name --data-binary @priv/es-mappings/activity.json -H "Content-Type: application/json" -u username:password curl -XPUT http://localhost:9200/users/ -u username:password curl -XPUT http://localhost:9200/users/user/_mapping\?include_type_name --data-binary @priv/es-mappings/user.json -H "Content-Type: application/json" -u username:password curl -XPUT http://localhost:9200/hashtags/ -u username:password curl -XPUT http://localhost:9200/hashtags/hashtag/_mapping\?include_type_name --data-binary @priv/es-mappings/hashtag.json -H "Content-Type: application/json" -u username:password Cool. Nice. Ok data time. This will take a while. export MIX_ENV=prod mix deps.get mix compile mix pleroma.search import activities mix pleroma.search import users mix pleroma.search import hashtags This will import all old data from your postgres db into our indices. You can keep track of your progress by running curl http://localhost:9200/activities/_count -u username:password curl http://localhost:9200/users/_count -u username:password curl http://localhost:9200/hashtags/_count -u username:password Now in theory you should be able to reboot your instance and have good, fast search. Hooray. Extra Info Supported filters: hashtag:#someTag or hashtag:someTag user:someUsername instance:someinstance.net Also supports &quot;quoted terms&quot; and just random terms]]></summary></entry><entry><title type="html">The disconnect between The Outer Wilds’ mechanics and its story</title><link href="https://coffee-and-dreams.uk/rambling/2021/02/07/outer-wilds.html" rel="alternate" type="text/html" title="The disconnect between The Outer Wilds’ mechanics and its story" /><published>2021-02-07T00:00:00+00:00</published><updated>2021-02-07T00:00:00+00:00</updated><id>https://coffee-and-dreams.uk/rambling/2021/02/07/outer-wilds</id><content type="html" xml:base="https://coffee-and-dreams.uk/rambling/2021/02/07/outer-wilds.html"><![CDATA[<p>I finished the outer wilds earlier today, and... I'll admit, it didn't have too much of an impact on me.
I sorta want to write about it in the hopes of figuring out why.</p>
<p>Once again, this is super raw, don't expect coherency or anything, it's just my thoughts written as-is.</p>
<p>Same warning as last time, spoilers abound.</p>
<p>So, mechnically, the outer wilds consists of 3 gameplay loops</p>
<ul>
<li>Primary - Fly and explore old structures</li>
<li>Secondary - Figure out the reasons for the structures' existence</li>
<li>Tirtiary - Put together fragments of information from the secondary loop to get a big picture of the situation</li>
</ul>
<p>Ultimately, you fly around in the footsteps (or... rocket-exhausts?) of a long-gone civislisation, the Nomai, trying to piece
together their knoweldge about the so-called &quot;eye of the universe&quot;, the rules of the in-game universe, and
just why you keep dying every 22 minutes.</p>
<p>So, it's a logic game, essentially. The player can reason that given mechanic X applied to situation Y, the game should
react to provide outcome Z. Your entire time spent in the game is gathering these rules. Given the sun has gone supernova,
the power will be used to send a backup of your memories 22 minutes back in time (a la steins;gate but with fewer anime references),
and you start again.</p>
<p>The culmination of the game is to put together that given a new warp core and the co-ordinates found by the probe, you can reach the
eye of the universe, as the Nomai were trying to do before they all died. Ok, so that's something we can work with. You need the warp core
from the time leap machine, so there's no hope of a do-over should you fail. That's some super good narrative tension from just the mechanics
of the game playing out with absolutely no outside influence - the player does not need to be told the stakes. They can be inferred from what
they already know.</p>
<p>But just to hammer it home, a special reprise of <a href="https://www.youtube.com/watch?v=XfB91VCpoqc">the song that plays at the end of every loop</a>
plays on this final, all-or-nothing run. And <em>this</em> is where the game shines at its brightest. When the player has all the information,
and one final question that must be answered. One final Z. Given a conscious being in the eye of the universe, what happens?</p>
<p>You fly out to the most terrifying area of the game, knowing full well that you can't try again, dodge the fish, get to the ship. The music
swells. You made it. You insert the warp core, input the co-ordinates, switch on the warp drive. And then the game falls apart.</p>
<p>Instead of providing you with the one final answer that would tie together everything that came before, you get an abstract sequence in which
unexplainable things happen. Starting on a quantum rock, you jump into the eye of the universe, and all goes black. You're transported to a
forest and watch... i suppose the universe dying. Ok, all thematically relevent and cool. Then you have to... uh... find the other travellers' instruments in
the forest? What? What do their instruments have to do with anything? Whilst music has been a rather central motif throughout, it hasn't been used for more than
signals (both of the communication kind via the nomai and the signals given by the travellers). Why do we have to do this now? Why is there a jump scare with
a fish? Why is any of this here? This is raising more questions than answers. WHY ARE THERE SKELETONS!? None of it seems to make sense. You alone came to this place,
you alone have paved the way for whatever comes next. Why are these people here? One of them is schrodinger'd already somewhere else. They weren't even particularly
large characters in the story.</p>
<p>I think it boils down to &quot;why should an ending I have put together all the information to find be superseded by some randoms who didn't even know the supernova
was going to happen (save for one)? Yeah play your song, you didn't do any of this. Let me find out why I came here.</p>
<p>Then something explodes and it all starts again I suppose.</p>
<p>Bleh.</p>
<p>99% of this game was wonderfully executed, the end... doesn't fit. It's like a gainax ending. But it doesn't make sense thematically.</p>
<p>(leaving this image here as a brag for I AM THE GOD OF SPACE)</p>
<p><img src="/images/god-of-space.png" alt="god-of-soace" /></p>]]></content><author><name></name></author><category term="rambling" /><summary type="html"><![CDATA[I finished the outer wilds earlier today, and... I'll admit, it didn't have too much of an impact on me. I sorta want to write about it in the hopes of figuring out why.]]></summary></entry><entry><title type="html">Thoughts on Disco Elysium</title><link href="https://coffee-and-dreams.uk/rambling/2021/01/31/disco-elysium.html" rel="alternate" type="text/html" title="Thoughts on Disco Elysium" /><published>2021-01-31T00:00:00+00:00</published><updated>2021-01-31T00:00:00+00:00</updated><id>https://coffee-and-dreams.uk/rambling/2021/01/31/disco-elysium</id><content type="html" xml:base="https://coffee-and-dreams.uk/rambling/2021/01/31/disco-elysium.html"><![CDATA[<p>So, I finished Disco Elysium earlier today. I'm currently very exhausted
due in part to laying awake the past few nights thinking about it.
I don't know why but something sorta hooked me. But the thing is, I don't even
know if I... you know, &quot;enjoyed&quot; it or what.</p>
<p>So in some sort of weird attempt to figure things out I'm going to let myself
type and see what happens. I will likely spoil any and all plot points throughout,
so you know. Fair warning.</p>
<p>So we open with your character's brain shouting things at him in the most over-the-top
manner possible. I hate limbic system's voice so much. Yeah yeah something something let's
get this show on the road.</p>
<p>Your first few days are spent in what I can only term extreme exposition mode. I think
this may be part of what hooked me - I have a tendency to be sniped by many many facts
and have to sort them all internally before I can shut off - this game has absolutely no lack
of little factlets. I chose the &quot;thinker&quot; build, so I had naturally high <code>Encyclopedia</code> skills,
and had a little part of my (game) brain feeling me facts about things at every turn.
This can be useful, as it gives you some context for what's going on and what led to this point,
but if you have to file away facts internally, it can really burn you out fast. I think the longest
play session i managed was about 90 minutes, any longer and I started to phase out and couldn't take
anything more in.</p>
<p>So yes, you start off by trying to figure out reality. Amnesia is typically a rather weak way
to justify expositing your world's lore, and I don't think this really changed my view on that.
It can be very overwhelming. So you go outside, wander around, accidentally die after kicking a postbox,
good stuff. Then you come to the first major hurdle, which is getting into the docks. Coming up to the dock
you meet le generic racist man, tell him to heck off, then find out that le BIGGE racist man won't let you
in unless you subscribe to his &quot;race theory&quot;. Here I was, thinking &quot;uh... I don't wanna do that though -
I (the character) am not going to be a racist&quot;, but the game seems almost like it's pushing you to do it.
There is but one other way in, and it requires you to pass 2 skill checks to do. I feel like this may
be trying to be a commentary that it's easier to go along with fashy beliefs than to not engage with them,
but still mechanically it's not very satisfying.</p>
<p>Now, speaking of skill checks, they <em>REALLY</em> annoy me in this game. I came into this straight off the back of
replaying Fallout new vegas, in which skill checks are a &quot;do you have the skill? (y/n)&quot; - if you invested points into
speech, you <em>will</em> convince people and so on. DE does not work on this logic. It works on a dice roll. Now this
wouldn't be so bad if the stats would allow you to make the roll a certainty, but they do not. A 1.1 on the dice will always
lose. You could have 14 logic (as I did at the end) and STILL fail a 97% skill check because RNG said so.
This, I feel, leads neccesarily to save-scumming. There are a few critical skill checks in the game which you will either
miss content or have drastically worse outcomes if you fail them. I found myself running the same segment 3-4 times to actually
get decent rolls, which I feel massively detracts from any sort of immersion. I built a high-logic high-perception character let
me use the skills for crying out loud.</p>
<p>I think that's my main gripe with the game mechanically. Oh, and the pathfinding can be a bit wobbly. But that's ok.</p>
<p>Artistically the game as a whole is very nice, it's all like oil-painting-y. But the standout really is the soundtrack.
The first and last tracks in the game (<a href="https://www.youtube.com/watch?v=t1LWxKfh66Y">Whirling Cafeteria (day)</a> and <a href="https://www.youtube.com/watch?v=Eg80a-4txV0">Seafort 1</a> respectively)
are super nice to listen to, and seem to capture the aesthetic of the situation. I didn't intentionally pick &quot;art cop&quot; lines, but
I still got the achievement for doing so. It's so hard not to. You're in a town falling apart after being left to rot, perhaps as an example,
as its people are squeezed to their mental breaking point, all rendered in oil-o-vision, whilst listening to this. How could one <em>not</em> pick lines
that comment on the oddly fitting odes to their own destruction exhibited by Cindy and Cuno?</p>
<p>I think this is perhaps the biggest conflict in the story. There may be grand clashes of words and ideology going on up above,
your main character might struggle internally as to who and what he is, and what he has done, but none of that matters. It's all just distraction from what's going
on on the ground.
You can pick crazy and/or pop-culture-referencing speech lines. But that wouldn't feel right. That's what got me - it felt like a lot of the
options to &quot;role-play&quot; would be almost disrespectful to the people in the world. A lot of them pick bizarre ways to cope. Cryptozoology, pretending to be
streetwise gangsters, throwing rocks at a dead body. I can't act like a &quot;superstar cop&quot; to them, that wouldn't be right.</p>
<p>And maybe that is the biggest failing of the narrative. Or its biggest success. It doesn't feel like many of the choices are viable. Or that I could
live with them. Was that the point of the narrative that I as the player am exactly the same as the old communist revolutionary on the island?
Cut off from the actual word, looking at it through nought but a small window from which I must decide who on the other side is right and who isn't? Who
lives and who dies? Maybe that's the case, or maybe I'm just being pretentous. I didn't get the art cop achieve for no reason I suppose.</p>
<p>Now I've gotten that out of my system I think I'll return to something more coherent. The world-building. It's very clear that the developers
spent a <em>lot</em> of time on this, and I cannot fault them. However, as I explained above, I... am almost compelled to categorise things in my head.
I'm pretty certain most of the parallels are intentional, but I could not help but internally replace &quot;oranje&quot; with &quot;the dutch&quot; and so on - whilst this was
useful in the early stages of the game when a basic idea of the forces at play is useful, but when the world starts diverging from the real one it can
hinder your judgement quite a lot. Whilst yes, internally mapping the occupying forces to a sort of vaguely european force does indeed work with their
colonialism, when we start introducing concepts like the &quot;pale&quot; it makes your internal map fall apart and you start losing track of who did what, when, and why.</p>
<p>All of this seems to encourage you to take an overly simplistic view of events. Royalists purged, communists purged, liberal &quot;democracy&quot; by not-europe.
I think that's what made me lie awake at night, trying to figure out an internal map of this world that worked. And nothing really did, there are just too many
names. Too many places. Not enough concrete information beyond paragraphs and paragraphs of history. Is that the idea? That you really can't keep a &quot;big-picture&quot;
view of any actual world in your head without simplifying in places and ignoring complexities? Perhaps.</p>
<p>I'm not sure what else to say. I think I've dealt with the urge to just speak about things and bounce ideas around. I guess bouncing ideas off a text editor
is as good as anything these days.</p>
<p>Anyhow, maybe play it yourself. Or don't. Eh.</p>]]></content><author><name></name></author><category term="rambling" /><summary type="html"><![CDATA[So, I finished Disco Elysium earlier today. I'm currently very exhausted due in part to laying awake the past few nights thinking about it. I don't know why but something sorta hooked me. But the thing is, I don't even know if I... you know, &quot;enjoyed&quot; it or what. So in some sort of weird attempt to figure things out I'm going to let myself type and see what happens. I will likely spoil any and all plot points throughout, so you know. Fair warning. So we open with your character's brain shouting things at him in the most over-the-top manner possible. I hate limbic system's voice so much. Yeah yeah something something let's get this show on the road. Your first few days are spent in what I can only term extreme exposition mode. I think this may be part of what hooked me - I have a tendency to be sniped by many many facts and have to sort them all internally before I can shut off - this game has absolutely no lack of little factlets. I chose the &quot;thinker&quot; build, so I had naturally high Encyclopedia skills, and had a little part of my (game) brain feeling me facts about things at every turn. This can be useful, as it gives you some context for what's going on and what led to this point, but if you have to file away facts internally, it can really burn you out fast. I think the longest play session i managed was about 90 minutes, any longer and I started to phase out and couldn't take anything more in. So yes, you start off by trying to figure out reality. Amnesia is typically a rather weak way to justify expositing your world's lore, and I don't think this really changed my view on that. It can be very overwhelming. So you go outside, wander around, accidentally die after kicking a postbox, good stuff. Then you come to the first major hurdle, which is getting into the docks. Coming up to the dock you meet le generic racist man, tell him to heck off, then find out that le BIGGE racist man won't let you in unless you subscribe to his &quot;race theory&quot;. Here I was, thinking &quot;uh... I don't wanna do that though - I (the character) am not going to be a racist&quot;, but the game seems almost like it's pushing you to do it. There is but one other way in, and it requires you to pass 2 skill checks to do. I feel like this may be trying to be a commentary that it's easier to go along with fashy beliefs than to not engage with them, but still mechanically it's not very satisfying. Now, speaking of skill checks, they REALLY annoy me in this game. I came into this straight off the back of replaying Fallout new vegas, in which skill checks are a &quot;do you have the skill? (y/n)&quot; - if you invested points into speech, you will convince people and so on. DE does not work on this logic. It works on a dice roll. Now this wouldn't be so bad if the stats would allow you to make the roll a certainty, but they do not. A 1.1 on the dice will always lose. You could have 14 logic (as I did at the end) and STILL fail a 97% skill check because RNG said so. This, I feel, leads neccesarily to save-scumming. There are a few critical skill checks in the game which you will either miss content or have drastically worse outcomes if you fail them. I found myself running the same segment 3-4 times to actually get decent rolls, which I feel massively detracts from any sort of immersion. I built a high-logic high-perception character let me use the skills for crying out loud. I think that's my main gripe with the game mechanically. Oh, and the pathfinding can be a bit wobbly. But that's ok. Artistically the game as a whole is very nice, it's all like oil-painting-y. But the standout really is the soundtrack. The first and last tracks in the game (Whirling Cafeteria (day) and Seafort 1 respectively) are super nice to listen to, and seem to capture the aesthetic of the situation. I didn't intentionally pick &quot;art cop&quot; lines, but I still got the achievement for doing so. It's so hard not to. You're in a town falling apart after being left to rot, perhaps as an example, as its people are squeezed to their mental breaking point, all rendered in oil-o-vision, whilst listening to this. How could one not pick lines that comment on the oddly fitting odes to their own destruction exhibited by Cindy and Cuno? I think this is perhaps the biggest conflict in the story. There may be grand clashes of words and ideology going on up above, your main character might struggle internally as to who and what he is, and what he has done, but none of that matters. It's all just distraction from what's going on on the ground. You can pick crazy and/or pop-culture-referencing speech lines. But that wouldn't feel right. That's what got me - it felt like a lot of the options to &quot;role-play&quot; would be almost disrespectful to the people in the world. A lot of them pick bizarre ways to cope. Cryptozoology, pretending to be streetwise gangsters, throwing rocks at a dead body. I can't act like a &quot;superstar cop&quot; to them, that wouldn't be right. And maybe that is the biggest failing of the narrative. Or its biggest success. It doesn't feel like many of the choices are viable. Or that I could live with them. Was that the point of the narrative that I as the player am exactly the same as the old communist revolutionary on the island? Cut off from the actual word, looking at it through nought but a small window from which I must decide who on the other side is right and who isn't? Who lives and who dies? Maybe that's the case, or maybe I'm just being pretentous. I didn't get the art cop achieve for no reason I suppose. Now I've gotten that out of my system I think I'll return to something more coherent. The world-building. It's very clear that the developers spent a lot of time on this, and I cannot fault them. However, as I explained above, I... am almost compelled to categorise things in my head. I'm pretty certain most of the parallels are intentional, but I could not help but internally replace &quot;oranje&quot; with &quot;the dutch&quot; and so on - whilst this was useful in the early stages of the game when a basic idea of the forces at play is useful, but when the world starts diverging from the real one it can hinder your judgement quite a lot. Whilst yes, internally mapping the occupying forces to a sort of vaguely european force does indeed work with their colonialism, when we start introducing concepts like the &quot;pale&quot; it makes your internal map fall apart and you start losing track of who did what, when, and why. All of this seems to encourage you to take an overly simplistic view of events. Royalists purged, communists purged, liberal &quot;democracy&quot; by not-europe. I think that's what made me lie awake at night, trying to figure out an internal map of this world that worked. And nothing really did, there are just too many names. Too many places. Not enough concrete information beyond paragraphs and paragraphs of history. Is that the idea? That you really can't keep a &quot;big-picture&quot; view of any actual world in your head without simplifying in places and ignoring complexities? Perhaps. I'm not sure what else to say. I think I've dealt with the urge to just speak about things and bounce ideas around. I guess bouncing ideas off a text editor is as good as anything these days. Anyhow, maybe play it yourself. Or don't. Eh.]]></summary></entry><entry><title type="html">Sending android push notifications from the CLI</title><link href="https://coffee-and-dreams.uk/tutorials/2020/09/13/self-hosted-notify.html" rel="alternate" type="text/html" title="Sending android push notifications from the CLI" /><published>2020-09-13T00:00:00+00:00</published><updated>2020-09-13T00:00:00+00:00</updated><id>https://coffee-and-dreams.uk/tutorials/2020/09/13/self-hosted-notify</id><content type="html" xml:base="https://coffee-and-dreams.uk/tutorials/2020/09/13/self-hosted-notify.html"><![CDATA[<p>ok so i wanted to set up a way to send notifs from my raspi at home to my
phone because idk i was bored. And I didn't particularly want to use any third
party solutions... so it was time to tune up some ancient open-source project.</p>
<p>Here's how you get your own notification server</p>
<h2>Make an android signing key</h2>
<p>oh yeah we're going to be doing some COOL stuff here.</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>keytool -genkey -v -keystore android.keystore -alias android -keyalg RSA -keysize 2048 -validity 10000
</code></pre></div></div>
<p>make sure you note where you put it. You'll need it.</p>
<h2>Go and get android studio</h2>
<p>https://developer.android.com/studio</p>
<p>Enjoy the massive size. Download the SDK for android 30.</p>
<h2>Clone the repo</h2>
<p>Clone https://git.ihatebeinga.live/IHBAGang/notify somewhere</p>
<p>Open it with android studio. You'll want to open the &quot;build.gradle&quot; file inside
android/Notify</p>
<h2>Register with google's firebase</h2>
<p>Yes yes i know, but i think it's the only way to actually mess with play
services.</p>
<p>https://console.firebase.google.com/u/0/</p>
<p>Create a new project, call it whatever it doesn't matter.</p>
<p>Once you've done that, go to develop -&gt; realtime database and create one.</p>
<p>Set the rules to</p>
<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code data-lang="json"><span class="p">{</span><span class="w">
  </span><span class="nl">"rules"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
    </span><span class="nl">"tokens"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
      </span><span class="nl">"$token"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
        </span><span class="nl">".write"</span><span class="p">:</span><span class="w"> </span><span class="s2">"root.child('users').child(auth.uid).child('token').val() == $token"</span><span class="p">,</span><span class="w">
        </span><span class="nl">".read"</span><span class="p">:</span><span class="w"> </span><span class="s2">"root.child('users').child(auth.uid).child('token').val() == $token"</span><span class="p">,</span><span class="w">
      </span><span class="p">}</span><span class="w">
    </span><span class="p">},</span><span class="w">
    </span><span class="nl">"users"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
      </span><span class="nl">"$uid"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
        </span><span class="nl">".read"</span><span class="p">:</span><span class="w"> </span><span class="s2">"auth.uid == $uid"</span><span class="p">,</span><span class="w">
        </span><span class="nl">".write"</span><span class="p">:</span><span class="w"> </span><span class="s2">"auth.uid == $uid"</span><span class="w">
      </span><span class="p">}</span><span class="w">
    </span><span class="p">}</span><span class="w">
  </span><span class="p">}</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>
<p>Now go develop-&gt;authentication and turn on anonymous authentication</p>
<h2>Shoving it into the app</h2>
<p>Ok cool now settings-&gt;apps. Create an app. Give it the package name <code>com.kevinbedi.notify</code>
and use <code>keytool -list -v -keystore android.keystore -alias android</code> to get your SHA1.</p>
<p>Download the <code>google-services.json</code> and override the one in the repo at <code>android/Notify/app/</code></p>
<p>Now back in android studio go build-&gt;generate signed bundle</p>
<p>Select &quot;APK&quot;, next, give it your keystore details, next, select &quot;release&quot; and check &quot;v2 signature&quot;</p>
<p>Let it spend an eternity building.</p>
<p>Then install the APK on your device</p>
<h2>Setting up the server</h2>
<p>Clone that repo onto your server of choice, and <code>npm i</code> inside the <code>server</code> directory.</p>
<p>We need to set some stuff up now - back in the firebase console:</p>
<p>Go to settings-&gt;service account and create a private key - it'll download a file.</p>
<p>Copy the contents of the file to <code>server/serviceAccountKey.json</code></p>
<p>Now create a file <code>config.json</code> of the form</p>
<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code data-lang="json"><span class="p">{</span><span class="w">
  </span><span class="nl">"serverKey"</span><span class="p">:</span><span class="w"> </span><span class="s2">"copy this from config-&gt;cloud messaging in firebase"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"database"</span><span class="p">:</span><span class="w"> </span><span class="s2">"the url from the database area of firebase"</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>
<p>Cool now we've got everything.</p>
<h2>Start the server</h2>
<p><code>node server.js</code> will start it.</p>
<p>Now we need to test it</p>
<p>In another window navigate to <code>node</code></p>
<p><code>npm i</code>, change the URL inside <code>notify.js</code> to whatever you're running it on.
It defaults to port 3000.</p>
<p>Now you can</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code data-lang="bash">node app.js <span class="nt">-r</span> &lt;code from the app&gt;
node app.js <span class="nt">-t</span> <span class="s2">"test"</span>
</code></pre></div></div>
<p>and it should work</p>]]></content><author><name></name></author><category term="tutorials" /><summary type="html"><![CDATA[ok so i wanted to set up a way to send notifs from my raspi at home to my phone because idk i was bored. And I didn't particularly want to use any third party solutions... so it was time to tune up some ancient open-source project. Here's how you get your own notification server Make an android signing key oh yeah we're going to be doing some COOL stuff here. keytool -genkey -v -keystore android.keystore -alias android -keyalg RSA -keysize 2048 -validity 10000 make sure you note where you put it. You'll need it. Go and get android studio https://developer.android.com/studio Enjoy the massive size. Download the SDK for android 30. Clone the repo Clone https://git.ihatebeinga.live/IHBAGang/notify somewhere Open it with android studio. You'll want to open the &quot;build.gradle&quot; file inside android/Notify Register with google's firebase Yes yes i know, but i think it's the only way to actually mess with play services. https://console.firebase.google.com/u/0/ Create a new project, call it whatever it doesn't matter. Once you've done that, go to develop -&gt; realtime database and create one. Set the rules to { "rules": { "tokens": { "$token": { ".write": "root.child('users').child(auth.uid).child('token').val() == $token", ".read": "root.child('users').child(auth.uid).child('token').val() == $token", } }, "users": { "$uid": { ".read": "auth.uid == $uid", ".write": "auth.uid == $uid" } } } } Now go develop-&gt;authentication and turn on anonymous authentication Shoving it into the app Ok cool now settings-&gt;apps. Create an app. Give it the package name com.kevinbedi.notify and use keytool -list -v -keystore android.keystore -alias android to get your SHA1. Download the google-services.json and override the one in the repo at android/Notify/app/ Now back in android studio go build-&gt;generate signed bundle Select &quot;APK&quot;, next, give it your keystore details, next, select &quot;release&quot; and check &quot;v2 signature&quot; Let it spend an eternity building. Then install the APK on your device Setting up the server Clone that repo onto your server of choice, and npm i inside the server directory. We need to set some stuff up now - back in the firebase console: Go to settings-&gt;service account and create a private key - it'll download a file. Copy the contents of the file to server/serviceAccountKey.json Now create a file config.json of the form { "serverKey": "copy this from config-&gt;cloud messaging in firebase", "database": "the url from the database area of firebase" } Cool now we've got everything. Start the server node server.js will start it. Now we need to test it In another window navigate to node npm i, change the URL inside notify.js to whatever you're running it on. It defaults to port 3000. Now you can node app.js -r &lt;code from the app&gt; node app.js -t "test" and it should work]]></summary></entry><entry><title type="html">Translation Corrections and Updates</title><link href="https://coffee-and-dreams.uk/translation/2020/07/29/subtitle-corrections.html" rel="alternate" type="text/html" title="Translation Corrections and Updates" /><published>2020-07-29T00:00:00+00:00</published><updated>2020-07-29T00:00:00+00:00</updated><id>https://coffee-and-dreams.uk/translation/2020/07/29/subtitle-corrections</id><content type="html" xml:base="https://coffee-and-dreams.uk/translation/2020/07/29/subtitle-corrections.html"><![CDATA[<p>This post exists so I can use cards with youtube to issue post-publish corrections
more visibly than in the description.</p>
<h2>Kanatan's sexy-man voice is too much for Sui-chan</h2>
<p>2:27 - &quot;we're married after all&quot;. This comes from me misinterpreting 4 syllables that could have one of two meanings. You'll see both scattered throughout the comments.</p>
<h2>Amane Kanata's custom waifu takes too much Asacoco</h2>
<p>2:02 - &quot;that's totally the drugged-up sheep&quot;</p>
<h2>Amane Kanata asks for Noel's &quot;Sexy voice&quot;</h2>
<p>1:58 - &quot;are you actually doing that, or did you just want me to pay attention to you?&quot;. Comes from &quot;komatte&quot; and &quot;kamatte&quot; sounding VERY similar here</p>
<h2>Aqua is (not) being considerate</h2>
<p>Honestly I didn't think anyone would care to see what these mean.
They're... essentially made-up and very vague. I used the localisation
from the english version of the game here.</p>
<p><img src="/images/aqua-results.png" alt="results" /></p>
<h2>An Angel, a Dragon and an Elf walk into a bar...</h2>
<p>@2:00 - I got this backwards. should be &quot;he gave me sorta a bad impression&quot;</p>
<p>I parsed おじさんへの好感度 as &quot;favourability with the barman&quot; rather than &quot;favourability of the barman&quot;</p>
<p>this then affects 3:09 respectively</p>
<p>Text should be:</p>
<ul>
<li>2:00 <code>To be honest he gave me sorta a bad impression</code></li>
<li>3:08 <code>That one moment brought my opinion of him up from rock bottom</code></li>
</ul>
<p>I made this mistake by incorrectly visualising the へ (direction of action)
particle and which way it acts in this instance. In my mind if your 好感 were
to rise へsomeone, they'd like you more. But this is incorrect. Should I have
googled a phrase I was unfamilliar with? Absolutely.</p>
<p>I am lucky that in this instance the error only affects two minor lines.</p>
<h3>Regarding ginger drinks</h3>
<p>I was also told by someone that knows their ginger beverages that &quot;ginger beer&quot; and &quot;ginger ale&quot; are totally different - although Kanata seems to use the same word for both. The barman is quoted as saying that &quot;ginger ale&quot; is in moscow mule, which it is not. Thus I used &quot;ginger beer&quot; throughout. There is a possibility that the &quot;real&quot; ginger beer and the &quot;fake&quot; ginger beer comment could have been referring to the difference between these two drinks, although the way Kanata quotes him makes it hard to justify any real redactions or corrections here. There was also someone in chat going &quot;what does he mean 'real'?&quot; so I think keeping as-is is justified. I could also flip all instances of &quot;beer&quot; to &quot;ale&quot;, this would still have the effect of being &quot;wrong&quot; as far as the drink is concerned, but true to the speech.</p>
<p>In my view, the conversation would make less sense if Kanata orders a ginger ale and then the barman starts talking about the ingredients of moscow mule, which is not linked in any way.</p>
<p>But hey</p>
<h2>FAQ</h2>
<p>I'll list things that I get asked a lot here.</p>
<h2>How do I start learning Japanese?</h2>
<p>Bear in mind that I'm just some N3 weeb (at time of writing), so I'm not a total beginner but I'm not really great either</p>
<p>At time of writing I've been actively trying to learn stuff for about 2 years, without formal education of any sort.</p>
<p>With that said:</p>
<p>Take a look at the <a href="https://djtguide.neocities.org/">DJT guide</a> - it's how i started learning in any proper fashion. , and most of it started there.</p>
<p>Throw those moonrunes at your eyeballs and ear holes until they cease to be quite so runic.</p>
<p>If you're here, you're probably into vtubers you can basically kickstart your listening skills
by just watching streams and picking up absolutely anything you can.</p>
<p>Learn some basic vocab and grammar from either picking it up via immersion or from resource packs, then try to consume native content (e.g basic manga)</p>
<p>So, to paraphrase, to get started:</p>
<ul>
<li>Learn the kana from <a href="https://realkana.com/study/">realkana</a>. It won't take long, really. Yes some of them look sorta similar. You'll work it out.</li>
<li>Immerse yourself as much as possible. Japanese music, streams, twitter people, anything you can to get more of the language around you.</li>
<li>Do <em>not</em> obsess about being as efficient or fast as possible. That's a swamp that you'll use to procrastinate and not actually learn.</li>
<li>If they help you, try a textbook. I personally used some of Minna no Nihongo before N3.</li>
<li>Get started with kanji. Pace yourself. There are a looot, and just as many ways that claim to teach you them faster. I personally use <a href="http://www.kanjidamage.com">kanjidamage</a>.</li>
<li>Try reading native material <em>as soon as possible</em>. The generic beginners' recommendation is yotsubato!, but if you're able to search jisho.org I recommend girls' last tour.</li>
<li>Keep at it. It takes ages. Sometimes it feels like you're making no progress. This is normal. It'll click at some point and you'll go &quot;OHHHHH!&quot;</li>
</ul>
<p>It will take years though. and it's a lot of work. Good luck.</p>]]></content><author><name></name></author><category term="translation" /><summary type="html"><![CDATA[This post exists so I can use cards with youtube to issue post-publish corrections more visibly than in the description.]]></summary></entry><entry><title type="html">Tenki no Ko (Weathering with you) 2020 Subtitles</title><link href="https://coffee-and-dreams.uk/subtitles/2020/06/11/tenki-no-ko-sub.html" rel="alternate" type="text/html" title="Tenki no Ko (Weathering with you) 2020 Subtitles" /><published>2020-06-11T00:00:00+00:00</published><updated>2020-06-11T00:00:00+00:00</updated><id>https://coffee-and-dreams.uk/subtitles/2020/06/11/tenki-no-ko-sub</id><content type="html" xml:base="https://coffee-and-dreams.uk/subtitles/2020/06/11/tenki-no-ko-sub.html"><![CDATA[<p>I spent the last week subtitling the newest Makoto Shinkai
film because I like it and I wanted something to do.</p>
<p>Also because the official subs are awful.</p>
<p><img src="/sub-files/tenki-no-ko/shot-1.png" alt="screenshot" /></p>
<p><img src="/sub-files/tenki-no-ko/shot-2.png" alt="screenshot" /></p>
<p><a href="/sub-files/tenki-no-ko/tenki-no-ko.ass">DOWNLOAD .ass file</a></p>
<p>Fonts:</p>
<ul>
<li>[Tiresias PCFont](/sub-files/fonts/Tiresias PCfont Regular.ttf)</li>
<li><a href="/sub-files/fonts/Tiresias_Infofont.ttf">Tiresias Infofont</a></li>
</ul>
<p>General philosophy throughout:</p>
<ul>
<li>Retain as much of the original text as possible</li>
<li>Retain japanese honorifics, otherwise some lines don't make sense</li>
<li>Don't force direct translation of familial words. A character using
&quot;nee-chan&quot; shouldn't mean they're translated as saying &quot;sis&quot;. If you
do this someone saying &quot;nii-chan&quot; as &quot;brother&quot; a lot sounds like a moe
hulk hogan.</li>
<li>No scrubbing of culture. If japanese festivals are featured,
use their proper names. Speaking to you, mr official translator changing
&quot;obon&quot; to &quot;august 15th&quot;.</li>
<li>Tone matters. Radio broadcasts should sound like radio broadcasts.</li>
<li>Do not subtitle insert song lyrics - these are used to set a mood
with the visuals. The last thing I want to do is encourage viewers
to look at the lyrics and not take in the mood of the animation.</li>
<li>Readability over style-matching</li>
<li>Allow subtitles to end before the line ends if there's a scene transition.
especially if there's an action. we want the next scene's animation to
hit as hard as it was edited to.</li>
<li>Generally abide by the <a href="http://bbc.github.io/subtitle-guidelines/">BBC's accessibility guidelines</a></li>
<li>20 characters per second maximum</li>
<li>Give lines some flair. There's a common theme with officially-licenced
subs where the given translation is very literal, except when the character
could be seen as &quot;swearing&quot;. Give characters character.</li>
</ul>]]></content><author><name></name></author><category term="subtitles" /><summary type="html"><![CDATA[I spent the last week subtitling the newest Makoto Shinkai film because I like it and I wanted something to do. Also because the official subs are awful. DOWNLOAD .ass file Fonts: [Tiresias PCFont](/sub-files/fonts/Tiresias PCfont Regular.ttf) Tiresias Infofont General philosophy throughout: Retain as much of the original text as possible Retain japanese honorifics, otherwise some lines don't make sense Don't force direct translation of familial words. A character using &quot;nee-chan&quot; shouldn't mean they're translated as saying &quot;sis&quot;. If you do this someone saying &quot;nii-chan&quot; as &quot;brother&quot; a lot sounds like a moe hulk hogan. No scrubbing of culture. If japanese festivals are featured, use their proper names. Speaking to you, mr official translator changing &quot;obon&quot; to &quot;august 15th&quot;. Tone matters. Radio broadcasts should sound like radio broadcasts. Do not subtitle insert song lyrics - these are used to set a mood with the visuals. The last thing I want to do is encourage viewers to look at the lyrics and not take in the mood of the animation. Readability over style-matching Allow subtitles to end before the line ends if there's a scene transition. especially if there's an action. we want the next scene's animation to hit as hard as it was edited to. Generally abide by the BBC's accessibility guidelines 20 characters per second maximum Give lines some flair. There's a common theme with officially-licenced subs where the given translation is very literal, except when the character could be seen as &quot;swearing&quot;. Give characters character.]]></summary></entry></feed>