<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Cold Boot Reader</title>
    <link>https://blog.cyberia.club</link>
    <description>Read the latest posts from Cold Boot.</description>
    <pubDate>Tue, 27 Aug 2024 01:08:54 +0000</pubDate>
    <item>
      <title>webtoys - not everyone uses windows</title>
      <link>https://blog.cyberia.club/segfault/webtoys-not-everyone-uses-windows</link>
      <description>&lt;![CDATA[today i will be featuring a tool developed by reese called webtoys&#xA;&#xA;this is a version of devtoys which is a handy utility for developers, however it has one fatal flaw which is that it only supports windows. a friend at cyberia.club a while ago has developed webtoys which is a version of devtoys that is designed to run completely in your browser&#xA;&#xA;this project is still not fully feature-complete, if you know anything about web development i very much suggest you contribute to the github]]&gt;</description>
      <content:encoded><![CDATA[<p>today i will be featuring a tool developed by reese called webtoys</p>

<p>this is a version of <a href="https://github.com/veler/DevToys" rel="nofollow">devtoys</a> which is a handy utility for developers, <strong>however</strong> it has one fatal flaw which is that it only supports windows. a friend at cyberia.club a while ago has developed <a href="https://webtoys.ovine.xyz/" rel="nofollow">webtoys</a> which is a version of devtoys that is designed to run completely in your browser</p>

<p>this project is still not fully feature-complete, if you know anything about web development i very much suggest you contribute to <a href="https://github.com/reeseovine/webtoys" rel="nofollow">the github</a></p>
]]></content:encoded>
      <author>segfault</author>
      <guid>https://blog.cyberia.club/read/a/2w3hsug2i6</guid>
      <pubDate>Thu, 11 Jan 2024 22:25:38 +0000</pubDate>
    </item>
    <item>
      <title>Locating Trans Healthcare with MyChoiceHRT: an interview with Alena, pt. 2</title>
      <link>https://blog.cyberia.club/bread-z/locating-trans-healthcare-with-mychoicehrt-an-interview-with-alena-pt-7rws</link>
      <description>&lt;![CDATA[---&#xA;&#xA;Jeremy:&#xA;&#xA;If you have to summarize your overall system architecture with this app – we&#39;ve touched on Symfony, on your ORM – I already forgot the name of it again...&#xA;&#xA;Alena:&#xA;&#xA;Doctrine.&#xA;&#xA;Jeremy:&#xA;&#xA;Doctrine, right.&#xA;&#xA;Alena:&#xA;&#xA;For overall architecture, my site is a LAMP application.&#xA;It is running with Ubuntu, Apache, PHP 8.1 and PostgreSQL.&#xA;In your typical LAMP stack, the M usually stands for MySQL, but in this case, I&#39;m running with PostgreSQL.&#xA;And there are other components that are not web server components.&#xA;There is an asynchronous queue system that is at play as well which processes all of the background work.&#xA;&#xA;Jeremy:&#xA;&#xA;What&#39;s that? referring to queue system&#xA;&#xA;Alena:&#xA;&#xA;That is another Symfony component.&#xA;It&#39;s the Symfony Messenger component.&#xA;&#xA;Jeremy:&#xA;&#xA;Messenger.&#xA;&#xA;Alena:&#xA;&#xA;Messengers -&#xA;You could think of it as a system where there&#39;s a database table of queued jobs to do, and a worker process just sits there listening, saying, “Check the database. Do I have any work to do? Do I have any work to do?”&#xA;And when any new rows end up in the jobs table, the queue worker says, “Oh, there&#39;s work to do.”&#xA;It grabs the row out of the queue, processes it, runs the job, and continues checking out work until there&#39;s no work left to do.&#xA;This kind of enables an asynchronous style of programming that currently is not a native language feature of PHP at this point. In PHP, you can&#39;t really create a bunch of promises and await all of those promises to finish like you would in Javascript.&#xA;So, having a queue worker system allows you to build asynchronous features with a slightly different approach.&#xA;In this case, it would be more of a system where you dispatch work to the queue, and your queue worker, who&#39;s sitting there listening in the background, will pick it up and work on it.&#xA;When writing code for a web server, you usually want web requests to finish as quickly as possible because you have a user who&#39;s sitting there who&#39;s either clicked a button, or who&#39;s refreshed the page, and they want to see something come back as soon as possible.&#xA;You should send a response back to the user within a few hundred milliseconds or more to give the confirmation of saying, &#34;Hey, the thing has been queued up to be worked on&#34; or &#34;We&#39;re working on it&#34;.&#xA;That can give a sense of confidence or a sense that your app is speedy or that things are working to the user.&#xA;Whereas if your page sat there for five, ten seconds while something really long is running -&#xA;that&#39;s something that, as far as user experience goes, is something you don&#39;t want the user to be stuck waiting for.&#xA;&#xA;Jeremy:&#xA;&#xA;Of course, got to reassure the users that progress is happening, things are moving along.&#xA;I like the way you work around the lack of native async functionality.&#xA;It&#39;s interesting to think about.&#xA;The whole concept of workers is really cool; [it&#39;s] something that goes under discussed.&#xA;When I learned programming [the field] was all [about] object-oriented this and that.&#xA;It&#39;s wild to think how far things have come around.&#xA;I know there&#39;s that one language that has workers as its fundamental core construct of doing anything.&#xA;I forget what that one&#39;s called. Editor&#39;s note: It&#39;s [Erlang/OTP.]&#xA;&#xA;Alena:&#xA;&#xA;You&#39;ll have to mention that one to me. I&#39;m curious.&#xA;&#xA;Jeremy:&#xA;&#xA;Oh, yes, I will. It&#39;s not OCaml. It&#39;s another one of those weird, niche, functional languages.&#xA;It&#39;s not Clojure either. I forget; I&#39;ll get back to you on that.&#xA;I know that on the web these days you have web workers, which you can use to run stuff outside of the main process.&#xA;I&#39;m pretty sure that&#39;s how those work. I don&#39;t quite remember... but it&#39;s cool that [there are] parallel approaches to the same problem.&#xA;&#xA;Alena:&#xA;&#xA;You bet.&#xA;&#xA;Jeremy:&#xA;&#xA;Just because you&#39;re lacking in a feature async/await doesn&#39;t mean you don&#39;t have a robust system in place.&#xA;&#xA;Alena:&#xA;&#xA;Correct.&#xA;You can still do the same kind of asynchronous/multiple things at a time approach with a queue worker system.&#xA;Because... a single worker can only do one thing at a time, true, but you can also spin up multiple workers, so that you can process multiple pieces of work at a time.&#xA;Theoretically, an app with a worker approach, depending on how many workers you&#39;ve spun up, could be much faster than a single process application that has asynchronous components.&#xA;But that&#39;s all something that could be heavily, heavily debated about what approach is best for what thing.&#xA;&#xA;Jeremy:&#xA;&#xA;Right, right. But you always have to factor [in] scaling if you want your app to be used by anyone.&#xA;These are good conversations to have early.&#xA;&#xA;Alena:&#xA;&#xA;Exactly. There&#39;s no one best tool out there.&#xA;There are so many different tools and they are all equally well suited for different things.&#xA;&#xA;Jeremy:&#xA;&#xA;That sounds just about right. Well, I know that there&#39;s a worst tool for everything and it&#39;s the official KDE tool 🤡 No, I&#39;m just kidding!&#xA;&#xA;Alena:&#xA;&#xA;There&#39;s a lot of KDE bashing going on. 🤨&#xA;&#xA;Jeremy:&#xA;&#xA;I&#39;m a huge KDE aficionado; I love KDE, and so... as a hardcore KDE user, I reserve the right to trash KDE for free.&#xA;&#xA;Alena:&#xA;&#xA;Ya trash them because ya love them. 🥰&#xA;&#xA;Jeremy:&#xA;&#xA;Exactly.&#xA;&#xA;Alena:&#xA;&#xA;You want them to be great.&#xA;&#xA;Jeremy:&#xA;&#xA;I would feel bad if it was any other projects, but I don&#39;t feel bad for KDE.&#xA;I&#39;ve put way too much of my life into banging my head against the wall, trying to get KDE software to do what it&#39;s supposed to do.&#xA;Anyway, 😅 was there anything that got you banging your head against the wall working on this project?&#xA;What were some challenges you ran into? Was there anything that really took some time to get over?&#xA;This is a pretty big app. There&#39;s a lot of code to it. It certainly took a while to make.&#xA;&#xA;Alena:&#xA;&#xA;Yeah, pieces that took quite a large time to get just right is... number one, pulling data in.&#xA;Pulling data into the app, like the clinics, as well as processing them.&#xA;This was a problem that took me a while to find the right approach.&#xA;I knew that I wanted to pull in clinics from Erin Reed&#39;s data source, and I did not want any duplicates of them.&#xA;I wanted to keep them up to date over time.&#xA;The Erin Reed data source is a user Google Map, which can be exported in KML format, which is kind of like an XML maps format.&#xA;I was able to write a scraper that would pull down that XML, parse through it, and create a bunch of database objects for each of those clinics.&#xA;But the hard part is, over time, how do I make sure that I&#39;m not continually re-importing the same ones?&#xA;I ran into another problem that these clinic or location records did not have any kind of unique identifier about them.&#xA;&#xA;Jeremy:&#xA;&#xA;Oh no.&#xA;&#xA;Alena:&#xA;&#xA;Which is... problematic, because there&#39;s not really a great way to check if I have the record already other than taking some of the properties of the clinic and doing comparisons on records, like “do these couple fields match?”, and doing database searches like that.&#xA;I landed on creating a hash of a couple of the clinic properties and saving the hashes. With the hashes of the clinics I have already, I can compare against the hash of new clinics, so that I can quickly know whether or not I already pulled something in.&#xA;But what if I pull an updated clinic that has a piece of text slightly changed?&#xA;Well, the hash is going to differ, of course.&#xA;So the system is going to pull in that clinic, and now I have essentially two of the same thing, one which is slightly different from the other.&#xA;Ideally, I don&#39;t want three or more copies of the same clinic, as things change over time.&#xA;So my thought was, well, how can I figure out how to combine all of these duplicates, or flag all of these that are theoretically the same ones?&#xA;If I&#39;m going to pull in other datasets, like Southern Equality&#39;s dataset, I also want to be able to flag which of Southern Equality&#39;s clinics and which of Erin Reed&#39;s clinics are the same ones.&#xA;I wanted a process to be able to flag those so I spent a lot of time, a couple weeks, coming up with the right way to check for duplicate clinics.&#xA;So whenever a new clinic comes in, there&#39;s the first piece that determines whether or not it&#39;s already in the system and the clinic gets saved if a hash of it hasn&#39;t been saved already.&#xA;Once that happens, a job is sent to the queue worker to say, hey, we need to check for duplicates for this specific clinic.&#xA;The queue worker will pick up that job, then search the database for nearby clinics using lat-long coordinates as well as checking for clinics with similar names.&#xA;I spent a bunch of time figuring out how to do geo coordinate stuff with PostgreSQL and with Doctrine, the ORM, because I needed to do database searches on lat long coordinates.&#xA;I found a PostgreSQL extension, PostGIS, that allows you to store lat long coordinates and the extension will generate metadata that can be used to perform distance checks and more advanced geographical searches.&#xA;Probably most lat long operations you could think of are implemented in this PostgreSQL extension.&#xA;In this case, I was mostly interested in just the distance between two points. I was able to efficiently search my data to find what clinics were within a half mile or a mile of the new clinic that was imported.&#xA;And the next piece was, once I find clinics that are nearby to each other, how do I get as close as I can be, to know if they&#39;re duplicates or not?&#xA;So I landed on a solution with help from my brother.&#xA;He was very, very helpful in picking out a strategy that I could use to compare two different strings – a comparison technique called Levenshtein.&#xA;Levenshtein is a method of counting the number of additions, modifications and removals you have to make to a string to make it look like another string.&#xA;Kind of like the distance between two strings; the changes you have to make, like do you add a character, do you remove a character, do you change a character to make two strings the same?&#xA;I used a PHP implementation of Levenshtein to do those string comparisons for the final judgment of “How likely are these two clinics to be the same?”&#xA;&#xA;Jeremy:&#xA;&#xA;Your last filter.&#xA;&#xA;Alena:&#xA;&#xA;I&#39;ve had very good success.&#xA;I have had very few false positives and have made the system automatically flag duplicates for me to review and then deal with.&#xA;I added some UI where you could review the duplicates that the system flagged and be able to resolve them by picking one of them to save.&#xA;So I just have to log in every so often to the system to see if any duplicates were found. There are a couple of resolution steps to do, rather than having to go through all the data either by hand or with a script. [Editor&#39;s note: I wonder if you could do this with makefiles and cron jobs.]&#xA;&#xA;Jeremy:&#xA;&#xA;Right.&#xA;That makes sense. Is that what&#39;s in the — where do you exactly do that? Is that what&#39;s in the admin page? I know [it] exists, but I can&#39;t see [it].&#xA;&#xA;Alena:&#xA;&#xA;So yeah, on the admin page, there&#39;s a view of how many clinics have been collected in total, how many new clinics have been recently pulled in, and how many unpublished clinics there are.&#xA;Because when new clinics are pulled in, they don&#39;t get automatically enabled in the search. I have to manually review them and say yes to them, as well as the duplicates the system flagged.&#xA;There&#39;s a quick link to just jump to the list of different duplicates.&#xA;&#xA;Jeremy:&#xA;&#xA;Makes sense. Your review queue of sorts.&#xA;&#xA;Alena:&#xA;&#xA;Yeah.&#xA;&#xA;Jeremy:&#xA;&#xA;Certainly quite a struggle. I didn&#39;t even think about all the data pre processing that you have to do to keep your dataset up to date.&#xA;&#xA;Alena:&#xA;&#xA;Oh, there&#39;s a lot of data pre processing, not even just pulling in the the clinics themselves, but also – how do you pull in the data used to search the clinics?&#xA;Like if a user wants to search via a zip code or they want to search via a city, how is my system supposed to know what&#39;s a city in the world? Or how should a city be converted to lat long coordinates? Or how do you get from a zip code to lat long coordinates?&#xA;&#xA;Jeremy:&#xA;&#xA;😰&#xA;&#xA;Alena:&#xA;&#xA;So I had to look for open data sets of cities in the United States and zip codes.&#xA;I landed on an open data set called GeoNames that has a couple fairly large data sets. They take about a half hour to fully import.&#xA;I had to write some console commands to pull down the zip files for them, process all the rows, and actually link everything up.&#xA;And that takes about a couple gigs worth of data. So it takes about 20, 25 minutes or so.&#xA;&#xA;Jeremy:&#xA;&#xA;Sure. Oh, wow.&#xA;&#xA;Alena:&#xA;&#xA;And so there&#39;s not just pulling in the clinics, but also pulling in those data sets to actually have what&#39;s needed to do the actual text search, or zip code search.&#xA;&#xA;Jeremy:&#xA;&#xA;Right. Oh, my. 😳&#xA;You have to be able to speak the same language, you know? You need one metric by which you can judge things. Getting everything nice and unified like that must be an insane amount of work to do, [especially] invisibly, under the hood.&#xA;&#xA;Alena:&#xA;&#xA;Yeah, when you type in your location, a zip code or a city, your search isn&#39;t going to anyone else.&#xA;My server has all of the locations saved in a couple database tables that I can query in MySQL.&#xA;I keep trying to say MySQL. I work in MySQL too much. So PostgreSQL queries just run to compare the search to any of the stored locations.&#xA;&#xA;Jeremy:&#xA;&#xA;Hmm, right. I noticed that code. That was really interesting. The code where the users location that they put in gets compared to a distance check. That little query you did in there was really interesting.&#xA;&#xA;Alena:&#xA;&#xA;It&#39;s not exactly perfect. The actual city name search needs some work. It doesn&#39;t always perfectly translate a search because it&#39;s using a likeness check in PostgreSQL to do fuzzy string matches to try to get as close to cities as it can.&#xA;It works a lot of the time, but try St. Paul, for example. The database is storing it as S-A-I-N-T Paul. But... a lot of times someone who might be searching for St. Paul might just type in S-T dot Paul.&#xA;That will not pull up the autocomplete on the site. It won&#39;t autocomplete to St. Paul, Minnesota right away. So that is one area for improvement, say, abbreviations of city names.&#xA;Or maybe even there needs to be a component that is able to auto convert those abbreviations into full names. You could get very magical with what&#39;s going on to actually convert that user input. I may have just given myself an idea for how to improve that.&#xA;&#xA;Jeremy:&#xA;&#xA;Oh boy! Looks like we need more datasets!! 😆&#xA;&#xA;Alena:&#xA;&#xA;I might need some more collaboration here 😅 This conversation has been helpful 🙂&#xA;&#xA;Jeremy:&#xA;&#xA;That is pretty cool. You know, the search part of it is interesting. If I had to make a suggestion, I think a ranking system of sorts would be a super [useful feature]. I have no clue how you&#39;d implement it, but it would be nice, you know? Because when I type in Minneapolis, the first thing comes up is Minneapolis, Kansas -&#xA;And I&#39;m like, what? Who cares about Minneapolis, Kansas? 🙄 There should be some kind of metric to [say] “I know what the most important Minneapolis is”. Maybe by population of the city.&#xA;&#xA;Alena:&#xA;&#xA;😂 That&#39;s true, that&#39;s true. I think I could be wrong, but I&#39;m pretty sure that there are population values in the Geonames dataset. I&#39;m pretty sure that might be something that can be pulled in.&#xA;&#xA;Jeremy:&#xA;&#xA;Well, because of this one single tiny nitpicky flaw, your app is terrible. 😤 Absolutely, you know, worst app ever. Not worth using. And you used PostgreSQL instead of the obviously based, glorious, much better MySQL.&#xA;&#xA;Alena:&#xA;&#xA;Daddy Oracle.&#xA;&#xA;Jeremy:&#xA;&#xA;How dare you? 😠&#xA;&#xA;Alena:&#xA;&#xA;Big Daddy Oracle. 😏&#xA;&#xA;Jeremy:&#xA;&#xA;🤣&#xA;Only] praise [allowed]! I will accept no Oracular slander in this house. Could you tell me more? I know so little about the database side of things. Why [PostgreSQL over, say, MariaDB?&#xA;&#xA;Alena:&#xA;&#xA;Honestly, I knew that PostgreSQL is quite big in the open source space. And I kind of wanted a chance to try it, give it a spin.&#xA;I kind of figured, “Well, if things are not working super well, within the first few weeks or so, it wouldn&#39;t be too hard, using an ORM, to switch from PostgreSQL to MySQL, or back to, say, MariaDB.&#xA;I haven&#39;t had any personal experience with MariaDB. I&#39;ve been told that it&#39;s kind of like a drop-in replacement for MySQL, which would be great to have that same kind of syntax and functionality that I expect.&#xA;Just minus, you know, the Big Daddy Oracle. 😁&#xA;&#xA;Jeremy:&#xA;&#xA;Right. 😆&#xA;&#xA;Alena:&#xA;&#xA;I kinda wanted to take PostgreSQL for a spin.&#xA;&#xA;Jeremy:&#xA;&#xA;Give it a shot. Yeah, why not?&#xA;&#xA;Alena:&#xA;&#xA;So far, I haven&#39;t run into any performance or specific lack of functionality that it didn&#39;t have compared to other relational database servers. I&#39;m quite happy with PostgreSQL. On another note, on what you said earlier – we should totally make an app called OpenSpores, a mushroom identification app with an open data set, where you can input different mushroom features and narrow down which shroom you&#39;re looking at.&#xA;&#xA;Alena:&#xA;&#xA;😂&#xA;&#xA;Jeremy:&#xA;&#xA;You know, maybe some computational photography stuff, although that gets kind of icky and proprietary.&#xA;&#xA;Alena:&#xA;&#xA;😔&#xA;&#xA;Jeremy:&#xA;&#xA;Who knows. Just food for thought and thought about food.&#xA;&#xA;Alena:&#xA;&#xA;Maybe we will have to make our own machine learning model for identifying mushrooms and make our own Friday night hack project of a mushroom identifier.&#xA;&#xA;Jeremy:&#xA;&#xA;Perhaps, perhaps. It&#39;s certainly an option. I think there&#39;s certainly some intersectionality.&#xA;Anyone interested in networking should be interested in mushrooms, I think.&#xA;&#xA;Alena:&#xA;&#xA;😆&#xA;&#xA;Jeremy:&#xA;&#xA;Perhaps that&#39;s just me. You know, we need more alternatives to these hot technologies.&#xA;They&#39;re so, so proprietary. I really like especially how this app... it feels professional.&#xA;&#xA;Alena:&#xA;&#xA;Oh, thank you. ☺️&#xA;&#xA;Jeremy:&#xA;&#xA;You wouldn&#39;t think it was made by a single person.&#xA;&#xA;Alena:&#xA;&#xA;Oh, thank you. 😊&#xA;&#xA;Jeremy:&#xA;&#xA;[You&#39;d think it was made by a] team subdivision of, I don&#39;t know, some sort of activist group.&#xA;&#xA;Alena:&#xA;&#xA;Someone told me my app look quite corporate. 🤣&#xA;&#xA;Jeremy:&#xA;&#xA;Oh! 😵 Oh no.&#xA;&#xA;Alena:&#xA;&#xA;And I&#39;m like, oh, no! 😅&#xA;&#xA;Jeremy:&#xA;&#xA;Oh, no, no. I&#39;ll make you a style sheet to make it look like a dive bar.&#xA;I&#39;ll add some Web 1.0 flair.&#xA;&#xA;Alena:&#xA;&#xA;Excellent.&#xA;&#xA;Jeremy:&#xA;&#xA;But, you know, it&#39;s cool to see this sort of... grassroots free software activism in the place of more traditional, official, state or corporate offerings.&#xA;And it&#39;s kind of a radical model you have here.&#xA;Do you have any other areas of social malaise that you think would benefit from similar projects like this? from active open source [development]?&#xA;What do you think needs to be made less proprietary, if you could choose?&#xA;&#xA;Alena:&#xA;&#xA;Things that could be made less proprietary... 🤔&#xA;My focus has been tools for the LGBTQ space.&#xA;I&#39;m sure there could be quite a lot more search tools created for all sorts of different specialized medical care.&#xA;But for any particular applications, what would I like to see more open source of? hmm...&#xA;&#xA;Jeremy:&#xA;&#xA;I mean, for my money, I talked – like a year ago – to my boyfriend about making a open source gay dating app.&#xA;But Lord knows [certain reactionary] heterosexual people would riot if they found out that was a thing. 😒&#xA;&#xA;Alena:&#xA;&#xA;😞&#xA;I&#39;m sure there&#39;s a plethora of great ideas that could be used for that.&#xA;Just even glancing at my phone – I&#39;m using a proprietary medication tracker app.&#xA;I&#39;d love it if there was something I could use that had a good hook into a federal medication database, to allow me to quickly add meds without all of the proprietary, nasty tracking features that are probably going on under the hood.&#xA;&#xA;Jeremy:&#xA;&#xA;Mozilla released their report last year – Privacy Not Included – that talked about all these different apps in the Google Play store and how the permissions that the [Play store page] said the app would need had no correlation with the actual privacy policies on the apps&#39; website.&#xA;I saw an email a few months ago [from them] – they&#39;ve done updates on this since, and the worst performing section probably shouldn&#39;t be any surprise:&#xA;Mental health apps.&#xA;&#xA;Alena:&#xA;&#xA;Geez.&#xA;&#xA;Jeremy:&#xA;&#xA;People who need care?&#xA;Tell me all your deepest secrets so that I can monetize them.&#xA;Doesn&#39;t that sound fun? 🤑&#xA;&#xA;Alena:&#xA;&#xA;That&#39;s... kind of disheartening to hear. 😞&#xA;Well, if anyone has any ideas to make good mental health apps, that sounds like something that could benefit from a new contender in this space, a new free contender.&#xA;&#xA;Jeremy:&#xA;&#xA;For sure. Definitely.&#xA;&#xA;Alena:&#xA;&#xA;Or paid.&#xA;&#xA;Jeremy:&#xA;&#xA;Or paid!&#xA;&#xA;Alena:&#xA;&#xA;I&#39;m not against paid open source applications.&#xA;&#xA;Jeremy:&#xA;&#xA;Yeah. Open core or other models.&#xA;NOOO!! You must starve for your work. 😈&#xA;Absolutely.&#xA;You know, I&#39;d love to do something similar [to] this – make some kind of contribution to the queer community in my... tech bro way.&#xA;You know, convince them I&#39;m on their side.&#xA;&#xA;Alena:&#xA;&#xA;Yeah.&#xA;&#xA;Jeremy:&#xA;&#xA;It would be nice to [perhaps] fork this and do something with that, maybe with a different data set.&#xA;I like the idea of a locator app of things that are mappable.&#xA;It makes it very tangible, you know.&#xA;&#xA;Alena:&#xA;&#xA;This application is GPL 3.0, sooo have at it! 🥳&#xA;&#xA;Jeremy:&#xA;&#xA;Hey, there we go!&#xA;Well, it seems like all the work was in the dataset preparation anyway.&#xA;&#xA;Alena:&#xA;&#xA;Reskin it.&#xA;Go for it.&#xA;&#xA;Jeremy:&#xA;&#xA;All right.&#xA;Perhaps I will.&#xA;That could be kind of fun. 🙂&#xA;]]&gt;</description>
      <content:encoded><![CDATA[<hr>

<h3 id="jeremy" id="jeremy">Jeremy:</h3>

<p>If you have to summarize your overall system architecture with this app – we&#39;ve touched on <a href="https://symfony.com/" rel="nofollow">Symfony</a>, on your ORM – I already forgot the name of it again...</p>

<h3 id="alena" id="alena">Alena:</h3>

<p><a href="https://github.com/doctrine/orm" rel="nofollow">Doctrine</a>.</p>

<h3 id="jeremy-1" id="jeremy-1">Jeremy:</h3>

<p>Doctrine, right.</p>

<h3 id="alena-1" id="alena-1">Alena:</h3>

<p>For overall architecture, my site is a <a href="https://en.wikipedia.org/wiki/LAMP_%28software_bundle%29" rel="nofollow">LAMP</a> application.
It is running with Ubuntu, <a href="https://httpd.apache.org/" rel="nofollow">Apache</a>, <a href="https://www.php.net/releases/8.1/en.php" rel="nofollow">PHP 8.1</a> and <a href="https://www.postgresql.org/" rel="nofollow">PostgreSQL</a>.
In your typical LAMP stack, the M usually stands for MySQL, but in this case, I&#39;m running with PostgreSQL.
And there are other components that are not web server components.
There is an asynchronous queue system that is at play as well which processes all of the background work.</p>

<h3 id="jeremy-2" id="jeremy-2">Jeremy:</h3>

<p>What&#39;s that? <em>referring to queue system</em></p>

<h3 id="alena-2" id="alena-2">Alena:</h3>

<p>That is another Symfony component.
It&#39;s the <a href="https://symfony.com/doc/current/components/messenger.html" rel="nofollow">Symfony Messenger component</a>.</p>

<h3 id="jeremy-3" id="jeremy-3">Jeremy:</h3>

<p>Messenger.</p>

<h3 id="alena-3" id="alena-3">Alena:</h3>

<p>Messengers -
You could think of it as a system where there&#39;s a database table of queued jobs to do, and a worker process just sits there listening, saying, “Check the database. Do I have any work to do? Do I have any work to do?”
And when any new rows end up in the jobs table, the queue worker says, “Oh, there&#39;s work to do.”
It grabs the row out of the queue, processes it, runs the job, and continues checking out work until there&#39;s no work left to do.
This kind of enables an asynchronous style of programming that currently is not a native language feature of PHP at this point. In PHP, you can&#39;t really create a bunch of promises and await all of those promises to finish like you would in Javascript.
So, having a queue worker system allows you to build asynchronous features with a slightly different approach.
In this case, it would be more of a system where you dispatch work to the queue, and your queue worker, who&#39;s sitting there listening in the background, will pick it up and work on it.
When writing code for a web server, you usually want web requests to finish as quickly as possible because you have a user who&#39;s sitting there who&#39;s either clicked a button, or who&#39;s refreshed the page, and they want to see something come back as soon as possible.
You should send a response back to the user within a few hundred milliseconds or more to give the confirmation of saying, “Hey, the thing has been queued up to be worked on” or “We&#39;re working on it”.
That can give a sense of confidence or a sense that your app is speedy or that things are working to the user.
Whereas if your page sat there for five, ten seconds while something really long is running -
that&#39;s something that, as far as user experience goes, is something you don&#39;t want the user to be stuck waiting for.</p>

<h3 id="jeremy-4" id="jeremy-4">Jeremy:</h3>

<p>Of course, got to reassure the users that progress is happening, things are moving along.
I like the way you work around the lack of native async functionality.
It&#39;s interesting to think about.
The whole concept of workers is really cool; [it&#39;s] something that goes under discussed.
When I learned programming [the field] was all [about] object-oriented this and that.
It&#39;s wild to think how far things have come around.
I know there&#39;s that one language that has workers as its fundamental core construct of doing anything.
I forget what that one&#39;s called. [Editor&#39;s note: It&#39;s <a href="https://www.erlang.org/" rel="nofollow">Erlang/OTP</a>.]</p>

<h3 id="alena-4" id="alena-4">Alena:</h3>

<p>You&#39;ll have to mention that one to me. I&#39;m curious.</p>

<h3 id="jeremy-5" id="jeremy-5">Jeremy:</h3>

<p>Oh, yes, I will. It&#39;s not OCaml. It&#39;s another one of those weird, niche, functional languages.
It&#39;s not Clojure either. I forget; I&#39;ll get back to you on that.
I know that on the web these days you have web workers, which you can use to run stuff outside of the main process.
I&#39;m pretty sure that&#39;s how those work. I don&#39;t quite remember... but it&#39;s cool that [there are] parallel approaches to the same problem.</p>

<h3 id="alena-5" id="alena-5">Alena:</h3>

<p>You bet.</p>

<h3 id="jeremy-6" id="jeremy-6">Jeremy:</h3>

<p>Just because you&#39;re lacking in a feature async/await doesn&#39;t mean you don&#39;t have a robust system in place.</p>

<h3 id="alena-6" id="alena-6">Alena:</h3>

<p>Correct.
You can still do the same kind of asynchronous/multiple things at a time approach with a queue worker system.
Because... a single worker can only do one thing at a time, true, but you can also spin up multiple workers, so that you can process multiple pieces of work at a time.
Theoretically, an app with a worker approach, depending on how many workers you&#39;ve spun up, could be much faster than a single process application that has asynchronous components.
But that&#39;s all something that could be heavily, heavily debated about what approach is best for what thing.</p>

<h3 id="jeremy-7" id="jeremy-7">Jeremy:</h3>

<p>Right, right. But you always have to factor [in] scaling if you want your app to be used by anyone.
These are good conversations to have early.</p>

<h3 id="alena-7" id="alena-7">Alena:</h3>

<p>Exactly. There&#39;s no one best tool out there.
There are so many different tools and they are all equally well suited for different things.</p>

<h3 id="jeremy-8" id="jeremy-8">Jeremy:</h3>

<p>That sounds just about right. Well, I know that there&#39;s a worst tool for everything and it&#39;s the official KDE tool 🤡 No, I&#39;m just kidding!</p>

<h3 id="alena-8" id="alena-8">Alena:</h3>

<p>There&#39;s a lot of KDE bashing going on. 🤨</p>

<h3 id="jeremy-9" id="jeremy-9">Jeremy:</h3>

<p>I&#39;m a huge KDE aficionado; I love KDE, and so... as a hardcore KDE user, I reserve the right to trash KDE for free.</p>

<h3 id="alena-9" id="alena-9">Alena:</h3>

<p>Ya trash them because ya love them. 🥰</p>

<h3 id="jeremy-10" id="jeremy-10">Jeremy:</h3>

<p>Exactly.</p>

<h3 id="alena-10" id="alena-10">Alena:</h3>

<p>You want them to be great.</p>

<h3 id="jeremy-11" id="jeremy-11">Jeremy:</h3>

<p>I would feel bad if it was any other projects, but I don&#39;t feel bad for KDE.
I&#39;ve put way too much of my life into banging my head against the wall, trying to get KDE software to do what it&#39;s supposed to do.
Anyway, 😅 was there anything that got you banging your head against the wall working on this project?
What were some challenges you ran into? Was there anything that really took some time to get over?
This is a pretty big app. There&#39;s a lot of code to it. It certainly took a while to make.</p>

<h3 id="alena-11" id="alena-11">Alena:</h3>

<p>Yeah, pieces that took quite a large time to get just right is... number one, pulling data in.
Pulling data into the app, like the clinics, as well as processing them.
This was a problem that took me a while to find the right approach.
I knew that I wanted to pull in clinics from Erin Reed&#39;s data source, and I did not want any duplicates of them.
I wanted to keep them up to date over time.
The Erin Reed data source is a user Google Map, which can be exported in KML format, which is kind of like an XML maps format.
I was able to write a scraper that would pull down that XML, parse through it, and create a bunch of database objects for each of those clinics.
But the hard part is, over time, how do I make sure that I&#39;m not continually re-importing the same ones?
I ran into another problem that these clinic or location records did not have any kind of unique identifier about them.</p>

<h3 id="jeremy-12" id="jeremy-12">Jeremy:</h3>

<p>Oh no.</p>

<h3 id="alena-12" id="alena-12">Alena:</h3>

<p>Which is... problematic, because there&#39;s not really a great way to check if I have the record already other than taking some of the properties of the clinic and doing comparisons on records, like “do these couple fields match?”, and doing database searches like that.
I landed on creating a hash of a couple of the clinic properties and saving the hashes. With the hashes of the clinics I have already, I can compare against the hash of new clinics, so that I can quickly know whether or not I already pulled something in.
But what if I pull an updated clinic that has a piece of text slightly changed?
Well, the hash is going to differ, of course.
So the system is going to pull in that clinic, and now I have essentially two of the same thing, one which is slightly different from the other.
Ideally, I don&#39;t want three or more copies of the same clinic, as things change over time.
So my thought was, well, how can I figure out how to combine all of these duplicates, or flag all of these that are theoretically the same ones?
If I&#39;m going to pull in other datasets, like Southern Equality&#39;s dataset, I also want to be able to flag which of Southern Equality&#39;s clinics and which of Erin Reed&#39;s clinics are the same ones.
I wanted a process to be able to flag those so I spent a lot of time, a couple weeks, coming up with the right way to check for duplicate clinics.
So whenever a new clinic comes in, there&#39;s the first piece that determines whether or not it&#39;s already in the system and the clinic gets saved if a hash of it hasn&#39;t been saved already.
Once that happens, a job is sent to the queue worker to say, hey, we need to check for duplicates for this specific clinic.
The queue worker will pick up that job, then search the database for nearby clinics using lat-long coordinates as well as checking for clinics with similar names.
I spent a bunch of time figuring out how to do geo coordinate stuff with PostgreSQL and with Doctrine, the ORM, because I needed to do database searches on lat long coordinates.
I found a PostgreSQL extension, PostGIS, that allows you to store lat long coordinates and the extension will generate metadata that can be used to perform distance checks and more advanced geographical searches.
Probably most lat long operations you could think of are implemented in this PostgreSQL extension.
In this case, I was mostly interested in just the distance between two points. I was able to efficiently search my data to find what clinics were within a half mile or a mile of the new clinic that was imported.
And the next piece was, once I find clinics that are nearby to each other, how do I get as close as I can be, to know if they&#39;re duplicates or not?
So I landed on a solution with help from my brother.
He was very, very helpful in picking out a strategy that I could use to compare two different strings – a comparison technique called <a href="https://en.wikipedia.org/wiki/Levenshtein_distance" rel="nofollow">Levenshtein</a>.
Levenshtein is a method of counting the number of additions, modifications and removals you have to make to a string to make it look like another string.
Kind of like the distance between two strings; the changes you have to make, like do you add a character, do you remove a character, do you change a character to make two strings the same?
I used a PHP implementation of Levenshtein to do those string comparisons for the final judgment of “How likely are these two clinics to be the same?”</p>

<h3 id="jeremy-13" id="jeremy-13">Jeremy:</h3>

<p>Your last filter.</p>

<h3 id="alena-13" id="alena-13">Alena:</h3>

<p>I&#39;ve had very good success.
I have had very few false positives and have made the system automatically flag duplicates for me to review and then deal with.
I added some UI where you could review the duplicates that the system flagged and be able to resolve them by picking one of them to save.
So I just have to log in every so often to the system to see if any duplicates were found. There are a couple of resolution steps to do, rather than having to go through all the data either by hand or with a script. [Editor&#39;s note: I wonder if you could do this with makefiles and cron jobs.]</p>

<h3 id="jeremy-14" id="jeremy-14">Jeremy:</h3>

<p>Right.
That makes sense. Is that what&#39;s in the — where do you exactly do that? Is that what&#39;s in the admin page? I know [it] exists, but I can&#39;t see [it].</p>

<h3 id="alena-14" id="alena-14">Alena:</h3>

<p>So yeah, on the admin page, there&#39;s a view of how many clinics have been collected in total, how many new clinics have been recently pulled in, and how many unpublished clinics there are.
Because when new clinics are pulled in, they don&#39;t get automatically enabled in the search. I have to manually review them and say yes to them, as well as the duplicates the system flagged.
There&#39;s a quick link to just jump to the list of different duplicates.</p>

<h3 id="jeremy-15" id="jeremy-15">Jeremy:</h3>

<p>Makes sense. Your review queue of sorts.</p>

<h3 id="alena-15" id="alena-15">Alena:</h3>

<p>Yeah.</p>

<h3 id="jeremy-16" id="jeremy-16">Jeremy:</h3>

<p>Certainly quite a struggle. I didn&#39;t even think about all the data pre processing that you have to do to keep your dataset up to date.</p>

<h3 id="alena-16" id="alena-16">Alena:</h3>

<p>Oh, there&#39;s a lot of data pre processing, not even just pulling in the the clinics themselves, but also – how do you pull in the data used to search the clinics?
Like if a user wants to search via a zip code or they want to search via a city, how is my system supposed to know what&#39;s a city in the world? Or how should a city be converted to lat long coordinates? Or how do you get from a zip code to lat long coordinates?</p>

<h3 id="jeremy-17" id="jeremy-17">Jeremy:</h3>

<p>😰</p>

<h3 id="alena-17" id="alena-17">Alena:</h3>

<p>So I had to look for open data sets of cities in the United States and zip codes.
I landed on an open data set called GeoNames that has a couple fairly large data sets. They take about a half hour to fully import.
I had to write some console commands to pull down the zip files for them, process all the rows, and actually link everything up.
And that takes about a couple gigs worth of data. So it takes about 20, 25 minutes or so.</p>

<h3 id="jeremy-18" id="jeremy-18">Jeremy:</h3>

<p>Sure. Oh, wow.</p>

<h3 id="alena-18" id="alena-18">Alena:</h3>

<p>And so there&#39;s not just pulling in the clinics, but also pulling in those data sets to actually have what&#39;s needed to do the actual text search, or zip code search.</p>

<h3 id="jeremy-19" id="jeremy-19">Jeremy:</h3>

<p>Right. Oh, my. 😳
You have to be able to speak the same language, you know? You need one metric by which you can judge things. Getting everything nice and unified like that must be an insane amount of work to do, [especially] invisibly, under the hood.</p>

<h3 id="alena-19" id="alena-19">Alena:</h3>

<p>Yeah, when you type in your location, a zip code or a city, your search isn&#39;t going to anyone else.
My server has all of the locations saved in a couple database tables that I can query in MySQL.
I keep trying to say MySQL. I work in MySQL too much. So PostgreSQL queries just run to compare the search to any of the stored locations.</p>

<h3 id="jeremy-20" id="jeremy-20">Jeremy:</h3>

<p>Hmm, right. I noticed that code. That was really interesting. The code where the users location that they put in gets compared to a distance check. That little query you did in there was really interesting.</p>

<h3 id="alena-20" id="alena-20">Alena:</h3>

<p>It&#39;s not exactly perfect. The actual city name search needs some work. It doesn&#39;t always perfectly translate a search because it&#39;s using a likeness check in PostgreSQL to do fuzzy string matches to try to get as close to cities as it can.
It works a lot of the time, but try St. Paul, for example. The database is storing it as S-A-I-N-T Paul. But... a lot of times someone who might be searching for St. Paul might just type in S-T dot Paul.
That will not pull up the autocomplete on the site. It won&#39;t autocomplete to St. Paul, Minnesota right away. So that is one area for improvement, say, abbreviations of city names.
Or maybe even there needs to be a component that is able to auto convert those abbreviations into full names. You could get very magical with what&#39;s going on to actually convert that user input. I may have just given myself an idea for how to improve that.</p>

<h3 id="jeremy-21" id="jeremy-21">Jeremy:</h3>

<p>Oh boy! Looks like we need more datasets!! 😆</p>

<h3 id="alena-21" id="alena-21">Alena:</h3>

<p>I might need some more collaboration here 😅 This conversation has been helpful 🙂</p>

<h3 id="jeremy-22" id="jeremy-22">Jeremy:</h3>

<p>That is pretty cool. You know, the search part of it is interesting. If I had to make a suggestion, I think a ranking system of sorts would be a super [useful feature]. I have no clue how you&#39;d implement it, but it would be nice, you know? Because when I type in Minneapolis, the first thing comes up is Minneapolis, Kansas -
And I&#39;m like, what? Who cares about Minneapolis, Kansas? 🙄 There should be some kind of metric to [say] “I know what the most important Minneapolis is”. Maybe by population of the city.</p>

<h3 id="alena-22" id="alena-22">Alena:</h3>

<p>😂 That&#39;s true, that&#39;s true. I think I could be wrong, but I&#39;m pretty sure that there are population values in the Geonames dataset. I&#39;m pretty sure that might be something that can be pulled in.</p>

<h3 id="jeremy-23" id="jeremy-23">Jeremy:</h3>

<p>Well, because of this one single tiny nitpicky flaw, your app is terrible. 😤 Absolutely, you know, worst app ever. Not worth using. And you used PostgreSQL instead of the obviously based, glorious, much better MySQL.</p>

<h3 id="alena-23" id="alena-23">Alena:</h3>

<p>Daddy Oracle.</p>

<h3 id="jeremy-24" id="jeremy-24">Jeremy:</h3>

<p>How dare you? 😠</p>

<h3 id="alena-24" id="alena-24">Alena:</h3>

<p>Big Daddy Oracle. 😏</p>

<h3 id="jeremy-25" id="jeremy-25">Jeremy:</h3>

<p>🤣
[Only] praise [allowed]! I will accept no Oracular slander in this house. Could you tell me more? I know so little about the database side of things. Why <a href="https://www.postgresql.org/" rel="nofollow">PostgreSQL</a> over, say, <a href="https://mariadb.com/" rel="nofollow">MariaDB</a>?</p>

<h3 id="alena-25" id="alena-25">Alena:</h3>

<p>Honestly, I knew that PostgreSQL is quite big in the open source space. And I kind of wanted a chance to try it, give it a spin.
I kind of figured, “Well, if things are not working super well, within the first few weeks or so, it wouldn&#39;t be too hard, using an ORM, to switch from PostgreSQL to MySQL, or back to, say, MariaDB.
I haven&#39;t had any personal experience with MariaDB. I&#39;ve been told that it&#39;s kind of like a drop-in replacement for MySQL, which would be great to have that same kind of syntax and functionality that I expect.
Just minus, you know, the Big Daddy Oracle. 😁</p>

<h3 id="jeremy-26" id="jeremy-26">Jeremy:</h3>

<p>Right. 😆</p>

<h3 id="alena-26" id="alena-26">Alena:</h3>

<p>I kinda wanted to take PostgreSQL for a spin.</p>

<h3 id="jeremy-27" id="jeremy-27">Jeremy:</h3>

<p>Give it a shot. Yeah, why not?</p>

<h3 id="alena-27" id="alena-27">Alena:</h3>

<p>So far, I haven&#39;t run into any performance or specific lack of functionality that it didn&#39;t have compared to other relational database servers. I&#39;m quite happy with PostgreSQL. On another note, on what you said earlier – we should totally make an app called OpenSpores, a mushroom identification app with an open data set, where you can input different mushroom features and narrow down which shroom you&#39;re looking at.</p>

<h3 id="alena-28" id="alena-28">Alena:</h3>

<p>😂</p>

<h3 id="jeremy-28" id="jeremy-28">Jeremy:</h3>

<p>You know, maybe some computational photography stuff, although that gets kind of icky and proprietary.</p>

<h3 id="alena-29" id="alena-29">Alena:</h3>

<p>😔</p>

<h3 id="jeremy-29" id="jeremy-29">Jeremy:</h3>

<p>Who knows. Just food for thought and thought about food.</p>

<h3 id="alena-30" id="alena-30">Alena:</h3>

<p>Maybe we will have to make our own machine learning model for identifying mushrooms and make our own Friday night hack project of a mushroom identifier.</p>

<h3 id="jeremy-30" id="jeremy-30">Jeremy:</h3>

<p>Perhaps, perhaps. It&#39;s certainly an option. I think there&#39;s certainly some intersectionality.
Anyone interested in networking should be interested in mushrooms, I think.</p>

<h3 id="alena-31" id="alena-31">Alena:</h3>

<p>😆</p>

<h3 id="jeremy-31" id="jeremy-31">Jeremy:</h3>

<p>Perhaps that&#39;s just me. You know, we need more alternatives to these hot technologies.
They&#39;re so, so proprietary. I really like especially how this app... it feels professional.</p>

<h3 id="alena-32" id="alena-32">Alena:</h3>

<p>Oh, thank you. ☺️</p>

<h3 id="jeremy-32" id="jeremy-32">Jeremy:</h3>

<p>You wouldn&#39;t think it was made by a single person.</p>

<h3 id="alena-33" id="alena-33">Alena:</h3>

<p>Oh, thank you. 😊</p>

<h3 id="jeremy-33" id="jeremy-33">Jeremy:</h3>

<p>[You&#39;d think it was made by a] team subdivision of, I don&#39;t know, some sort of activist group.</p>

<h3 id="alena-34" id="alena-34">Alena:</h3>

<p>Someone told me my app look quite corporate. 🤣</p>

<h3 id="jeremy-34" id="jeremy-34">Jeremy:</h3>

<p>Oh! 😵 Oh no.</p>

<h3 id="alena-35" id="alena-35">Alena:</h3>

<p>And I&#39;m like, oh, no! 😅</p>

<h3 id="jeremy-35" id="jeremy-35">Jeremy:</h3>

<p>Oh, no, no. I&#39;ll make you a style sheet to make it look like a dive bar.
I&#39;ll add some Web 1.0 flair.</p>

<h3 id="alena-36" id="alena-36">Alena:</h3>

<p>Excellent.</p>

<h3 id="jeremy-36" id="jeremy-36">Jeremy:</h3>

<p>But, you know, it&#39;s cool to see this sort of... grassroots free software activism in the place of more traditional, official, state or corporate offerings.
And it&#39;s kind of a radical model you have here.
Do you have any other areas of social malaise that you think would benefit from similar projects like this? from active open source [development]?
What do you think needs to be made less proprietary, if you could choose?</p>

<h3 id="alena-37" id="alena-37">Alena:</h3>

<p>Things that could be made less proprietary... 🤔
My focus has been tools for the LGBTQ space.
I&#39;m sure there could be quite a lot more search tools created for all sorts of different specialized medical care.
But for any particular applications, what would I like to see more open source of? hmm...</p>

<h3 id="jeremy-37" id="jeremy-37">Jeremy:</h3>

<p>I mean, for my money, I talked – like a year ago – to my boyfriend about making a open source gay dating app.
But Lord knows [certain reactionary] heterosexual people would riot if they found out that was a thing. 😒</p>

<h3 id="alena-38" id="alena-38">Alena:</h3>

<p>😞
I&#39;m sure there&#39;s a plethora of great ideas that could be used for that.
Just even glancing at my phone – I&#39;m using a proprietary medication tracker app.
I&#39;d love it if there was something I could use that had a good hook into a federal medication database, to allow me to quickly add meds without all of the proprietary, nasty tracking features that are probably going on under the hood.</p>

<h3 id="jeremy-38" id="jeremy-38">Jeremy:</h3>

<p>Mozilla released their report last year – <a href="https://foundation.mozilla.org/en/privacynotincluded/" rel="nofollow">Privacy Not Included</a> – that talked about all these different apps in the Google Play store and how the permissions that the [Play store page] said the app would need had no correlation with the actual privacy policies on the apps&#39; website.
I saw an email a few months ago [from them] – they&#39;ve done updates on this since, and the worst performing section probably shouldn&#39;t be any surprise:
Mental health apps.</p>

<h3 id="alena-39" id="alena-39">Alena:</h3>

<p>Geez.</p>

<h3 id="jeremy-39" id="jeremy-39">Jeremy:</h3>

<p>People who need care?
Tell me all your deepest secrets so that I can monetize them.
Doesn&#39;t that sound fun? 🤑</p>

<h3 id="alena-40" id="alena-40">Alena:</h3>

<p>That&#39;s... kind of disheartening to hear. 😞
Well, if anyone has any ideas to make good mental health apps, that sounds like something that could benefit from a new contender in this space, a new free contender.</p>

<h3 id="jeremy-40" id="jeremy-40">Jeremy:</h3>

<p>For sure. Definitely.</p>

<h3 id="alena-41" id="alena-41">Alena:</h3>

<p>Or paid.</p>

<h3 id="jeremy-41" id="jeremy-41">Jeremy:</h3>

<p>Or paid!</p>

<h3 id="alena-42" id="alena-42">Alena:</h3>

<p>I&#39;m not against paid open source applications.</p>

<h3 id="jeremy-42" id="jeremy-42">Jeremy:</h3>

<p>Yeah. Open core or other models.
NOOO!! You must starve for your work. 😈
Absolutely.
You know, I&#39;d love to do something similar [to] this – make some kind of contribution to the queer community in my... tech bro way.
You know, convince them I&#39;m on their side.</p>

<h3 id="alena-43" id="alena-43">Alena:</h3>

<p>Yeah.</p>

<h3 id="jeremy-43" id="jeremy-43">Jeremy:</h3>

<p>It would be nice to [perhaps] fork this and do something with that, maybe with a different data set.
I like the idea of a locator app of things that are mappable.
It makes it very tangible, you know.</p>

<h3 id="alena-44" id="alena-44">Alena:</h3>

<p>This application is GPL 3.0, sooo have at it! 🥳</p>

<h3 id="jeremy-44" id="jeremy-44">Jeremy:</h3>

<p>Hey, there we go!
Well, it seems like all the work was in the dataset preparation anyway.</p>

<h3 id="alena-45" id="alena-45">Alena:</h3>

<p>Reskin it.
Go for it.</p>

<h3 id="jeremy-45" id="jeremy-45">Jeremy:</h3>

<p>All right.
Perhaps I will.
That could be kind of fun. 🙂</p>
]]></content:encoded>
      <author>bread-z</author>
      <guid>https://blog.cyberia.club/read/a/3eu182ecil</guid>
      <pubDate>Thu, 05 Oct 2023 03:14:43 +0000</pubDate>
    </item>
    <item>
      <title>decompiling astolfo gay sounds</title>
      <link>https://blog.cyberia.club/segfault/decompiling-astolfo-gay-sounds</link>
      <description>&lt;![CDATA[so you may see this and be like &#34;what the fuck are you talking about&#34;&#xA;&#xA;so recently some person called gaym development.east made a game called astolfo gay sounds but it is not compatible with most modern devices, so i decided to decompile it&#xA;&#xA;part 1: the downloading&#xA;so i just went to https://apkpure.com/astolfo-gay-sounds/com.astolfogaysounds/ and downloaded it, there are probably better ways of getting around with this&#xA;&#xA;part 2: the juicy shit&#xA;img src=&#34;https://files.catbox.moe/mqmi67.png&#34; /&#xA;&#xA;so using apklab on vscode i decompiled the source and just went to javasrc/com/fcupchan/astolfogaysounds/MainActivity.java and one of the first things i see is the following:&#xA;img src=&#34;https://files.catbox.moe/9do9hr.png&#34; /&#xA;img src=&#34;https://files.catbox.moe/3zsyl2.png&#34; /&#xA;&#xA;i also see a lot of references to com.astolfogaysounds.R.raw.gaysoundX so i will poke into those in the next part coming.. right now&#xA;&#xA;part 3: the assets&#xA;well first up here is an image of the gameplay:&#xA;img src=&#34;https://play-lh.googleusercontent.com/AtLVbWCQF-Z1KFPt1Yc5VO09DcDQH9w884kUGhxQjrRHA5BncZwasTKpXcRRTrjl1Q=w2560-h1440&#34; /&#xA;&#xA;mainpicture.png&#xA;img src=&#34;https://files.catbox.moe/nsymt1.png&#34; /&#xA;&#xA;gay\sound\1.mp3 - gay\sound\_13.mp3&#xA;audio src=&#34;https://files.catbox.moe/h2mioq.mp3&#34; controls/audio&#xA;audio src=&#34;https://files.catbox.moe/5vb5o0.mp3&#34; controls/audio&#xA;audio src=&#34;https://files.catbox.moe/4vnczm.mp3&#34; controls/audio&#xA;audio src=&#34;https://files.catbox.moe/c1xbjv.mp3&#34; controls/audio&#xA;audio src=&#34;https://files.catbox.moe/diqjcq.mp3&#34; controls/audio&#xA;audio src=&#34;https://files.catbox.moe/9zbwl0.mp3&#34; controls/audio&#xA;audio src=&#34;https://files.catbox.moe/ddca4m.mp3&#34; controls/audio&#xA;audio src=&#34;https://files.catbox.moe/r01p2h.mp3&#34; controls/audio&#xA;audio src=&#34;https://files.catbox.moe/6tm3v6.mp3&#34; controls/audio&#xA;audio src=&#34;https://files.catbox.moe/we2z05.mp3&#34; controls/audio&#xA;audio src=&#34;https://files.catbox.moe/rmc6ob.mp3&#34; controls/audio&#xA;audio src=&#34;https://files.catbox.moe/f0lvpi.mp3&#34; controls/audio&#xA;audio src=&#34;https://files.catbox.moe/87o45h.mp3&#34; controls/audio&#xA;&#xA;bye&#xA;well thats all i hope you found this entertaining as i just wasted a lot of my time]]&gt;</description>
      <content:encoded><![CDATA[<p>so you may see this and be like “what the fuck are you talking about”</p>

<p>so recently some person called gaym development.east made a game called <a href="https://play.google.com/store/apps/details?id=com.astolfogaysounds" rel="nofollow">astolfo gay sounds</a> but it is not compatible with most modern devices, so i decided to decompile it</p>

<h2 id="part-1-the-downloading" id="part-1-the-downloading">part 1: the downloading</h2>

<p>so i just went to <a href="https://apkpure.com/astolfo-gay-sounds/com.astolfogaysounds/" rel="nofollow">https://apkpure.com/astolfo-gay-sounds/com.astolfogaysounds/</a> and downloaded it, there are probably better ways of getting around with this</p>

<h2 id="part-2-the-juicy-shit" id="part-2-the-juicy-shit">part 2: the juicy shit</h2>

<p><img src="https://files.catbox.moe/mqmi67.png"/></p>

<p>so using apklab on vscode i decompiled the source and just went to <code>java_src/com/fcupchan/astolfogaysounds/MainActivity.java</code> and one of the first things i see is the following:
<img src="https://files.catbox.moe/9do9hr.png"/>
<img src="https://files.catbox.moe/3zsyl2.png"/></p>

<p>i also see a lot of references to <code>com.astolfogaysounds.R.raw.gay_sound_X</code> so i will poke into those in the next part coming.. right now</p>

<h2 id="part-3-the-assets" id="part-3-the-assets">part 3: the assets</h2>

<p>well first up here is an image of the gameplay:
<img src="https://play-lh.googleusercontent.com/AtLVbWCQF-Z_1KFPt1Yc5VO09DcDQH9w884kUGhxQjrRHA5BncZwasTKpXcRRTrjl1Q=w2560-h1440"/></p>

<p>main_picture.png
<img src="https://files.catbox.moe/nsymt1.png"/></p>

<p>gay_sound_1.mp3 – gay_sound_13.mp3
<audio src="https://files.catbox.moe/h2mioq.mp3" controls=""></audio>
<audio src="https://files.catbox.moe/5vb5o0.mp3" controls=""></audio>
<audio src="https://files.catbox.moe/4vnczm.mp3" controls=""></audio>
<audio src="https://files.catbox.moe/c1xbjv.mp3" controls=""></audio>
<audio src="https://files.catbox.moe/diqjcq.mp3" controls=""></audio>
<audio src="https://files.catbox.moe/9zbwl0.mp3" controls=""></audio>
<audio src="https://files.catbox.moe/ddca4m.mp3" controls=""></audio>
<audio src="https://files.catbox.moe/r01p2h.mp3" controls=""></audio>
<audio src="https://files.catbox.moe/6tm3v6.mp3" controls=""></audio>
<audio src="https://files.catbox.moe/we2z05.mp3" controls=""></audio>
<audio src="https://files.catbox.moe/rmc6ob.mp3" controls=""></audio>
<audio src="https://files.catbox.moe/f0lvpi.mp3" controls=""></audio>
<audio src="https://files.catbox.moe/87o45h.mp3" controls=""></audio></p>

<h1 id="bye" id="bye">bye</h1>

<p>well thats all i hope you found this entertaining as i just wasted a lot of my time</p>
]]></content:encoded>
      <author>segfault</author>
      <guid>https://blog.cyberia.club/read/a/c2ff4vccyj</guid>
      <pubDate>Thu, 27 Jul 2023 02:53:34 +0000</pubDate>
    </item>
    <item>
      <title>tiny emulators right in your browser</title>
      <link>https://blog.cyberia.club/electron271/tiny-emulators-right-in-your-browser</link>
      <description>&lt;![CDATA[so recently i have discovered a page called tiny emulators, which i think is really interesting&#xA;&#xA;img src=&#34;https://i.imgur.com/QJ8M2QK.png&#34; /&#xA;it is called &#34;tiny emulators&#34; and using the power of web assembly lets you mess around with a variety of emulators right in your browser, from the 6502 to the z1013&#xA;&#xA;check it out here]]&gt;</description>
      <content:encoded><![CDATA[<p>so recently i have discovered a page called tiny emulators, which i think is really interesting</p>

<p><img src="https://i.imgur.com/QJ8M2QK.png"/>
it is called “tiny emulators” and using the power of web assembly lets you mess around with a variety of emulators right in your browser, from the 6502 to the z1013</p>

<p>check it out <a href="https://floooh.github.io/tiny8bit/" rel="nofollow">here</a></p>
]]></content:encoded>
      <author>electron271</author>
      <guid>https://blog.cyberia.club/read/a/mag9vevtcm</guid>
      <pubDate>Mon, 17 Jul 2023 02:34:18 +0000</pubDate>
    </item>
    <item>
      <title>Locating Trans Healthcare with MyChoiceHRT: an interview with Alena, pt. 1</title>
      <link>https://blog.cyberia.club/bread-z/locating-trans-healthcare-with-mychoicehrt-an-interview-with-alena-pt</link>
      <description>&lt;![CDATA[Welcome to Cyberia Chats!&#xA;&#xA;This is the start of an interview series here at Cyberia where I, your host, Bread, will be interviewing members of the Cyberia Computer Club about projects they&#39;ve been working on. The folks here at Cyberia write some top-notch software - often with little to no recognition! They deserve better. We have an enormous wealth of talent here, just dying to shine.&#xA;&#xA;Hopefully, these talks will inspire folks in Cyberia to contribute to each other&#39;s projects, or maybe just take a look at the code, or perhaps just talk to each other a bit more. Here to begin the conversation with me is Alena, the talented developer of mychoicehrt.org, an open source website that trans folks can use to find nearby healthcare centers.&#xA;&#xA;We (meticulously!) edited this interview for clarity. If you&#39;d like to hear the original interview, or see the original transcript generated by Whisper, DM me on Matrix at @breadzeppelin:cyberia.club.&#xA;&#xA;---&#xA;&#xA;Jeremy:&#xA;And hello there! We are live with our very first Cyberia Chat. This is an interview series that I, Bread here, hope to start - where we do deep dives into the amazing projects that all the talented folks in Cyberia are working on and have worked on to try to pick their brains to get a sense of what motivates them - so that they can feel like they&#39;re part of the community, that people care about their work, you know? I mean, so much of my whole career is spent doing meaningless bullshit work that no one will ever appreciate, so I&#39;d hope that we developers... [I&#39;d hope that] the stuff that we&#39;re doing outside of work gets appreciated, you know?&#xA;Alena:&#xA;Yeah, it takes a lot of energy to, if you have a full-time job, really put in that same level of effort in another project, because there&#39;s always the fear that you&#39;re gonna...burn out on that specific type of skill, you know?&#xA;I feel that it&#39;s important to recognize when you&#39;re using a skill too much, or pushing yourself too hard - because it&#39;s a lot.&#xA;Jeremy:&#xA;No, what are you talking about? It&#39;s easy!&#xA;It only took you 196 commits...&#xA;Nooo, it&#39;s nothing.&#xA;Alena:&#xA;😆 You know, over the course of like three months.&#xA;Jeremy:&#xA;No, whatever!&#xA;Alena:&#xA;Working full-time on it.&#xA;I quit my job to do this for three months.&#xA;Jeremy:&#xA;🤣 Oh my god.&#xA;Alena:&#xA;😂&#xA;Jeremy:&#xA;Maybe you&#39;ll get some new folks on Ko-Fi or something after this. I hope so, Alena.&#xA;I&#39;ve always thought this was a pretty... this was one of those things that when I saw it, I was like,&#xA;&#34;Whoa! Why is everyone not freaking out? This is crazy! Is no one... what? Is no one...?&#34;&#xA;Alena:&#xA;I hope that I&#39;ll get a small amount of traffic, and I hope that the site has been useful and is working for the folks that have found it.&#xA;Jeremy:&#xA;I hope so too, you know?&#xA;I hope you&#39;re getting some good user feedback and all that. That&#39;d be cool.&#xA;I feel like you&#39;re making a difference in the community. I guess that is your goal, right?&#xA;Alena:&#xA;Yeah.&#xA;Jeremy:&#xA;Could you tell me what drew you to this issue and how you got inspired to start this [project] in the first place?&#xA;Alena:&#xA;Yeah, so I&#39;ve been following the whole legislative storm of different bills that are either restricting or completely outright banning certain types of care in the United States.&#xA;And specifically, I feel passionate about following what&#39;s going on with transgender care and informed consent medical care.&#xA;I&#39;ve been following an activist named Erin Reed who provides resources for keeping up-to-date on legislation that affects the transgender community. She also maintains a list of about 900 or so informed consent clinics in the US, which is a colossal amount of work for one person to do.&#xA;Jeremy:&#xA;That&#39;s just one person!? 😳&#xA;Alena:&#xA;Yeah, clinics in the US and a handful of clinics in a couple of other countries too. It&#39;s a very large data set that I&#39;ve been following for a while.&#xA;My idea was to see if there was a way to help people search it a little easier, to be able to enter just a couple of location details and have it instantly pull up a list of the clinics from the data set - to make using that resource even easier.&#xA;Since Erin&#39;s map uses Google My Maps, it lacks the same features that you would typically think of Google Maps to have, like searches using your location or advanced searches for things near me.&#xA;If you want to find clinics near to you on the map, you have to know where you are and find your location which involves scanning over the map to find your region or knowing the latitude and longitude of your town. Then it&#39;s a process of visually finding what clinics are close enough.&#xA;So my goal is to remove that step of having to manually search the map and quickly pull up the closest informed consent clinics.&#xA;The project first started as pulling in all the clinics from Erin Reed&#39;s map to catalog them and make them searchable, but it kind of grew a little more from there.&#xA;Jeremy:&#xA;Ooooh!&#xA;Alena:&#xA;I was thinking I could also pull in other data sources as well. I added one other data source to my website, which is the Southern Equality Trans in the South list of transgender care providers. My site is only importing their informed consent clinics, but they have a whole lot of other resources not just confined to informed consent clinics. They have a search interface to find more transgender - even general LGBTQ+ friendly - care; they might be a resource to look for.&#xA;Jeremy:&#xA;Glad you&#39;re shouting them out. Pretty impressive.&#xA;You know, a good amalgamation of very important, relevant data sets, you know, data science and data sets...&#xA;These are words that sound so abstract, I feel like, to a lot of people - but no, this is useful, you know?&#xA;And this is the kind of thing where inaccessible, bad UX gets in the way of people,&#xA;especially with the earlier thing, the Erin Reeds map, you know, Google user map.&#xA;Poorly integrated, old Google project....&#xA;Alena:&#xA;😅 Yeah. People could do with a little less Google tracking them, especially when it comes to medical care.&#xA;Jeremy:&#xA;🤯&#xA;Whoa - that&#39;s also a good point. Privacy side of things. Better to just have your resource, which, you know, is open source.&#xA;People can see it [without fear of being tracked]. They can deploy the web app themselves, I guess, in theory.&#xA;But yeah, that&#39;s awesome.&#xA;I didn&#39;t realize that that whole Erin Reed dataset was compiled by [just] that one person.&#xA;Alena:&#xA;Yeah, Erin is doing an immense amount of work and should be applauded for it -&#xA;because they are still maintaining that map and still doing very, very good work.&#xA;Jeremy:&#xA;It&#39;s not over.&#xA;Alena:&#xA;Yeah.&#xA;The goal is a resource you can quickly find clinics on, quickly find the care you need, all while not having any kind of tracking in the midst.&#xA;My site&#39;s not tracking anyone who comes to it.&#xA;Well, with the exception of the contact feedback form -&#xA;Whether HCaptcha is doing any, you know, any particular logging of HTTP traffic when the CAPTCHA handshake is going on - that&#39;s the part I&#39;m not as confident about 😬&#xA;But at least the main search interface -&#xA;Jeremy:&#xA;Woooooow. Wooow! 😂&#xA;Interview over. Terrible app; not private.&#xA;Alena:&#xA;Oh no. It&#39;s all gone. It&#39;s all gone.&#xA;Jeremy:&#xA;Game over, Alena.&#xA;Alena:&#xA;It&#39;s game over now.&#xA;Jeremy:&#xA;Why&#39;d you blow it like that? 😆&#xA;Alena:&#xA;Oh, I know. I know. 😅&#xA;I wanted to try to keep bots from spamming my contact form.&#xA;So I was like, “Dang it! The tried and tested CAPTCHA service.”&#xA;I suppose one could host their own CAPTCHA.&#xA;I&#39;m sure there has to be some self-hosted option.&#xA;Jeremy:&#xA;Doesn&#39;t Forrest has his own CAPTCHA service? Maybe you can switch to using that.&#xA;Alena:&#xA;Ooh, there we go. There we go. Gotta get in contact with Forest.&#xA;Jeremy:&#xA;Right, see!? 🤩 This is why we need more cross-pollination, you know? We have our own Cyberia toolkits going on.&#xA;Alena:&#xA;Oooooh - Cyberia CAPTCHA! 😄&#xA;Jeremy:&#xA;Hey-ooo 🤯&#xA;Alena:&#xA;Hosted on Capsul. Woo! 🎆&#xA;Jeremy:&#xA;CAPTCHA on Capsul. Oh snap. Alright, now we&#39;re cooking... but let&#39;s move on.&#xA;Glad to hear the grounding here - fighting for something you care about.&#xA;Alena:&#xA;Yeah :D &#xA;Jeremy:&#xA;This is a field where privacy really matters.&#xA;I remember last year when Roe v. Wade got overturned because, you know, we live in a 10th, 11th world country -bottom of the barrel country court system; but I digress.&#xA;You know, when that was overturned, everyone started freaking out about their period trackers [and] stuff like that.&#xA;Alena:&#xA;Rightly so, because there&#39;s a lot of those medical-oriented applications that are logging all of that data - and while a lot of them might not be blatantly using it for tracking that specific user,&#xA;those are just goldmines of people&#39;s personal health information, too - if those ever get leaked, and if there&#39;s anything personally identifiable in them, that&#39;s not good, to put it lightly.&#xA;Yeah.&#xA;Jeremy:&#xA;Overnight, I feel like, a lot of people went from, &#34;Oh, who cares about my data? Everyone has all of my data,&#34;&#xA;to &#34;Oh my god, wait, I really need some privacy right now,&#34; especially if you are a woman.&#xA;\sarcasm\&#xA;And, you know, trans people, well, lord knows, they&#39;re certainly not under attack anywhere.&#xA;Noooo, no, definitely not.&#xA;\/sarcasm\&#xA;Alena:&#xA;Yikes.&#xA;It&#39;s a tough time.&#xA;Jeremy:&#xA;It is - but I think that projects like this are important to show that there is good stuff that can happen in the programming space.&#xA;A lot of the folks I talk to who care about trans rights are generally non-techie people.&#xA;They&#39;re maybe more bookish, artsy types. [In] general, [the] leftist folks I hang out with are oftentimes Luddites. I don&#39;t mean to use that [as] a derogatory term.... [I just mean that they&#39;re] skeptical of large tech companies.&#xA;I get that [concern] - so I think it&#39;s important that we have stuff like this to [say], &#34;Hey, we can help! Technology is a tool.&#xA;We can use it. We can do good stuff with it, even if that tool is PHP.&#34;&#xA;Could you tell me a bit - \bursts into laughter\*😆&#xA;Alena:&#xA;Ooooh. 🤨&#xA;&#34;Even if that tool is PHP&#34;? I feel a little attacked here.&#xA;Jeremy:&#xA;Attacked!? \poorly feigning ignorance\ 🤣&#xA;Alena:&#xA;😆&#xA;You know, PHP is--&#xA;Jeremy:&#xA;All right, tell me about this terrible-- na na na 😆&#xA;I&#39;ve been reading some of the docs for PHP, and it seems that PHP has turned around quite a bit in recent years.&#xA;A lot of new features have been added to the language. It&#39;s pretty interesting, some of the stuff that the [language has] these days.&#xA;I mean, [it has] just-in-time compilation [now]. They&#39;re adding Java style [compilation] to PHP.&#xA;That must be good for performance, right?&#xA;Alena:&#xA;PHP is slowly, slowly becoming a more strictly typed, less dynamic programming language.&#xA;Slowly but surely locking things down – adding a full, strict type system in, if you want to use it.&#xA;Cleaning up older functions and making them more consistent. Making changes under the hood for performance and things like just-in-time compilation. If you have a web server that&#39;s written entirely in PHP, without any use of Apache, features like just-in-time compilation can help immensely with those types of applications.&#xA;So, yeah, there&#39;s a lot of modernization going on in the PHP project. ☺️&#xA;Jeremy:&#xA;Very cool, very cool. I&#39;m sure it must have changed a lot over the years as you&#39;ve been working [within the ecosystem].&#xA;There was quite a lot of neat little aspects of the architecture [that] I saw, [that] I learned about as I was going through this.&#xA;Stuff like Symfony, and... what&#39;s it called, the ORM that you use?&#xA;Alena:&#xA;Yes, Doctrine.&#xA;Jeremy:&#xA;Yep, that one. That was pretty interesting.&#xA;You know, I am someone who is just learning the PHP ecosystem now.&#xA;It&#39;s kind of fun! This is a fun little peek into the [PHP] world to try to learn it[s mysterious ways~].&#xA;What are some of your favorite little - in the PHP zone, the PHP space, the environment - what are some interesting little projects happening that have inspired you, as a developer?&#xA;Alena:&#xA;Ooh... projects in the PHP space that have inspired me...&#xA;...well, I started out doing PHP dev just through work.&#xA;That&#39;s how I kind of started out getting into that zone.&#xA;And a lot of times in the PHP space, there are quite a lot of projects - particularly ones, you know,&#xA;that aren&#39;t kind of using one of the major frameworks.&#xA;You know, it&#39;s quite a lot of times common to see a PHP project built completely from scratch, without any kind of framework.&#xA;Jeremy:&#xA;Wow. \impressed\&#xA;Alena:&#xA;So I came from doing PHP without a framework at the start.&#xA;I learned the language without a lot of the tools like Laravel and Symfony,&#xA;and even without an ORM tool like Doctrine, to get started.&#xA;I&#39;m also thinking, like, how much am I allowed to specifically talk about the code base I worked on in my first job?&#xA;Since it was a proprietary code base.&#xA;Jeremy:&#xA;Oh, sure, you don&#39;t want to have trouble with your former employer.&#xA;Alena:&#xA;Oh, that good stuff.&#xA;But yeah, through getting started with PHP through work, I started investigating the Symfony project for a new JSON API.&#xA;I&#39;ve always liked building API applications -&#xA;specifically APIs paired with some kind of other front end layer;&#xA;whether you&#39;re server-side rendering at that layer, or whether you&#39;re using a single page app framework.&#xA;Since I also came from the Java world before PHP, I was drawn to Symfony because it was very, very close in a lot of syntax and structure to the Spring framework in Java.&#xA;Jeremy:&#xA;Ahhh!&#xA;Alena:&#xA;That drew me there because I have familiarity with the Spring framework,&#xA;and it was kind of like, &#34;Oh, I&#39;m back home, but in a language I like a little bit more&#34;.&#xA;,\Both Laugh.\&#xA;Jeremy:&#xA;Watch your toes with just in time compilation! Maybe PHP is turning into Java. Oh, God.&#xA;Alena:&#xA;Yeah, just in time compilation. It&#39;s an interesting topic, because I really think it benefits specific PHP applications that aren&#39;t...&#xA;well, I should probably back up a little bit —&#xA;The PHP lifecycle.&#xA;The classic PHP application being the LAMP stack application,&#xA;where you&#39;re using PHP with something like Apache,&#xA;where Apache has a module that is a PHP module,&#xA;and Apache has a series of threads and says, “Okay, a request is coming in,&#xA;I&#39;m going to send it to PHP; PHP will run the code, process the request, spit out a result, and then PHP&#39;s done.”&#xA;So in that typical lifecycle of PHP, PHP starts up, and then it stops.&#xA;It&#39;s not running all the time.&#xA;It only runs when a request actually comes in.&#xA;Now, for a server built entirely in PHP...&#xA;Swoole is one of those ones out there; I think ReactPHP is also a similar kind of application – where the server is entirely built in PHP...&#xA;...that&#39;s where just-in-time compilation can be very helpful – because the PHP process theoretically is on all the time;&#xA;thus, the just-in-time compilation is very useful because the application isn&#39;t having to bootstrap all the time.&#xA;It&#39;s able to do the parsing of the code base, compile all of that, and have that at the ready throughout the lifecycle of the server.&#xA;... That was just a side note; that&#39;s probably not particularly super— 😅&#xA;Jeremy:&#xA;No! That&#39;s cool. It&#39;s redefining what PHP is, what it can be used for.&#xA;It really expands the possibilities, and I think it&#39;s a smart feature to add.&#xA;It&#39;s certainly one of the one of the selling points of Java, right?&#xA;I mean, if I was told I could have Java without public static void main(String[] args)-ass boilerplate, I&#39;d be like, &#34;Sweet! Sign me up!&#34;.&#xA;You could have easily slipped a PHP into my dev world,&#xA;like parents slip broccoli into their kids&#39; brownies.&#xA;Alena:&#xA;,\chuckle\*&#xA;Jeremy:&#xA;I would have ate that up.&#xA;But yeah, maybe PHP just needs a bit of optics help, perhaps.&#xA;Alena:&#xA;I think what really doesn&#39;t help its reputation these days is...&#xA;Number one, there&#39;s all the existing views of PHP as the old, gross, nasty, WordPressy language.&#xA;I feel like there&#39;s a specific stereotype about PHP in that regard.&#xA;But then two: I feel like PHP could use some better beginner resources,&#xA;like those that Python has, for example.&#xA;If you go to Python&#39;s official website, there&#39;s a very, very simple tutorial for,&#xA;“Let&#39;s get you started with Python!” immediately on the homepage,&#xA;to get you started with simple code – whereas there&#39;s not really anything like that on PHP&#39;s official website.&#xA;It&#39;s kind of like you&#39;ve got to dive in the docs, you&#39;ve got to find the Getting Started page,&#xA;you&#39;ve got to go through the whole rigmarole of installing a CLI interpreter and all of that...&#xA;where, with a bit of work, the homepage and the Getting Started resources could be streamlined and improved a whole lot.&#xA;In fact, there is another project, I don&#39;t remember the exact name,&#xA;but there is another project that is working to try to make a better Getting Started guide for new PHP users.&#xA;Jeremy:&#xA;No way.&#xA;Alena:&#xA;Yeah, it&#39;s a work in progress, I think.&#xA;Jeremy:&#xA;That&#39;s great. I think that&#39;s awesome.&#xA;Accessibility, good documentation, it&#39;s the stuff that no dev wants to do if they&#39;re doing it for passion,&#xA;because they just need stuff for themselves.&#xA;I imagine PHP people often--&#xA;...PHP people, there&#39;s definitely a recursive acronym you can use for that...&#xA;But yeah - PHP folks probably think, &#34;Oh, you&#39;ve been doing this since &#39;97, haven&#39;t you? You don&#39;t need a beginner&#39;s guide.&#34;&#xA;Alena:&#xA;Oh. 🙃&#xA;Jeremy:&#xA;I&#39;m glad there are folks who care about that, because that&#39;s good, because I&#39;ve never coded in PHP,&#xA;and I&#39;m glad I have you [around] to help me out when we get to the next step of this process.&#xA;That will be pretty cool.]]&gt;</description>
      <content:encoded><![CDATA[<h2 id="welcome-to-cyberia-chats" id="welcome-to-cyberia-chats">Welcome to Cyberia Chats!</h2>

<p>This is the start of an interview series here at Cyberia where I, your host, Bread, will be interviewing members of the Cyberia Computer Club about projects they&#39;ve been working on. The folks here at Cyberia write some top-notch software – often with little to no recognition! They deserve better. We have an enormous wealth of talent here, just dying to shine.</p>

<p>Hopefully, these talks will inspire folks in Cyberia to contribute to each other&#39;s projects, or maybe just take a look at the code, or perhaps just talk to each other a bit more. Here to begin the conversation with me is Alena, the talented developer of <a href="https://mychoicehrt.org/" rel="nofollow">mychoicehrt.org</a>, an <a href="https://github.com/MirandaCalls/mychoicehrt" rel="nofollow">open source</a> website that trans folks can use to find nearby healthcare centers.</p>

<p>We (meticulously!) edited this interview for clarity. If you&#39;d like to hear the original interview, or see the original transcript generated by <a href="https://github.com/openai/whisper" rel="nofollow">Whisper</a>, DM me on Matrix at @breadzeppelin:cyberia.club.</p>

<hr>

<h3 id="jeremy" id="jeremy">Jeremy:</h3>

<p>And hello there! We are live with our very first Cyberia Chat. This is an interview series that I, Bread here, hope to start – where we do deep dives into the amazing projects that all the talented folks in Cyberia are working on and have worked on to try to pick their brains to get a sense of what motivates them – so that they can feel like they&#39;re part of the community, that people care about their work, you know? I mean, so much of my whole career is spent doing meaningless bullshit work that no one will ever appreciate, so I&#39;d hope that we developers... [I&#39;d hope that] the stuff that we&#39;re doing outside of work gets appreciated, you know?</p>

<h3 id="alena" id="alena">Alena:</h3>

<p>Yeah, it takes a lot of energy to, if you have a full-time job, really put in that same level of effort in another project, because there&#39;s always the fear that you&#39;re gonna...burn out on that specific type of skill, you know?
I feel that it&#39;s important to recognize when you&#39;re using a skill too much, or pushing yourself too hard – because it&#39;s a <em>lot</em>.</p>

<h3 id="jeremy-1" id="jeremy-1">Jeremy:</h3>

<p>No, what are you talking about? It&#39;s <strong>easy</strong>!
It only took you 196 commits...
Nooo, it&#39;s <em>nothing</em>.</p>

<h3 id="alena-1" id="alena-1">Alena:</h3>

<p>😆 You know, over the course of like three months.</p>

<h3 id="jeremy-2" id="jeremy-2">Jeremy:</h3>

<p>No, whatever!</p>

<h3 id="alena-2" id="alena-2">Alena:</h3>

<p>Working full-time on it.
I quit my job to do this for three months.</p>

<h3 id="jeremy-3" id="jeremy-3">Jeremy:</h3>

<p>🤣 Oh my god.</p>

<h3 id="alena-3" id="alena-3">Alena:</h3>

<p>😂</p>

<h3 id="jeremy-4" id="jeremy-4">Jeremy:</h3>

<p>Maybe you&#39;ll get some new folks on Ko-Fi or something after this. I hope so, Alena.
I&#39;ve always thought this was a pretty... this was one of those things that when I saw it, I was like,
“Whoa! Why is everyone not freaking out? This is crazy! Is no one... what? Is no one...?”</p>

<h3 id="alena-4" id="alena-4">Alena:</h3>

<p>I hope that I&#39;ll get a small amount of traffic, and I hope that the site has been useful and is working for the folks that have found it.</p>

<h3 id="jeremy-5" id="jeremy-5">Jeremy:</h3>

<p>I hope so too, you know?
I hope you&#39;re getting some good user feedback and all that. That&#39;d be cool.
I feel like you&#39;re making a difference in the community. I guess that is your goal, right?</p>

<h3 id="alena-5" id="alena-5">Alena:</h3>

<p>Yeah.</p>

<h3 id="jeremy-6" id="jeremy-6">Jeremy:</h3>

<p>Could you tell me what drew you to this issue and how you got inspired to start this [project] in the first place?</p>

<h3 id="alena-6" id="alena-6">Alena:</h3>

<p>Yeah, so I&#39;ve been following the whole legislative storm of different bills that are either restricting or <em>completely outright banning</em> certain types of care in the United States.
And specifically, I feel passionate about following what&#39;s going on with transgender care and informed consent medical care.
I&#39;ve been following an activist named Erin Reed who provides resources for keeping up-to-date on legislation that affects the transgender community. She also maintains a list of about 900 or so informed consent clinics in the US, which is a <em>colossal</em> amount of work for one person to do.</p>

<h3 id="jeremy-7" id="jeremy-7">Jeremy:</h3>

<p>That&#39;s just one person!? 😳</p>

<h3 id="alena-7" id="alena-7">Alena:</h3>

<p>Yeah, clinics in the US and a handful of clinics in a couple of other countries too. It&#39;s a very large data set that I&#39;ve been following for a while.
My idea was to see if there was a way to help people search it a little easier, to be able to enter just a couple of location details and have it instantly pull up a list of the clinics from the data set – to make using that resource even easier.
Since Erin&#39;s map uses Google My Maps, it lacks the same features that you would typically think of Google Maps to have, like searches using your location or advanced searches for things near me.
If you want to find clinics near to you on the map, you have to know where you are and find your location which involves scanning over the map to find your region or knowing the latitude and longitude of your town. Then it&#39;s a process of visually finding what clinics are close enough.
So my goal is to remove that step of having to manually search the map and quickly pull up the closest informed consent clinics.
The project first started as pulling in all the clinics from <a href="https://www.google.com/maps/d/u/1/viewer?mid=1DxyOTw8dI8n96BHFF2JVUMK7bXsRKtzA&amp;ll=26.19982757169323%2C-113.38234069999999&amp;z=3https://www.google.com/maps/d/u/1/viewer?mid=1DxyOTw8dI8n96BHFF2JVUMK7bXsRKtzA&amp;ll=26.19982757169323%2C-113.38234069999999&amp;z=3" rel="nofollow">Erin Reed&#39;s map</a> to catalog them and make them searchable, but it kind of grew a little more from there.</p>

<h3 id="jeremy-8" id="jeremy-8">Jeremy:</h3>

<p>Ooooh!</p>

<h3 id="alena-8" id="alena-8">Alena:</h3>

<p>I was thinking I could also pull in other data sources as well. I added one other data source to my website, which is the Southern Equality <a href="https://southernequality.org/resources/transinthesouth/" rel="nofollow">Trans in the South</a> list of transgender care providers. My site is only importing their informed consent clinics, but they have a whole lot of other resources not <em>just</em> confined to informed consent clinics. They have a search interface to find more transgender – even general LGBTQ+ friendly – care; they might be a resource to look for.</p>

<h3 id="jeremy-9" id="jeremy-9">Jeremy:</h3>

<p>Glad you&#39;re shouting them out. Pretty impressive.
You know, a good amalgamation of very important, relevant data sets, you know, data science and data sets...
These are words that sound so abstract, I feel like, to a lot of people – but no, this is useful, you know?
And this is the kind of thing where inaccessible, bad UX gets in the way of people,
especially with the earlier thing, the Erin Reeds map, you know, Google user map.
Poorly integrated, old Google project....</p>

<h3 id="alena-9" id="alena-9">Alena:</h3>

<p>😅 Yeah. People could do with a little less Google tracking them, especially when it comes to medical care.</p>

<h3 id="jeremy-10" id="jeremy-10">Jeremy:</h3>

<p>🤯
Whoa – that&#39;s also a good point. Privacy side of things. Better to just have your resource, which, you know, is open source.
People can see it [without fear of being tracked]. They can deploy the web app themselves, I guess, in theory.
But yeah, that&#39;s awesome.
I didn&#39;t realize that that whole Erin Reed dataset was compiled by [just] that one person.</p>

<h3 id="alena-10" id="alena-10">Alena:</h3>

<p>Yeah, Erin is doing an immense amount of work and should be applauded for it -
because they are still maintaining that map and still doing very, very good work.</p>

<h3 id="jeremy-11" id="jeremy-11">Jeremy:</h3>

<p>It&#39;s not over.</p>

<h3 id="alena-11" id="alena-11">Alena:</h3>

<p>Yeah.
The goal is a resource you can quickly find clinics on, quickly find the care you need, all while not having any kind of tracking in the midst.
My site&#39;s not tracking anyone who comes to it.
Well, with the exception of the contact feedback form -
Whether HCaptcha is doing any, you know, any particular logging of HTTP traffic when the CAPTCHA handshake is going on – that&#39;s the part I&#39;m not as confident about 😬
But at least the main search interface -</p>

<h3 id="jeremy-12" id="jeremy-12">Jeremy:</h3>

<p>Woooooow. Wooow! 😂
Interview over. <em>Terrible</em> app; not private.</p>

<h3 id="alena-12" id="alena-12">Alena:</h3>

<p>Oh no. It&#39;s all gone. It&#39;s all gone.</p>

<h3 id="jeremy-13" id="jeremy-13">Jeremy:</h3>

<p>Game over, Alena.</p>

<h3 id="alena-13" id="alena-13">Alena:</h3>

<p>It&#39;s game over now.</p>

<h3 id="jeremy-14" id="jeremy-14">Jeremy:</h3>

<p>Why&#39;d you blow it like that? 😆</p>

<h3 id="alena-14" id="alena-14">Alena:</h3>

<p>Oh, I know. I know. 😅
I wanted to try to keep bots from spamming my contact form.
So I was like, “Dang it! The tried and tested CAPTCHA service.”
I suppose one could host their own CAPTCHA.
I&#39;m sure there has to be some self-hosted option.</p>

<h3 id="jeremy-15" id="jeremy-15">Jeremy:</h3>

<p>Doesn&#39;t Forrest has his own CAPTCHA service? Maybe you can switch to using that.</p>

<h3 id="alena-15" id="alena-15">Alena:</h3>

<p>Ooh, there we go. There we go. Gotta get in contact with Forest.</p>

<h3 id="jeremy-16" id="jeremy-16">Jeremy:</h3>

<p>Right, see!? 🤩 This is why we need more cross-pollination, you know? We have our own Cyberia toolkits going on.</p>

<h3 id="alena-16" id="alena-16">Alena:</h3>

<p>Oooooh – Cyberia CAPTCHA! 😄</p>

<h3 id="jeremy-17" id="jeremy-17">Jeremy:</h3>

<p>Hey-ooo 🤯</p>

<h3 id="alena-17" id="alena-17">Alena:</h3>

<p>Hosted on Capsul. Woo! 🎆</p>

<h3 id="jeremy-18" id="jeremy-18">Jeremy:</h3>

<p>CAPTCHA on Capsul. Oh <em>snap</em>. Alright, now we&#39;re cooking... but let&#39;s move on.
Glad to hear the grounding here – fighting for something you care about.</p>

<h3 id="alena-18" id="alena-18">Alena:</h3>

<p>Yeah :D</p>

<h3 id="jeremy-19" id="jeremy-19">Jeremy:</h3>

<p>This is a field where privacy really matters.
I remember last year when Roe v. Wade got overturned because, you know, we live in a 10th, 11th world country -bottom of the barrel country court system; but I digress.
You know, when that was overturned, everyone started freaking out about their period trackers [and] stuff like that.</p>

<h3 id="alena-19" id="alena-19">Alena:</h3>

<p>Rightly so, because there&#39;s a lot of those medical-oriented applications that are logging all of that data – and while a lot of them might not be blatantly using it for tracking that specific user,
those are just <em>goldmines</em> of people&#39;s personal health information, too – if those ever get leaked, and if there&#39;s anything personally identifiable in them, that&#39;s <strong>not good</strong>, to put it lightly.
Yeah.</p>

<h3 id="jeremy-20" id="jeremy-20">Jeremy:</h3>

<p>Overnight, I feel like, a lot of people went from, “Oh, who cares about my data? Everyone has all of my data,”
to “<strong>Oh my god</strong>, wait, I really need some privacy right now[^1],” especially if you are a woman.
&lt;sarcasm&gt;
And, you know, trans people, well, lord knows, they&#39;re <em>certainly</em> not under attack anywhere.
Noooo, no, definitely not.
&lt;/sarcasm&gt;</p>

<h3 id="alena-20" id="alena-20">Alena:</h3>

<p>Yikes.
It&#39;s a tough time.</p>

<h3 id="jeremy-21" id="jeremy-21">Jeremy:</h3>

<p>It is – but I think that projects like this are important to show that there is good stuff that can happen in the programming space.
A lot of the folks I talk to who care about trans rights are generally non-techie people.
They&#39;re maybe more bookish, artsy types. [In] general, [the] leftist folks I hang out with are oftentimes Luddites. I don&#39;t mean to use that [as] a derogatory term.... [I just mean that they&#39;re] skeptical of large tech companies.
I get that [concern] – so I think it&#39;s important that we have stuff like this to [say], “Hey, we can help! Technology is a tool.
We can use it. We can do good stuff with it, even if that tool is <a href="https://www.php.net/" rel="nofollow">PHP</a>.”
Could you tell me a bit – <em>*bursts into laughter*</em>😆</p>

<h3 id="alena-21" id="alena-21">Alena:</h3>

<p><em>Ooooh</em>. 🤨
“Even if that tool is PHP”? I feel a little attacked here.</p>

<h3 id="jeremy-22" id="jeremy-22">Jeremy:</h3>

<p>Attacked!? <em>*poorly feigning ignorance*</em> 🤣</p>

<h3 id="alena-22" id="alena-22">Alena:</h3>

<p>😆
You know, PHP is—</p>

<h3 id="jeremy-23" id="jeremy-23">Jeremy:</h3>

<p>All right, tell me about this <strong>terrible</strong>— na na na 😆
I&#39;ve been reading some of the docs for PHP, and it seems that PHP has turned around quite a bit in recent years.
A lot of new features have been added to the language. It&#39;s pretty interesting, some of the stuff that the [language has] these days.
I mean, [it has] just-in-time compilation [now]. They&#39;re adding Java style [compilation] to PHP.
That must be good for performance, right?</p>

<h3 id="alena-23" id="alena-23">Alena:</h3>

<p>PHP is slowly, slowly becoming a more strictly typed, less dynamic programming language.
Slowly but surely locking things down – adding a full, strict type system in, if you want to use it.
Cleaning up older functions and making them more consistent. Making changes under the hood for performance and things like just-in-time compilation. If you have a web server that&#39;s written entirely in PHP, without any use of Apache, features like just-in-time compilation can help immensely with those types of applications.
So, yeah, there&#39;s a lot of modernization going on in the PHP project. ☺️</p>

<h3 id="jeremy-24" id="jeremy-24">Jeremy:</h3>

<p>Very cool, very cool. I&#39;m sure it must have changed a lot over the years as you&#39;ve been working [within the ecosystem].
There was quite a lot of neat little aspects of the architecture [that] I saw, [that] I learned about as I was going through this.
Stuff like <a href="https://symfony.com/" rel="nofollow">Symfony</a>, and... what&#39;s it called, the ORM that you use?</p>

<h3 id="alena-24" id="alena-24">Alena:</h3>

<p>Yes, <a href="https://github.com/doctrine/orm" rel="nofollow">Doctrine</a>.</p>

<h3 id="jeremy-25" id="jeremy-25">Jeremy:</h3>

<p>Yep, that one. That was pretty interesting.
You know, I am someone who is <em>just</em> learning the PHP ecosystem now.
It&#39;s kind of fun! This is a fun little peek into the [PHP] world to try to learn it[s mysterious ways~].
What are some of your favorite little – in the PHP zone, the PHP space, the environment – what are some interesting little projects happening that have inspired you, as a developer?</p>

<h3 id="alena-25" id="alena-25">Alena:</h3>

<p>Ooh... projects in the PHP space that have inspired me...
...well, I started out doing PHP dev just through work.
That&#39;s how I kind of started out getting into that zone.
And a lot of times in the PHP space, there are quite a lot of projects – particularly ones, you know,
that aren&#39;t kind of using one of the major frameworks.
You know, it&#39;s quite a lot of times common to see a PHP project built completely from scratch, without any kind of framework.</p>

<h3 id="jeremy-26" id="jeremy-26">Jeremy:</h3>

<p>Wow. <em>*impressed*</em></p>

<h3 id="alena-26" id="alena-26">Alena:</h3>

<p>So I came from doing PHP without a framework at the start.
I learned the language without a lot of the tools like <a href="https://laravel.com/" rel="nofollow">Laravel</a> and Symfony,
and even without an ORM tool like Doctrine, to get started.
I&#39;m also thinking, like, how much am I allowed to specifically talk about the code base I worked on in my first job?
Since it was a proprietary code base.</p>

<h3 id="jeremy-27" id="jeremy-27">Jeremy:</h3>

<p>Oh, sure, you don&#39;t want to have trouble with your former employer.</p>

<h3 id="alena-27" id="alena-27">Alena:</h3>

<p>Oh, that good stuff.
But yeah, through getting started with PHP through work, I started investigating the Symfony project for a new JSON API.
I&#39;ve always liked building API applications -
specifically APIs paired with some kind of other front end layer;
whether you&#39;re server-side rendering at that layer, or whether you&#39;re using a single page app framework.
Since I also came from the Java world before PHP, I was drawn to Symfony because it was very, very close in a lot of syntax and structure to the Spring framework in Java.</p>

<h3 id="jeremy-28" id="jeremy-28">Jeremy:</h3>

<p>Ahhh!</p>

<h3 id="alena-28" id="alena-28">Alena:</h3>

<p>That drew me there because I have familiarity with the Spring framework,
and it was kind of like, “Oh, I&#39;m back home, but in a language I like a little bit more”.
,<em>*Both Laugh.</em>*</p>

<h3 id="jeremy-29" id="jeremy-29">Jeremy:</h3>

<p>Watch your toes with just in time compilation! Maybe PHP is turning into Java. Oh, God.</p>

<h3 id="alena-29" id="alena-29">Alena:</h3>

<p>Yeah, just in time compilation. It&#39;s an interesting topic, because I really think it benefits specific PHP applications that aren&#39;t...
well, I should probably back up a little bit —
The PHP lifecycle.
The classic PHP application being the <a href="https://en.wikipedia.org/wiki/LAMP_%28software_bundle%29" rel="nofollow">LAMP stack</a> application,
where you&#39;re using PHP with something like <a href="https://httpd.apache.org/" rel="nofollow">Apache</a>,
where Apache has a module that is a PHP module,
and Apache has a series of threads and says, “Okay, a request is coming in,
I&#39;m going to send it to PHP; PHP will run the code, process the request, spit out a result, and then PHP&#39;s done.”
So in that typical lifecycle of PHP, PHP starts up, and then it stops.
It&#39;s not running all the time.
It only runs when a request actually comes in.
Now, for a server built entirely in PHP...
Swoole is one of those ones out there; I think ReactPHP is also a similar kind of application – where the server is entirely built in PHP...
...that&#39;s where just-in-time compilation can be very helpful – because the PHP process theoretically is on all the time;
thus, the just-in-time compilation is very useful because the application isn&#39;t having to bootstrap all the time.
It&#39;s able to do the parsing of the code base, compile all of that, and have that at the ready throughout the lifecycle of the server.
... That was just a side note; that&#39;s probably not particularly super— 😅</p>

<h3 id="jeremy-30" id="jeremy-30">Jeremy:</h3>

<p>No! That&#39;s cool. It&#39;s redefining what PHP is, what it can be used for.
It really expands the possibilities, and I think it&#39;s a smart feature to add.
It&#39;s certainly one of the one of the selling points of Java, right?
I mean, if I was told I could have Java without <code>public static void main(String[] args)</code>-ass boilerplate, I&#39;d be like, “Sweet! Sign me up!”.
You could have easily slipped a PHP into my dev world,
like parents slip broccoli into their kids&#39; brownies.</p>

<h3 id="alena-30" id="alena-30">Alena:</h3>

<p>,<em>*chuckle</em>*</p>

<h3 id="jeremy-31" id="jeremy-31">Jeremy:</h3>

<p>I would have ate that up.
But yeah, maybe PHP just needs a bit of optics help, perhaps.</p>

<h3 id="alena-31" id="alena-31">Alena:</h3>

<p>I think what really doesn&#39;t help its reputation these days is...
Number one, there&#39;s all the existing views of PHP as the old, gross, nasty, <em>WordPressy</em> language.
I feel like there&#39;s a specific stereotype about PHP in that regard.
But then two: I feel like PHP could use some better beginner resources,
like those that Python has, for example.
If you go to Python&#39;s official website, there&#39;s a very, very simple tutorial for,
“Let&#39;s get you started with Python!” immediately on the homepage,
to get you started with simple code – whereas there&#39;s not really anything like that on PHP&#39;s official website.
It&#39;s kind of like you&#39;ve got to dive in the docs, you&#39;ve got to find the Getting Started page,
you&#39;ve got to go through the whole rigmarole of installing a CLI interpreter and all of that...
where, with a bit of work, the homepage and the Getting Started resources could be streamlined and improved a whole lot.
In fact, there is another project, I don&#39;t remember the exact name,
but there is another project that is working to try to make a better Getting Started guide for new PHP users.</p>

<h3 id="jeremy-32" id="jeremy-32">Jeremy:</h3>

<p>No way.</p>

<h3 id="alena-32" id="alena-32">Alena:</h3>

<p>Yeah, it&#39;s a work in progress, I think.</p>

<h3 id="jeremy-33" id="jeremy-33">Jeremy:</h3>

<p>That&#39;s great. I think that&#39;s awesome.
Accessibility, good documentation, it&#39;s the stuff that no dev wants to do if they&#39;re doing it for passion,
because they just need stuff for themselves.
I imagine PHP people often—
...PHP people, there&#39;s definitely a recursive acronym you can use for that...
But yeah – PHP folks probably think, “Oh, you&#39;ve been doing this since &#39;97, haven&#39;t you? You don&#39;t need a beginner&#39;s guide.”</p>

<h3 id="alena-33" id="alena-33">Alena:</h3>

<p>Oh. 🙃</p>

<h3 id="jeremy-34" id="jeremy-34">Jeremy:</h3>

<p>I&#39;m glad there are folks who care about that, because that&#39;s good, because I&#39;ve never coded in PHP,
and I&#39;m glad I have you [around] to help me out when we get to the next step of this process.
That will be pretty cool.</p>
]]></content:encoded>
      <author>bread-z</author>
      <guid>https://blog.cyberia.club/read/a/awpbw3hr21</guid>
      <pubDate>Mon, 12 Jun 2023 23:21:58 +0000</pubDate>
    </item>
    <item>
      <title>dairy-free banana bread</title>
      <link>https://blog.cyberia.club/reese-ipes/dairy-free-banana-bread</link>
      <description>&lt;![CDATA[i grew up on my mom&#39;s banana bread. it&#39;s a great way to use overripe bananas. this recipe was developed from a generic nut bread recipe from her old betty crocker cookbook by both of us making changes along the way.&#xA;&#xA;picture of the finished loaf with a slice taken off of one end to show the inside&#xA;&#xA;ingredients&#xA;&#xA;wet mix&#xA;&#xA;3 over-ripe bananas [1]&#xA;1 egg&#xA;1 cup sugar&#xA;1 cup oat milk [2]&#xA;3 tbsp olive oil&#xA;1 tsp vanilla&#xA;a pinch of salt to taste&#xA;&#xA;dry mix&#xA;&#xA;2.5 cups flour&#xA;3.5 tsp baking powder&#xA;&#xA;fillings (optional)&#xA;&#xA;up to .5 cup dark chocolate chips, nuts, dates, what-have-you. [3]&#xA;&#xA;steps&#xA;&#xA;pre-heat oven to 350°F and grease a medium-sized loaf pan.&#xA;combine wet mix and stir/beat until bananas are mostly mashed but still lumpy.&#xA;sift in dry mix and stir just until combined. do not over-mix.&#xA;gently fold in your optional fillings.&#xA;pour the batter into the loaf pan and bake on a center rack for 55 minutes.&#xA;once done, let it rest for a couple minutes, then turn it out onto a wire rack to cool.&#xA;&#xA;---&#xA;&#xA;footnotes&#xA;&#xA;[1] they should have some brown on the outside, maybe 50%, and be soft. don&#39;t use if they&#39;re rotten.&#xA;[2] i don&#39;t think the type of milk you use is essential. let me know if you try any others!&#xA;[3] neither my mom nor i like nuts in baked goods but maybe you do. that&#39;s fine.&#xA;]]&gt;</description>
      <content:encoded><![CDATA[<p>i grew up on my mom&#39;s banana bread. it&#39;s a great way to use overripe bananas. this recipe was developed from a generic nut bread recipe from her old betty crocker cookbook by both of us making changes along the way.</p>

<p><img src="https://paste.cyberia.club/file/aO0zNb/banana_bread_slice.jpg" alt="picture of the finished loaf with a slice taken off of one end to show the inside"></p>

<h2 id="ingredients" id="ingredients">ingredients</h2>

<h4 id="wet-mix" id="wet-mix">wet mix</h4>
<ul><li>3 over-ripe bananas [1]</li>
<li>1 egg</li>
<li>1 cup sugar</li>
<li>1 cup oat milk [2]</li>
<li>3 tbsp olive oil</li>
<li>1 tsp vanilla</li>
<li>a pinch of salt to taste</li></ul>

<h4 id="dry-mix" id="dry-mix">dry mix</h4>
<ul><li>2.5 cups flour</li>
<li>3.5 tsp baking powder</li></ul>

<h4 id="fillings-optional" id="fillings-optional">fillings (optional)</h4>
<ul><li>up to .5 cup dark chocolate chips, nuts, dates, what-have-you. [3]</li></ul>

<h2 id="steps" id="steps">steps</h2>

<p>pre-heat oven to 350°F and grease a medium-sized loaf pan.
combine wet mix and stir/beat until bananas are mostly mashed but still lumpy.
sift in dry mix and stir just until combined. do not over-mix.
gently fold in your optional fillings.
pour the batter into the loaf pan and bake on a center rack for 55 minutes.
once done, let it rest for a couple minutes, then turn it out onto a wire rack to cool.</p>

<hr>

<h2 id="footnotes" id="footnotes">footnotes</h2>

<p>[1] they should have some brown on the outside, maybe 50%, and be soft. don&#39;t use if they&#39;re rotten.
[2] i don&#39;t think the type of milk you use is essential. let me know if you try any others!
[3] neither my mom nor i like nuts in baked goods but maybe you do. that&#39;s fine.</p>
]]></content:encoded>
      <author>reese-ipes 🍽</author>
      <guid>https://blog.cyberia.club/read/a/skojeomzkf</guid>
      <pubDate>Tue, 06 Jun 2023 01:42:32 +0000</pubDate>
    </item>
    <item>
      <title>vegan three bean chili</title>
      <link>https://blog.cyberia.club/reese-ipes/three-bean-chili</link>
      <description>&lt;![CDATA[ingredients&#xA;2-3 tbsp vegetable oil&#xA;1 small or medium yellow onion, finely sliced [1]&#xA;3 cans of different types of beans [2]&#xA;1 can corn&#xA;1 can diced tomatoes&#xA;1 to 1.5 cups chopped carrots&#xA;1 bell pepper (choose ur favorite color)&#xA;2 cups vegetable stock&#xA;&#xA;spices [3]&#xA;paprika (regular and smoked)&#xA;cumin&#xA;oregano&#xA;garlic powder&#xA;cinnamon&#xA;basil&#xA;MSG [4]&#xA;black pepper&#xA;white pepper&#xA;cayenne pepper&#xA;salt&#xA;&#xA;steps&#xA;heat vegetable oil in a large pot.&#xA;add onions and cook until translucent.&#xA;stir in spices and cook for another minute or 2.&#xA;empty all the cans into the pot, add veggies and stock.&#xA;bring to a boil then let simmer on low for like an hour, loosely covered so steam can vent, stirring occasionally.&#xA;add salt to taste and enjoy!&#xA;&#xA;---&#xA;&#xA;footnotes&#xA;&#xA;[0] original recipe i based this one off of: https://www.thedailymeal.com/cook/vegetarian-bean-chili&#xA;[1] size of the onion depends on your preference and FODMAP tolerance. i also threw in a shallot because i had one in the fridge but it probably didn&#39;t make much of a difference.&#xA;[2] i used black beans, garbanzo beans (chickpeas), and great northern beans (about 1 cup after soaking)&#xA;[3] i just kinda eyeballed the spices, sorry. i tried to put them in order of highest to lowest amount. the ones toward the bottom aren&#39;t that important to get right so use whatever you have!&#xA;[4] you could substitute with extra salt and a pinch of sugar but imo you should really have MSG in your pantry. it Makes Stuff Good™]]&gt;</description>
      <content:encoded><![CDATA[<h2 id="ingredients" id="ingredients">ingredients</h2>
<ul><li>2-3 tbsp vegetable oil</li>
<li>1 small or medium yellow onion, finely sliced [1]</li>
<li>3 cans of different types of beans [2]</li>
<li>1 can corn</li>
<li>1 can diced tomatoes</li>
<li>1 to 1.5 cups chopped carrots</li>
<li>1 bell pepper (choose ur favorite color)</li>
<li>2 cups vegetable stock</li></ul>

<h3 id="spices-3" id="spices-3">spices [3]</h3>
<ul><li>paprika (regular and smoked)</li>
<li>cumin</li>
<li>oregano</li>
<li>garlic powder</li>
<li>cinnamon</li>
<li>basil</li>
<li>MSG [4]</li>
<li>black pepper</li>
<li>white pepper</li>
<li>cayenne pepper</li>
<li>salt</li></ul>

<h2 id="steps" id="steps">steps</h2>
<ol><li>heat vegetable oil in a large pot.</li>
<li>add onions and cook until translucent.</li>
<li>stir in spices and cook for another minute or 2.</li>
<li>empty all the cans into the pot, add veggies and stock.</li>
<li>bring to a boil then let simmer on low for like an hour, loosely covered so steam can vent, stirring occasionally.</li>
<li>add salt to taste and enjoy!</li></ol>

<hr>

<h2 id="footnotes" id="footnotes">footnotes</h2>

<p>[0] original recipe i based this one off of: <a href="https://www.thedailymeal.com/cook/vegetarian-bean-chili" rel="nofollow">https://www.thedailymeal.com/cook/vegetarian-bean-chili</a>
[1] size of the onion depends on your preference and FODMAP tolerance. i also threw in a shallot because i had one in the fridge but it probably didn&#39;t make much of a difference.
[2] i used black beans, garbanzo beans (chickpeas), and great northern beans (about 1 cup after soaking)
[3] i just kinda eyeballed the spices, sorry. i tried to put them in order of highest to lowest amount. the ones toward the bottom aren&#39;t that important to get right so use whatever you have!
[4] you could substitute with extra salt and a pinch of sugar but imo you should really have MSG in your pantry. it Makes Stuff Good™</p>
]]></content:encoded>
      <author>reese-ipes 🍽</author>
      <guid>https://blog.cyberia.club/read/a/apf1pjtho2</guid>
      <pubDate>Thu, 25 May 2023 03:20:08 +0000</pubDate>
    </item>
    <item>
      <title>yobfjfpvs7</title>
      <link>https://blog.cyberia.club/karlexceed/img-src-media-tenor-com-fpfsrpcxunsaaaac-bubblegum-crisis-blargh-gif</link>
      <description>&lt;![CDATA[img src=&#34;https://media.tenor.com/fPfsrpCXUnsAAAAC/bubblegum-crisis-blargh.gif&#34; /]]&gt;</description>
      <content:encoded><![CDATA[<p><img src="https://media.tenor.com/fPfsrpCXUnsAAAAC/bubblegum-crisis-blargh.gif"/></p>
]]></content:encoded>
      <author>karlexceed</author>
      <guid>https://blog.cyberia.club/read/a/yobfjfpvs7</guid>
      <pubDate>Sat, 13 May 2023 15:12:16 +0000</pubDate>
    </item>
    <item>
      <title>A new frontier</title>
      <link>https://blog.cyberia.club/random-access-memories/a-new-frontier</link>
      <description>&lt;![CDATA[A fresh start, a blank sheet, untouched digital territory that Cyberia can sully with our awful posts. This is our new blog site. You may sign up for an account; hopefully this will be a place Cyberia users can put their thoughts, share projects in more exhaustive detail, write poetry, whatever strikes your fancy really. &#xA;&#xA;The editor understands markdown and HTML. Play around and see what you can do with it. Documentation is available at the writefreely website, and the writing guide is here. Hopefully bread will add some pretty CSS. Happy writing! ]]&gt;</description>
      <content:encoded><![CDATA[<p>A fresh start, a blank sheet, untouched digital territory that Cyberia can sully with our awful posts. This is our new blog site. You may sign up for an account; hopefully this will be a place Cyberia users can put their thoughts, share projects in more exhaustive detail, write poetry, whatever strikes your fancy really.</p>

<p>The editor understands markdown and HTML. Play around and see what you can do with it. Documentation is available at <a href="https://writefreely.org/docs" rel="nofollow">the writefreely website</a>, and the writing guide is <a href="https://writefreely.org/docs/latest/writer" rel="nofollow">here</a>. Hopefully bread will add some pretty CSS. Happy writing!</p>
]]></content:encoded>
      <author>Random Access Memories</author>
      <guid>https://blog.cyberia.club/read/a/rljlvg9bgg</guid>
      <pubDate>Sat, 13 May 2023 06:55:52 +0000</pubDate>
    </item>
    <item>
      <title>Capsul Maintenance Upgrades</title>
      <link>https://blog.cyberia.club/cyberia/capsul-maintenance-upgrades</link>
      <description>&lt;![CDATA[---&#xA;Imported from https://cyberia.club/blog&#xA;Originally published: 2021-12-17&#xA;---&#xA;&#xA;rumors of my demise have been greatly exaggerated&#xA;&#xA;Forest                                         2021-12-17&#xA;&#xA;                     WHAT IS THIS?&#xA;&#xA;If you&#39;re a wondering &#34;what is capsul?&#34;, see:&#xA;&#xA;https://capsul.org&#xA;&#xA;Here&#39;s a quick summary of what&#39;s in this post:&#xA;&#xA;cryptocurrency payments are back&#xA;&#xA;we visited the server in person for maintenance&#xA;&#xA;most capsuls disks should have trim/discard support &#xA; now, so you can run the fstrim command to optimize&#xA; your capsul&#39;s disk. (please do this, it will save us&#xA; a lot of disk space!!)&#xA;&#xA;we updated most of our operating system images and&#xA; added a new rocky linux image!&#xA;&#xA;potential ideas for future development on capsul&#xA;&#xA;exciting news about a new server and a new capsul fork &#xA; being developed by co-op cloud / servers.coop&#xA;&#xA;                        ~&#xA;&#xA;  WHAT HAPPENED TO THE CRYPTOCURRENCY PAYMENT OPTION?&#xA;&#xA;Life happens. Cyberia Computer Club has been hustling&#xA;and bustling to build out our new in-person space in&#xA;Minneapolis, MN: &#xA;&#xA;https://wiki.cyberia.club/hypha/cyberiahq/faq&#xA;&#xA;Hackerspace, lab, clubhouse, we aren&#39;t sure what to call &#xA;it yet, but we&#39;re extremely excited to finish with the &#xA;renovations and move in!&#xA;&#xA;In the meantime, something went wrong with the physical&#xA;machine hosting our BTCPay server and we didn&#39;t have &#xA;anywhere convenient to move it, nor time to replace it,&#xA;so we simply disabled cryptocurrency payments &#xA;temporarily in September 2021. &#xA;&#xA;Many of yall have emailed us asking &#34;what gives??&#34;, &#xA;and I&#39;m glad to finally be able to announce that &#xA;&#xA;&#34;the situation has been dealt with&#34;,&#xA;&#xA;we have a brand new server and the blockchain syncing&#xA;process is complete, cryptocurrency payments in bitcoin, &#xA;litecoin, and monero are back online now!&#xA;&#xA;    --  https://capsul.org/payment/btcpay   &lt;--&#xA;&#xA;                        ~&#xA;&#xA;  THAT ONE TIME CAPSUL WAS ALMOST fsync()&#39;d TO DEATH&#xA;&#xA;Guess what? Yall loved capsul so much, you wore our disks &#xA;out. Well, almost.&#xA;&#xA;We use redundant solid state disks + the ZFS file system&#xA;for your capsul&#39;s block storage needs, and it turns out &#xA;that some of our users like to write files. A lot. &#xA;&#xA;Over time, SSDs will wear out, mostly dependent on how &#xA;many writes hit the disk. Baikal, the server behind &#xA;capsul.org, is a bit different from a typical desktop&#xA;computer, as it hosts about 100 virtual machines, each &#xA;with thier own list of application processes, for over 50 &#xA;individual capsul users, each of whom may be providing &#xA;services to many other individuals in turn.&#xA;&#xA;The disk-wear-out situation was exacerbated by our &#xA;geographical separation from the server; we live in &#xA;Minneapolis, MN, but the server is in Georgia. We wanted &#xA;to install NVME drives to expand our storage capacity &#xA;ahead of growing demand, but when we would mail PCI-e to &#xA;NVME adapters to CyberWurx, our datacenter colocation &#xA;provider, they kept telling us the adapter didn&#39;t fit &#xA;inside the 1U chassis of the server.&#xA;&#xA;At one point, we were forced to take a risk and undo the &#xA;redundancy of the disks in order to expand our storage &#xA;capacity and prevent &#34;out of disk space&#34; errors from &#xA;crashing your capsuls. It was a calculated risk, trading&#xA;certain doom now for the potential possibility of doom &#xA;later.&#xA;&#xA;Well, time passed while we were busy with other projects,&#xA;and those non-redundant disks started wearing out. &#xA;According to the &#34;smartmon&#34; monitoring indicator, they &#xA;reached about 25% lifespan remaining. Once the disk &#xA;theoretically hit 0%, it would become read-only in order &#xA;to protect itself from total data loss. &#xA;So we had to replace them before that happened. &#xA;&#xA;https://picopublish.sequentialread.com/files/smartmondec2021.png&#xA;&#xA;We were so scared of what could happen if we slept on &#xA;this that we booked a flight to Atlanta for maintenance.&#xA;We wanted to replace the disks in person, and ensure we &#xA;could restore the ZFS disk mirroring feature.&#xA;&#xA;We even custom 3d-printed a bracket for the tiny PCI-e &#xA;NVME drive that we needed in order to restore redundancy&#xA;for the disks, just to make 100% sure that the &#xA;maintenance we were doing would succeed &amp; maintain&#xA;stability for everyone who has placed thier trust in us &#xA;and voted with thier shells, investing thier time and &#xA;money on virtual machines that we maintain on a volunteer&#xA;basis.&#xA;&#xA;https://picopublish.sequentialread.com/files/silly-nvme-bracket2.jpg&#xA;&#xA;Unfortunately, &#34;100% sure&#34; was still not good enough, &#xA;the new NVME drive didn&#39;t work as a ZFS mirroring partner&#xA;at first ⁠— the existing NVME drive was 951GB, and the &#xA;one we had purchased was 931GB. It was too small and ZFS&#xA;would not accept that. f0x suggested:&#xA;&#xA;  [you could] start a new pool on the new disk, &#xA;  zfs send all the old data over, then have an &#xA;  equally sized partition on the old disk then add &#xA;  that to the mirror&#xA;&#xA;But we had no idea how to do that exactly or how long it &#xA;would take &amp; we didn&#39;t want to change the plan at the &#xA;last second, so instead we ended up taking the train from&#xA;the datacenter to Best Buy to buy a new disk instead.&#xA;&#xA;The actual formatted sizes of these drives are typically &#xA;never printed on the packaging or even mentioned on PDF&#xA;datasheets online. When I could find an actual number&#xA;for a model, it was always the lower 931GB.&#xA;So, we ended up buying a &#34;2TB&#34; drive as it was the only&#xA;one BestBuy had which we could guarantee would work.&#xA;&#xA;So, lesson learned the hard way. If you want to use ZFS &#xA;mirroring and maybe replace a drive later, make sure to&#xA;choose a fixed partition size which is slightly smaller &#xA;than the typical avaliable space on the size of drive &#xA;you&#39;re using, in case the replacement drive was &#xA;manufactured with slightly less avaliable formatted &#xA;space!!!&#xA;&#xA;Once mirroring was restored, we made sure to test it&#xA;in practice by carefully removing a disk from the server &#xA;while it&#39;s running:&#xA;&#xA;https://picopublish.sequentialread.com/files/zfsdiskreplacement/&#xA;&#xA;While we could have theoretically done this maintenance &#xA;remotely with the folks at CyberWurx performing the &#xA;physical parts replacement per a ticket we open with &#xA;them, we wanted to be sure we could meet the timeline&#xA;that the disks had set for US. That&#39;s no knock on &#xA;CyberWurx, moreso a knock on us for yolo-ing this server &#xA;into &#34;production&#34; with tape and no test environment :D&#xA;&#xA;The reality is we are vounteer supported. Right now&#xA;the payments that the club receives from capusl users &#xA;don&#39;t add up to enough to compensate (make ends meet for) &#xA;your average professional software developer or sysadmin,&#xA;at least if local tech labor market stats are to be &#xA;believed.&#xA;&#xA;We are all also working on other things, we can&#39;t devote&#xA;all of our time to capsul. But we do care about capsul,&#xA;we want our service to live, mostly because we use it &#xA;ourselves, but also because the club benefits from it.&#xA;&#xA;We want it to be easy and fun to use, while also staying &#xA;easy and fun to maintain. A system that&#39;s agressively&#xA;maintained will be a lot more likely to remain maintained &#xA;when it&#39;s no one&#39;s job to come in every weekday for that.&#xA;&#xA;That&#39;s why we also decided to upgrade to the latest &#xA;stable Debian major version on baikal while we were&#xA;there. We encountered no issues during the upgrade &#xA;besides a couple of initial omissions in our package &#xA;source lists. The installer also notified us of several&#xA;configuration files we had modified, presenting us with&#xA;a git-merge-ish interface that displayed diffs and &#xA;allowed us to decide to keep our changes, replace our&#xA;file with the new version, or merge the two manually.&#xA;&#xA;I can&#39;t speak more accurately about it than that, as&#xA;j3s did this part and I just watched :)&#xA;&#xA;                        ~&#xA;&#xA;               LOOKING TO THE FUTURE&#xA;&#xA;We wanted to upgrade to this new Debian version because&#xA;it had a new major version of QEMU, supporting virtio-blk&#xA;storage devices that can pass-through file system discard &#xA;commands to the host operating system.&#xA;&#xA;We didn&#39;t see any benefits right away, as the vms &#xA;stayed defined in libvirt as their original machine types,&#xA;either pc-i440fx-3.1 or a type from the pc-q35 family.&#xA;&#xA;After returning home, we noticed that when we created &#xA;a new capsul, it would come up as the pc-i440fx-5.2 &#xA;machine type and the main disk on the guest would display &#xA;discard support in the form of a non-zero DISC-MAX size &#xA;displayed by the lsblk -D command:&#xA;&#xA;localhost:~# sudo lsblk -D&#xA;NAME DISC-ALN DISC-GRAN DISC-MAX DISC-ZERO&#xA;sr0         0        0B       0B         0&#xA;vda       512      512B       2G         0&#xA;&#xA;Most of our capsuls were pc-i440fx ones, and we upgraded &#xA;them to pc-i440fx-5.2, which finally got discards working &#xA;for the grand majority of capsuls.&#xA;&#xA;If you see discard settings like that on your capsul,&#xA;you should also be able to run fstrim -v / on your &#xA;capsul which saves us disk space on baikal:&#xA;&#xA;welcome, cyberian ^(;,;)^&#xA;your machine awaits&#xA;&#xA;localhost:~# sudo lsblk -D&#xA;NAME DISC-ALN DISC-GRAN DISC-MAX DISC-ZERO&#xA;sr0         0        0B       0B         0&#xA;vda       512      512B       2G         0&#xA;&#xA;localhost:~# sudo fstrim -v /&#xA;/: 15.1 GiB (16185487360 bytes) trimmed&#xA;&#xA;^ Please do this if you are able to!&#xA;&#xA;You might also be able to enable an fstrim service or&#xA;timer which will run fstrim to clean up and optimize &#xA;your disk periodically.&#xA;&#xA;However, some of the older vms were the pc-q35 family of &#xA;QEMU machine type, and while I was able to get one of &#xA;ours to upgrade to pc-i440fx-5.2, discard support still &#xA;did not show up in the guest OS. We&#39;re not sure what&#39;s&#xA;happening there yet.&#xA;&#xA;We also improved capsul&#39;s monitoring features; we began&#xA;work on proper infrastructure-as-code-style diffing &#xA;functionality, so we get notified if any key aspects of&#xA;your capsuls are out of whack. In the past this had been&#xA;an issue, with DHCP leases expiring during maintenance&#xA;downtimes and capsuls stealing each-others assigned IP &#xA;addresses when we turn everything back on. &#xA;&#xA;capsul-flask now also includes an admin panel with &#xA;1-click-fix actions built in, leveraging this data: &#xA;&#xA;https://git.cyberia.club/cyberia/capsul-flask/src/commit/b013f9c9758f2cc062f1ecefc4d7deef3aa484f2/capsulflask/admin.py#L36-L202&#xA;&#xA;https://picopublish.sequentialread.com/files/admin-panel.jpg&#xA;&#xA;I acknowledge that this is a bit of a silly system,&#xA;but it&#39;s an artifact of how we do what we do. Capsul&#xA;is always changing and evolving, and the web app was &#xA;built on the idea of simply &#34;providing a button for&#34; &#xA;any manual action that would have to be taken, &#xA;either by a user or by an admin. &#xA;&#xA;At one point, back when capsul was called &#34;cvm&#34;,&#xA;everything was done by hand over email and the &#xA;commandline, so of course anything that reduced the &#xA;amount of manual administration work was welcome, &#xA;and we are still working on that today.&#xA;&#xA;When we build new UIs and prototype features, we learn &#xA;more about how our system works, we expand what&#39;s &#xA;possible for capsul, and we come up with new ways to &#xA;organize data and intelligently direct the venerable &#xA;virtualization software our service is built on. &#xA;&#xA;I think that&#39;s what the &#34;agile development&#34; buzzword from&#xA;professional software development circles was supposed to&#xA;be about: freedom to experiment means better designs &#xA;because we get the opportunity to experience some of the &#xA;consequences before we fully commit to any specific &#xA;design. A touch of humility and flexibility goes a &#xA;long way in my opinion.&#xA;&#xA;We do have a lot of ideas about how to continue &#xA;making capsul easier for everyone involved, things&#xA;like:&#xA;&#xA;Metered billing w/ stripe, so you get a monthly bill &#xA;   with auto-pay to your credit card, and you only pay &#xA;   for the resources you use, similar to what service &#xA;   providers like Backblaze do.&#xA;&#xA;   (Note: of course we would also allow you to &#xA;   pre-pay with cryptocurrency if you wish)&#xA;&#xA;Looking into rewrite options for some parts of the &#xA;   system: perhaps driving QEMU from capsul-flask &#xA;   directly instead of going through libvirt,&#xA;   and perhaps rewriting the web application in golang&#xA;   instead of sticking with flask.&#xA;&#xA;JSON API designed to make it easier to manage capsuls&#xA;   in code, scripts, or with an infrastructure-as-code &#xA;   tool like Terraform.&#xA;&#xA;IO throttling your vms:&#xA;   As I mentioned before, the vms wear out the disks &#xA;   fast. We had hoped that enabling discards would help&#xA;   with this, but it appears that it hasn&#39;t done much&#xA;   to decrease the growth rate of the smartmon wearout&#xA;   indicator metric. &#xA;   So, most likely we will have to enforce some form of &#xA;   limit on the amount of disk writes your capsul can&#xA;   perform while it&#39;s running day in and day out. &#xA;   80-90% of capsul users will never see this limit,&#xA;   but our heaviest writers will be required to either&#xA;   change thier software so it writes less, or pay more&#xA;   money for service. In any case, we&#39;ll send you a&#xA;   warning email long before we throttle your capsul&#39;s&#xA;   disk.&#xA;  &#xA;&#xA;And last but not least, Cybera Computer Club Congress&#xA;voted to use a couple thousand of the capsulbux we&#39;ve &#xA;recieved in payment to purchase a new server, allowing &#xA;us to expand the service ahead of demand and improve our &#xA;processes all the way from hardware up. &#xA;&#xA;(No tape this time!)&#xA;&#xA;https://picopublish.sequentialread.com/files/baikal2&#xA;&#xA;Shown: Dell PowerEdge R640 1U server with two &#xA;10-core xeon silver 4114 processors and 256GB of RAM.&#xA;(Upgradable to 768GB!!)&#xA;&#xA;                        ~&#xA;&#xA;                    CAN I HELP?&#xA;&#xA;Yes! We are not the only ones working on capsul these &#xA;days. For example, another group, https://coopcloud.tech&#xA;has forked capsul-flask and set up thier own instance at&#xA;&#xA;https://yolo.servers.coop&#xA;&#xA;Thier source code repository is here &#xA;(not sure this is the right one):&#xA;&#xA;https://git.autonomic.zone/3wordchant/capsul-flask&#xA;&#xA;Having more people setting up instances of capsul-flask&#xA;really helps us, whether folks are simply testing or &#xA;aiming to run it in production like we do.&#xA;&#xA;Unfortunately we don&#39;t have a direct incentive to&#xA;work on making capsul-flask easier to set up until folks&#xA;ask us how to do it. Autonomic helped us a lot as they &#xA;made thier way through our terrible documentation and &#xA;asked for better organization / clarification along the &#xA;way, leading to much more expansive and organized README &#xA;files.&#xA;&#xA;They also gave a great shove in the right direction when&#xA;they decided to contribute most of a basic automated &#xA;testing implementation and the beginnings of a JSON API &#xA;at the same time. They are building a command line tool&#xA;called abra that can create capsuls upon the users &#xA;request, as well as many other things like installing&#xA;applications. I think it&#39;s very neat :)&#xA;&#xA;Also, just donating or using the service helps support &#xA;cyberia.club, both in terms of maintaing capsul.org and&#xA;reaching out and supporting our local community. &#xA;&#xA;We accept donations via either a credit card (stripe)&#xA;or in Bitcoin, Litecoin, or Monero via our BTCPay server:&#xA;&#xA;https://cyberia.club/donate&#xA;&#xA;For the capsul source code, navigate to:&#xA;&#xA;https://git.cyberia.club/cyberia/capsul-flask&#xA;&#xA;As always, you may contact us at:&#xA;&#xA;mailto:support@cyberia.club&#xA;&#xA;Or on matrix:&#xA;  &#xA;services:cyberia.club&#xA;&#xA;For information on what matrix chat is and how to use it,&#xA;see: https://cyberia.club/matrix&#xA;&#xA;Forest                                         2021-12-17&#xA;]]&gt;</description>
      <content:encoded><![CDATA[<hr>

<p>Imported from <a href="https://cyberia.club/blog" rel="nofollow">https://cyberia.club/blog</a>
Originally published: 2021-12-17</p>

<hr>

<p>rumors of my demise have been greatly exaggerated</p>

<p>Forest                                         2021-12-17</p>

<p>                     WHAT IS THIS?</p>

<p>If you&#39;re a wondering “what is capsul?”, see:</p>

<p><a href="https://capsul.org" rel="nofollow">https://capsul.org</a></p>

<p>Here&#39;s a quick summary of what&#39;s in this post:</p>
<ul><li><p>cryptocurrency payments are back</p></li>

<li><p>we visited the server in person for maintenance</p></li>

<li><p>most capsuls disks should have trim/discard support
now, so you can run the fstrim command to optimize
your capsul&#39;s disk. (please do this, it will save us
a lot of disk space!!)</p></li>

<li><p>we updated most of our operating system images and
added a new rocky linux image!</p></li>

<li><p>potential ideas for future development on capsul</p></li>

<li><p>exciting news about a new server and a new capsul fork
being developed by co-op cloud / servers.coop</p>

<p>                    ~</p></li></ul>

<p>  WHAT HAPPENED TO THE CRYPTOCURRENCY PAYMENT OPTION?</p>

<p>Life happens. Cyberia Computer Club has been hustling
and bustling to build out our new in-person space in
Minneapolis, MN:</p>

<p><a href="https://wiki.cyberia.club/hypha/cyberia_hq/faq" rel="nofollow">https://wiki.cyberia.club/hypha/cyberia_hq/faq</a></p>

<p>Hackerspace, lab, clubhouse, we aren&#39;t sure what to call
it yet, but we&#39;re extremely excited to finish with the
renovations and move in!</p>

<p>In the meantime, something went wrong with the physical
machine hosting our BTCPay server and we didn&#39;t have
anywhere convenient to move it, nor time to replace it,
so we simply disabled cryptocurrency payments
temporarily in September 2021.</p>

<p>Many of yall have emailed us asking “what gives??”,
and I&#39;m glad to finally be able to announce that</p>

<p>“the situation has been dealt with”,</p>

<p>we have a brand new server and the blockchain syncing
process is complete, cryptocurrency payments in bitcoin,
litecoin, and monero are back online now!</p>

<p>    —&gt;   <a href="https://capsul.org/payment/btcpay" rel="nofollow">https://capsul.org/payment/btcpay</a>   &lt;—</p>

<p>                        ~</p>

<p>  THAT ONE TIME CAPSUL WAS ALMOST fsync()&#39;d TO DEATH</p>

<p>Guess what? Yall loved capsul so much, you wore our disks
out. Well, almost.</p>

<p>We use redundant solid state disks + the ZFS file system
for your capsul&#39;s block storage needs, and it turns out
that some of our users like to write files. A lot.</p>

<p>Over time, SSDs will wear out, mostly dependent on how
many writes hit the disk. Baikal, the server behind
capsul.org, is a bit different from a typical desktop
computer, as it hosts about 100 virtual machines, each
with thier own list of application processes, for over 50
individual capsul users, each of whom may be providing
services to many other individuals in turn.</p>

<p>The disk-wear-out situation was exacerbated by our
geographical separation from the server; we live in
Minneapolis, MN, but the server is in Georgia. We wanted
to install NVME drives to expand our storage capacity
ahead of growing demand, but when we would mail PCI-e to
NVME adapters to CyberWurx, our datacenter colocation
provider, they kept telling us the adapter didn&#39;t fit
inside the 1U chassis of the server.</p>

<p>At one point, we were forced to take a risk and undo the
redundancy of the disks in order to expand our storage
capacity and prevent “out of disk space” errors from
crashing your capsuls. It was a calculated risk, trading
certain doom now for the potential possibility of doom
later.</p>

<p>Well, time passed while we were busy with other projects,
and those non-redundant disks started wearing out.
According to the “smartmon” monitoring indicator, they
reached about 25% lifespan remaining. Once the disk
theoretically hit 0%, it would become read-only in order
to protect itself from total data loss.
So we had to replace them before that happened.</p>

<p><a href="https://picopublish.sequentialread.com/files/smartmon_dec2021.png" rel="nofollow">https://picopublish.sequentialread.com/files/smartmon_dec2021.png</a></p>

<p>We were so scared of what could happen if we slept on
this that we booked a flight to Atlanta for maintenance.
We wanted to replace the disks in person, and ensure we
could restore the ZFS disk mirroring feature.</p>

<p>We even custom 3d-printed a bracket for the tiny PCI-e
NVME drive that we needed in order to restore redundancy
for the disks, just to make 100% sure that the
maintenance we were doing would succeed &amp; maintain
stability for everyone who has placed thier trust in us
and voted with thier shells, investing thier time and
money on virtual machines that we maintain on a volunteer
basis.</p>

<p><a href="https://picopublish.sequentialread.com/files/silly-nvme-bracket2.jpg" rel="nofollow">https://picopublish.sequentialread.com/files/silly-nvme-bracket2.jpg</a></p>

<p>Unfortunately, “100% sure” was still not good enough,
the new NVME drive didn&#39;t work as a ZFS mirroring partner
at first ⁠— the existing NVME drive was 951GB, and the
one we had purchased was 931GB. It was too small and ZFS
would not accept that. f0x suggested:</p>

<blockquote><p>[you could] start a new pool on the new disk,
zfs send all the old data over, then have an
equally sized partition on the old disk then add
that to the mirror</p></blockquote>

<p>But we had no idea how to do that exactly or how long it
would take &amp; we didn&#39;t want to change the plan at the
last second, so instead we ended up taking the train from
the datacenter to Best Buy to buy a new disk instead.</p>

<p>The actual formatted sizes of these drives are typically
never printed on the packaging or even mentioned on PDF
datasheets online. When I could find an actual number
for a model, it was always the lower 931GB.
So, we ended up buying a “2TB” drive as it was the only
one BestBuy had which we could guarantee would work.</p>

<p>So, lesson learned the hard way. If you want to use ZFS
mirroring and maybe replace a drive later, make sure to
choose a fixed partition size which is slightly smaller
than the typical avaliable space on the size of drive
you&#39;re using, in case the replacement drive was
manufactured with slightly less avaliable formatted
space!!!</p>

<p>Once mirroring was restored, we made sure to test it
in practice by carefully removing a disk from the server
while it&#39;s running:</p>

<p><a href="https://picopublish.sequentialread.com/files/zfs_disk_replacement/" rel="nofollow">https://picopublish.sequentialread.com/files/zfs_disk_replacement/</a></p>

<p>While we could have theoretically done this maintenance
remotely with the folks at CyberWurx performing the
physical parts replacement per a ticket we open with
them, we wanted to be sure we could meet the timeline
that the disks had set for <strong>US</strong>. That&#39;s no knock on
CyberWurx, moreso a knock on us for yolo-ing this server
into “production” with tape and no test environment :D</p>

<p>The reality is we are vounteer supported. Right now
the payments that the club receives from capusl users
don&#39;t add up to enough to compensate (make ends meet for)
your average professional software developer or sysadmin,
at least if local tech labor market stats are to be
believed.</p>

<p>We are all also working on other things, we can&#39;t devote
all of our time to capsul. But we do care about capsul,
we want our service to live, mostly because we use it
ourselves, but also because the club benefits from it.</p>

<p>We want it to be easy and fun to use, while also staying
easy and fun to maintain. A system that&#39;s agressively
maintained will be a lot more likely to remain maintained
when it&#39;s no one&#39;s job to come in every weekday for that.</p>

<p>That&#39;s why we also decided to upgrade to the latest
stable Debian major version on baikal while we were
there. We encountered no issues during the upgrade
besides a couple of initial omissions in our package
source lists. The installer also notified us of several
configuration files we had modified, presenting us with
a git-merge-ish interface that displayed diffs and
allowed us to decide to keep our changes, replace our
file with the new version, or merge the two manually.</p>

<p>I can&#39;t speak more accurately about it than that, as
j3s did this part and I just watched :)</p>

<p>                        ~</p>

<p>               LOOKING TO THE FUTURE</p>

<p>We wanted to upgrade to this new Debian version because
it had a new major version of QEMU, supporting virtio-blk
storage devices that can pass-through file system discard
commands to the host operating system.</p>

<p>We didn&#39;t see any benefits right away, as the vms
stayed defined in libvirt as their original machine types,
either pc-i440fx-3.1 or a type from the pc-q35 family.</p>

<p>After returning home, we noticed that when we created
a new capsul, it would come up as the pc-i440fx-5.2
machine type and the main disk on the guest would display
discard support in the form of a non-zero DISC-MAX size
displayed by the <code>lsblk -D</code> command:</p>

<p>localhost:~# sudo lsblk -D
NAME DISC-ALN DISC-GRAN DISC-MAX DISC-ZERO
sr0         0        0B       0B         0
vda       512      512B       2G         0</p>

<p>Most of our capsuls were pc-i440fx ones, and we upgraded
them to pc-i440fx-5.2, which finally got discards working
for the grand majority of capsuls.</p>

<p>If you see discard settings like that on your capsul,
you should also be able to run <code>fstrim -v /</code> on your
capsul which saves us disk space on baikal:</p>

<p>welcome, cyberian ^(;,;)^
your machine awaits</p>

<p>localhost:~# sudo lsblk -D
NAME DISC-ALN DISC-GRAN DISC-MAX DISC-ZERO
sr0         0        0B       0B         0
vda       512      512B       2G         0</p>

<p>localhost:~# sudo fstrim -v /
/: 15.1 GiB (16185487360 bytes) trimmed</p>

<p>^ Please do this if you are able to!</p>

<p>You might also be able to enable an fstrim service or
timer which will run fstrim to clean up and optimize
your disk periodically.</p>

<p>However, some of the older vms were the pc-q35 family of
QEMU machine type, and while I was able to get one of
ours to upgrade to pc-i440fx-5.2, discard support still
did not show up in the guest OS. We&#39;re not sure what&#39;s
happening there yet.</p>

<p>We also improved capsul&#39;s monitoring features; we began
work on proper infrastructure-as-code-style diffing
functionality, so we get notified if any key aspects of
your capsuls are out of whack. In the past this had been
an issue, with DHCP leases expiring during maintenance
downtimes and capsuls stealing each-others assigned IP
addresses when we turn everything back on.</p>

<p>capsul-flask now also includes an admin panel with
1-click-fix actions built in, leveraging this data:</p>

<p><a href="https://git.cyberia.club/cyberia/capsul-flask/src/commit/b013f9c9758f2cc062f1ecefc4d7deef3aa484f2/capsulflask/admin.py#L36-L202" rel="nofollow">https://git.cyberia.club/cyberia/capsul-flask/src/commit/b013f9c9758f2cc062f1ecefc4d7deef3aa484f2/capsulflask/admin.py#L36-L202</a></p>

<p><a href="https://picopublish.sequentialread.com/files/admin-panel.jpg" rel="nofollow">https://picopublish.sequentialread.com/files/admin-panel.jpg</a></p>

<p>I acknowledge that this is a bit of a silly system,
but it&#39;s an artifact of how we do what we do. Capsul
is always changing and evolving, and the web app was
built on the idea of simply “providing a button for”
any manual action that would have to be taken,
either by a user or by an admin.</p>

<p>At one point, back when capsul was called “cvm”,
<em>everything</em> was done by hand over email and the
commandline, so of course anything that reduced the
amount of manual administration work was welcome,
and we are still working on that today.</p>

<p>When we build new UIs and prototype features, we learn
more about how our system works, we expand what&#39;s
possible for capsul, and we come up with new ways to
organize data and intelligently direct the venerable
virtualization software our service is built on.</p>

<p>I think that&#39;s what the “agile development” buzzword from
professional software development circles was supposed to
be about: freedom to experiment means better designs
because we get the opportunity to experience some of the
consequences before we fully commit to any specific
design. A touch of humility and flexibility goes a
long way in my opinion.</p>

<p>We do have a lot of ideas about how to continue
making capsul easier for everyone involved, things
like:</p>
<ol><li>Metered billing w/ stripe, so you get a monthly bill
with auto-pay to your credit card, and you only pay
for the resources you use, similar to what service
providers like Backblaze do.</li></ol>

<p>   (Note: of course we would also allow you to
   pre-pay with cryptocurrency if you wish)</p>
<ol><li><p>Looking into rewrite options for some parts of the
system: perhaps driving QEMU from capsul-flask
directly instead of going through libvirt,
and perhaps rewriting the web application in golang
instead of sticking with flask.</p></li>

<li><p>JSON API designed to make it easier to manage capsuls
in code, scripts, or with an infrastructure-as-code
tool like Terraform.</p></li>

<li><p>IO throttling your vms:
As I mentioned before, the vms wear out the disks
fast. We had hoped that enabling discards would help
with this, but it appears that it hasn&#39;t done much
to decrease the growth rate of the smartmon wearout
indicator metric.
So, most likely we will have to enforce some form of
limit on the amount of disk writes your capsul can
perform while it&#39;s running day in and day out.
80-90% of capsul users will never see this limit,
but our heaviest writers will be required to either
change thier software so it writes less, or pay more
money for service. In any case, we&#39;ll send you a
warning email long before we throttle your capsul&#39;s
disk.</p></li></ol>

<p>And last but not least, Cybera Computer Club Congress
voted to use a couple thousand of the capsulbux we&#39;ve
recieved in payment to purchase a new server, allowing
us to expand the service ahead of demand and improve our
processes all the way from hardware up.</p>

<p>(No tape this time!)</p>

<p><a href="https://picopublish.sequentialread.com/files/baikal2" rel="nofollow">https://picopublish.sequentialread.com/files/baikal2</a></p>

<p>Shown: Dell PowerEdge R640 1U server with two
10-core xeon silver 4114 processors and 256GB of RAM.
(Upgradable to 768GB!!)</p>

<p>                        ~</p>

<p>                    CAN I HELP?</p>

<p>Yes! We are not the only ones working on capsul these
days. For example, another group, <a href="https://coopcloud.tech" rel="nofollow">https://coopcloud.tech</a>
has forked capsul-flask and set up thier own instance at</p>

<p><a href="https://yolo.servers.coop" rel="nofollow">https://yolo.servers.coop</a></p>

<p>Thier source code repository is here
(not sure this is the right one):</p>

<p><a href="https://git.autonomic.zone/3wordchant/capsul-flask" rel="nofollow">https://git.autonomic.zone/3wordchant/capsul-flask</a></p>

<p>Having more people setting up instances of capsul-flask
really helps us, whether folks are simply testing or
aiming to run it in production like we do.</p>

<p>Unfortunately we don&#39;t have a direct incentive to
work on making capsul-flask easier to set up until folks
ask us how to do it. Autonomic helped us a lot as they
made thier way through our terrible documentation and
asked for better organization / clarification along the
way, leading to much more expansive and organized README
files.</p>

<p>They also gave a great shove in the right direction when
they decided to contribute most of a basic automated
testing implementation and the beginnings of a JSON API
at the same time. They are building a command line tool
called abra that can create capsuls upon the users
request, as well as many other things like installing
applications. I think it&#39;s very neat :)</p>

<p>Also, just donating or using the service helps support
cyberia.club, both in terms of maintaing capsul.org and
reaching out and supporting our local community.</p>

<p>We accept donations via either a credit card (stripe)
or in Bitcoin, Litecoin, or Monero via our BTCPay server:</p>

<p><a href="https://cyberia.club/donate" rel="nofollow">https://cyberia.club/donate</a></p>

<p>For the capsul source code, navigate to:</p>

<p><a href="https://git.cyberia.club/cyberia/capsul-flask" rel="nofollow">https://git.cyberia.club/cyberia/capsul-flask</a></p>

<p>As always, you may contact us at:</p>

<p>mailto:support@cyberia.club</p>

<p>Or on matrix:</p>

<p>#services:cyberia.club</p>

<p>For information on what matrix chat is and how to use it,
see: <a href="https://cyberia.club/matrix" rel="nofollow">https://cyberia.club/matrix</a></p>

<p>Forest                                         2021-12-17</p>
]]></content:encoded>
      <author>cyberia</author>
      <guid>https://blog.cyberia.club/read/a/uja0hj2h3q</guid>
      <pubDate>Fri, 17 Dec 2021 23:13:04 +0000</pubDate>
    </item>
    <item>
      <title>COVIDaware MN app investigation</title>
      <link>https://blog.cyberia.club/cyberia/covidaware-mn-app-investigation</link>
      <description>&lt;![CDATA[                   COVIDaware MN app investigation&#xA;&#xA;---&#xA;Imported from https://cyberia.club/blog&#xA;Originally published: 2020-11-27&#xA;---&#xA;&#xA;starless                                    2020-11-27&#xA;&#xA;        Greetings to Netizens and Minnesotans!&#xA;&#xA;It&#39;s your friendly neighborhood Cyberians here with an&#xA;update on the new COVIDaware app as announced by the&#xA;Governor.&#xA;&#xA;You might be wondering: &#34;Hey, how bullshit is this app?&#xA;Will it track me when I sleep, will it tell the cops&#xA;where I am for no good reason, will it take my firstborn&#xA;son?&#34;&#xA;&#xA;We were wondering these things, too. We&#39;re hard at work&#xA;finding answers to all these questions and more, and due&#xA;to the urgent nature of the pandemic, wanted to give you&#xA;an update.&#xA;&#xA;Recently, the state of Minnesota released an app to help&#xA;manage COVID-19 contact tracing, The COVIDaware MN app is&#xA;based on an open source foss app for something called&#xA;&#39;contact tracing&#39;, which helps people backtrack the&#xA;places they&#39;ve been in the last two weeks, should they&#xA;later learn that they were contagious but pre-symptomatic&#xA;for COVID-19. Due to the delicate nature of this sort of&#xA;app, we reached out to the folks who wrote the open&#xA;source app that COVIDaware MN is based on, and got a&#xA;handful of helpful replies back.[1] We also reached out&#xA;to the state of Minnesota, but haven&#39;t gotten a response&#xA;yet.[2]&#xA;&#xA;The app that COVIDaware is based on is very&#xA;privacy-friendly and the company behind it seems to have&#xA;good values, but we still don&#39;t know exactly how much&#xA;that source code was customized before it was released&#xA;for use by Minnesotans.  It&#39;s likely that the state&#39;s IT&#xA;folks just added the appropriate assets to customize&#xA;links to the local health department and that sort of&#xA;thing, but we won&#39;t know that for sure without a response&#xA;to our inquiry. There&#39;s a chance they&#39;ve inadvertently&#xA;done more than that, too-- we&#39;d love to read over the&#xA;source code and check the modifications the state of&#xA;Minnesota made to the FOSS base app.&#xA;&#xA;We&#39;ll let you know when we hear back from the state, but&#xA;for now, the base app looks very promising.&#xA;&#xA;Additionally, should it become feasible (likely dependent&#xA;on the state of Minnesota releasing the source code for&#xA;the app), we&#39;re already hoping to be an alternative&#xA;source for the official app, should you prefer something&#xA;that&#39;s built on hardware not managed by the state of&#xA;Minnesota.&#xA;&#xA;We hope to hear back from our fair state government soon,&#xA;and until then, wish you all a warm &amp; safe holiday season!&#xA;&#xA;[1]:&#xA;https://lists.cyberia.club/~cyberia/etc/%3Cfa938b37178d184b7367d33db83ec4f3%40c3f.net%3E&#xA;[2]:&#xA;https://lists.cyberia.club/~cyberia/etc/%3C597a7c3d-2be8-ba0a-dd89-f1d32354b5b4%40riseup.net%3E&#xA;&#xA;source code: https://github.com/Path-Check/gaen-mobile&#xA;]]&gt;</description>
      <content:encoded><![CDATA[<p>                   COVIDaware MN app investigation</p>

<hr>

<p>Imported from <a href="https://cyberia.club/blog" rel="nofollow">https://cyberia.club/blog</a>
Originally published: 2020-11-27</p>

<hr>

<p>starless                                    2020-11-27</p>

<p>        Greetings to Netizens and Minnesotans!</p>

<p>It&#39;s your friendly neighborhood Cyberians here with an
update on the new COVIDaware app as announced by the
Governor.</p>

<p>You might be wondering: “Hey, how bullshit is this app?
Will it track me when I sleep, will it tell the cops
where I am for no good reason, will it take my firstborn
son?”</p>

<p>We were wondering these things, too. We&#39;re hard at work
finding answers to all these questions and more, and due
to the urgent nature of the pandemic, wanted to give you
an update.</p>

<p>Recently, the state of Minnesota released an app to help
manage COVID-19 contact tracing, The COVIDaware MN app is
based on an open source foss app for something called
&#39;contact tracing&#39;, which helps people backtrack the
places they&#39;ve been in the last two weeks, should they
later learn that they were contagious but pre-symptomatic
for COVID-19. Due to the delicate nature of this sort of
app, we reached out to the folks who wrote the open
source app that COVIDaware MN is based on, and got a
handful of helpful replies back.<a href="https://lists.cyberia.club/~cyberia/etc/%3Cfa938b37178d184b7367d33db83ec4f3%40c3f.net%3E" rel="nofollow">1</a> We also reached out
to the state of Minnesota, but haven&#39;t gotten a response
yet.<a href="https://lists.cyberia.club/~cyberia/etc/%3C597a7c3d-2be8-ba0a-dd89-f1d32354b5b4%40riseup.net%3E" rel="nofollow">2</a></p>

<p>The app that COVIDaware is based on is very
privacy-friendly and the company behind it seems to have
good values, but we still don&#39;t know exactly how much
that source code was customized before it was released
for use by Minnesotans.  It&#39;s likely that the state&#39;s IT
folks just added the appropriate assets to customize
links to the local health department and that sort of
thing, but we won&#39;t know that for sure without a response
to our inquiry. There&#39;s a chance they&#39;ve inadvertently
done more than that, too— we&#39;d love to read over the
source code and check the modifications the state of
Minnesota made to the FOSS base app.</p>

<p>We&#39;ll let you know when we hear back from the state, but
for now, the base app looks very promising.</p>

<p>Additionally, should it become feasible (likely dependent
on the state of Minnesota releasing the source code for
the app), we&#39;re already hoping to be an alternative
source for the official app, should you prefer something
that&#39;s built on hardware not managed by the state of
Minnesota.</p>

<p>We hope to hear back from our fair state government soon,
and until then, wish you all a warm &amp; safe holiday season!</p>

<p>source code: <a href="https://github.com/Path-Check/gaen-mobile" rel="nofollow">https://github.com/Path-Check/gaen-mobile</a></p>
]]></content:encoded>
      <author>cyberia</author>
      <guid>https://blog.cyberia.club/read/a/bwlvpgwg7k</guid>
      <pubDate>Fri, 27 Nov 2020 23:13:04 +0000</pubDate>
    </item>
    <item>
      <title>rollin&#39; onwards with a web application</title>
      <link>https://blog.cyberia.club/cyberia/rollin-onwards-with-a-web-application</link>
      <description>&lt;![CDATA[---&#xA;Imported from https://cyberia.club/blog&#xA;Originally published: 2020-05-20&#xA;---&#xA;&#xA;Forest                                         2020-05-20&#xA;&#xA;                WHAT&#39;S NEW IN CAPSUL?&#xA;&#xA;Capsul has been operated by hand so far, with business &#xA;conducted via email. Obviously, this isn&#39;t the best &#xA;user experience. If no one is on the other end at the &#xA;time, the user might feel as if they are shouting into &#xA;the void.&#xA;&#xA;Ideally, users could pay for service, create and destroy&#xA;capsuls, and monitor their capsul&#39;s status at any time. &#xA;&#xA;So we set out to create an application enabling that,&#xA;while keeping things as simple as possible. As of today,&#xA;you can experience it firsthand!&#xA;&#xA;            --  https://capsul.org/   &lt;--&#xA;&#xA;      WHAT IS CAPSUL? WHY WOULD ANYONE DO THAT?&#xA;&#xA;Capsul started out as a &#34;for fun&#34; project to host &#xA;multiple VMs with different operating systems on the same&#xA;physical server. &#xA;&#xA;A cloud compute provider experiment to find out:&#xA;&#xA; How hard is it to build basic compute-as-service&#xA;   functionality that has been mythologized and &#xA;   commoditized by some of the biggest software &#xA;   businesses of all time.&#xA;&#xA; What problems have to be solved in order to do&#xA;   this at a small scale?&#xA;&#xA; And last but not least, &#xA;   how much better-than-the-big-boys can we do? :P&#xA;&#xA;I heard about Capsul and I thought, cool, why not.  &#xA;&#xA;At first, I was slightly dismissive of the project --&#xA;why re-invent the wheel? There are lots of established &#xA;tools for creating cloud services already out there, &#xA;surely they would be hard for us to measure up to.&#xA;&#xA;Of course, you could argue, that&#39;s not the point.&#xA;It&#39;s all about the journey, popping the hood and learning&#xA;how things are put together. &#xA;&#xA;But on the other hand, Capsul is something that we want &#xA;to use, not just a pet project.&#xA;&#xA;               Can I depend on it? &#xA;&#xA;            /⁀\                 /‾⁀|,&#xA;         (‾‾__‾‾)        |      xx . .|&#xA;            /  \           |       [     )    &#xA;           /    \          |       ‶` ‾&#xA;                           |               &#xA;      I WANT TO BELIEVE    |    (X)  DOUBT&#xA;&#xA;Whether excited or doubtful, the tone of the question&#xA;expresses the real utility and risk associated with DIY.  &#xA;&#xA;We have to make our own seat belts for this, an&#xA;experience and practice that I personally feel is highly&#xA;under-rated. &#xA;&#xA;I don&#39;t want to give up and just leave it to the experts.&#xA;&#xA;I want to build the confidence necessary to make my own&#xA;systems, and to measure thier stability and efficacy. &#xA;&#xA;                        (\/)&#xA;                        [. .]&#xA;                       ==.==&#xA;   &#xA;                 &#34; Anyone can Cook &#34;&#xA;&#xA;It probably helps that I&#39;ve never seen a friend get hurt &#xA;because of a flaw in something I designed, but even if&#xA;I had, I&#39;d like to think that I&#39;d continue believing&#xA;in the idea that technology is never &#34;beyond&#34; us. &#xA;I could never make it through Technoholics Anonymous,&#xA;because I&#39;d never be able believe a Higher Power will&#xA;restore sanity to the machine and save us from ourselves.&#xA;&#xA;           ABOUT THE DEVELOPMENT PROCESS&#xA;&#xA;First step was to chose a language and framework. &#xA;We made this decision (Python 3, Flask) almost entirely &#xA;based on which language was the most commonly known in &#xA;our group. I was the only one who had never used Python &#xA;before, and I felt up to the task of learning a language &#xA;as a part of this process. &#xA;&#xA;Next, we had to decide how the system would work. &#xA;&#xA;How would we secure user&#39;s accounts?  How would users &#xA;pay for capsuls?  Would it be like a subscription, &#xA;would you buy compute credits, or a receive a bill at&#xA;the end of the month?&#xA;&#xA;In the interest of simplicity, we opted to use a &#xA;tumblr-style magic-link login instead of requiring &#xA;the user to provide a password. So, you have to&#xA;receive an email and click a link in that email&#xA;every time you log in. &#xA;&#xA;We also decided to go with the &#34;purchase credits, then &#xA;create capsul&#34; payment workflow, because it was the &#xA;easiest way we could accept both credit card and &#xA;cryptocurrency payments, and we believed that requiring &#xA;the user to pay first was an appropriate level of &#xA;friction for our service, at least right now.&#xA;&#xA;I had never worked on a project that integrated &#xA;with a payment processor or had a &#34;dollars&#34; column in a &#xA;database table before. I felt like I worked at the&#xA;Federal Reserve, typing &#xA;&#xA;INSERT INTO payments (account, dollars) VALUES&#xA;    (&#39;forest&#39;, 20.00);&#xA;&#xA;into my database during development. &#xA;&#xA;The application has three backends:&#xA;&#xA; a postgres database where all of the payment and &#xA;   account data is stored&#xA;   &#xA; the virtualization backend which lifecycles the &#xA;   virtual machines and provides information about them&#xA;   (whether or not they exist, and current IP address)&#xA;&#xA; Prometheus metrics database which allows the&#xA;   web application to display real-time metrics for each&#xA;   capsul.&#xA;&#xA;All of the payments are handled by external payment &#xA;processors Stripe and BTCPay Server, so the application&#xA;doesn&#39;t have to deal with credit cards or cryptocurrency&#xA;directly. What&#39;s even better, because BTCPay Server &#xA;tracks the status of invoices automatically, we can&#xA;accept unconfirmed transactions as valid payments and&#xA;then rewind the payment if we learn that it was a&#xA;double-spend attack. No need to bother the user about &#xA;Replace By Fee or anything like that. &#xA;&#xA;The initial development phase took one week. Some days&#xA;I worked on it for 12+ hours, I think. I was having a &#xA;blast. I believe that the application should be secure&#xA;against common types of attacks. I kept the OWASP&#xA;Top 10 Web Application Security Risks in mind while I was&#xA;working on this project, and addressed each one.&#xA;&#xA;Injection&#xA;We use 100% parameterized queries, and we apply strict&#xA;validation to all arguments of all shell scripts.&#xA;&#xA;Broken Authentication&#xA;We have used Flask&#39;s session implementation,&#xA;we did not roll our own sessions.&#xA;&#xA;Sensitive Data Exposure&#xA;We do not handle particularly sensitive data such as&#xA;cryptocurrency wallets or credit card information.&#xA;&#xA;XML External Entities (XXE)&#xA;We do not parse XML.&#xA;&#xA;Broken Access Control&#xA;We have added the user&#39;s email address to all database&#xA;queries that we can. This email address comes from the &#xA;session, so hopefully you can only ever get information&#xA;about YOUR account, and only if you are logged in.&#xA;&#xA;Security Misconfiguration&#xA;We made sure that the application does not display error&#xA;messages to the user, we are not running Flask in&#xA;development mode, we are not running Flask as the root&#xA;user, the server it runs on is well secured and up to &#xA;date, etc.&#xA;&#xA;Cross-Site Scripting (XSS)&#xA;We apply strict validation to user inputs that will be &#xA;represented on the page, whether they are path variables,&#xA;query parameters, form fields, etc. &#xA;&#xA;Insecure Deserialization&#xA;We use the most up-to-date json parsing from the &#xA;Python standard library.&#xA;&#xA;Using Components with Known Vulnerabilities&#xA;We did check the CVE lists for any known issues with the&#xA;versions of Flask and psycopg2 (database connector), &#xA;requests, and various other packages that we are using, &#xA;although automating this process would be much better &#xA;going forward.&#xA;&#xA;10. Insufficient Logging &amp; Monitoring&#xA;We may have some room for improvement here, however,&#xA;verbose logging goes slightly against the &#34;we don&#39;t &#xA;collect any more data about you than we need to&#34; mantra.&#xA;&#xA;If you would like to take a peek at the code, it&#39;s&#xA;hosted on our git server:&#xA;&#xA;https://git.cyberia.club/cyberia/capsul-flask]]&gt;</description>
      <content:encoded><![CDATA[<hr>

<p>Imported from <a href="https://cyberia.club/blog" rel="nofollow">https://cyberia.club/blog</a>
Originally published: 2020-05-20</p>

<hr>

<p>Forest                                         2020-05-20</p>

<p>                WHAT&#39;S NEW IN CAPSUL?</p>

<p>Capsul has been operated by hand so far, with business
conducted via email. Obviously, this isn&#39;t the best
user experience. If no one is on the other end at the
time, the user might feel as if they are shouting into
the void.</p>

<p>Ideally, users could pay for service, create and destroy
capsuls, and monitor their capsul&#39;s status at any time.</p>

<p>So we set out to create an application enabling that,
while keeping things as simple as possible. As of today,
you can experience it firsthand!</p>

<p>            —&gt;   <a href="https://capsul.org/" rel="nofollow">https://capsul.org/</a>   &lt;—</p>

<p>      WHAT IS CAPSUL? WHY WOULD ANYONE DO THAT?</p>

<p>Capsul started out as a “for fun” project to host
multiple VMs with different operating systems on the same
physical server.</p>

<p>A cloud compute provider experiment to find out:</p>
<ul><li><p>How hard is it to build basic compute-as-service
functionality that has been mythologized and
commoditized by some of the biggest software
businesses of all time.</p></li>

<li><p>What problems have to be solved in order to do
this at a small scale?</p></li>

<li><p>And last but not least,
how much better-than-the-big-boys can we do? :P</p></li></ul>

<p>I heard about Capsul and I thought, cool, why not.</p>

<p>At first, I was slightly dismissive of the project —
why re-invent the wheel? There are lots of established
tools for creating cloud services already out there,
surely they would be hard for us to measure up to.</p>

<p>Of course, you could argue, that&#39;s not the point.
It&#39;s all about the journey, popping the hood and learning
how things are put together.</p>

<p>But on the other hand, Capsul is something that we want
to use, not just a pet project.</p>

<p>               Can I depend on it?</p>

<p>            /⁀\                 _<strong>/‾⁀|</strong>,
         (‾‾____‾‾)        |      xx . .|
            /  \           |       [   &gt;)<br>
           /    \          |       ‶` ‾
                           |<br>
      I WANT TO BELIEVE    |    (X)  DOUBT</p>

<p>Whether excited or doubtful, the tone of the question
expresses the real utility and risk associated with DIY.</p>

<p>We have to <strong>make our own seat belts</strong> for this, an
experience and practice that I personally feel is highly
under-rated.</p>

<p>I don&#39;t want to give up and just leave it to the experts.</p>

<p>I want to build the confidence necessary to make my own
systems, and to measure thier stability and efficacy.</p>

<p>                        (_/)
                        [. .]
                       ==&lt;.&gt;==</p>

<p>                 “ Anyone can Cook “</p>

<p>It probably helps that I&#39;ve never seen a friend get hurt
because of a flaw in something I designed, but even if
I had, I&#39;d like to think that I&#39;d continue believing
in the idea that technology is never “beyond” us.
I could never make it through Technoholics Anonymous,
because I&#39;d never be able believe a Higher Power will
restore sanity to the machine and save us from ourselves.</p>

<p>           ABOUT THE DEVELOPMENT PROCESS</p>

<p>First step was to chose a language and framework.
We made this decision (Python 3, Flask) almost entirely
based on which language was the most commonly known in
our group. I was the only one who had never used Python
before, and I felt up to the task of learning a language
as a part of this process.</p>

<p>Next, we had to decide how the system would work.</p>

<p>How would we secure user&#39;s accounts?  How would users
pay for capsuls?  Would it be like a subscription,
would you buy compute credits, or a receive a bill at
the end of the month?</p>

<p>In the interest of simplicity, we opted to use a
tumblr-style magic-link login instead of requiring
the user to provide a password. So, you have to
receive an email and click a link in that email
every time you log in.</p>

<p>We also decided to go with the “purchase credits, then
create capsul” payment workflow, because it was the
easiest way we could accept both credit card and
cryptocurrency payments, and we believed that requiring
the user to pay first was an appropriate level of
friction for our service, at least right now.</p>

<p>I had never worked on a project that integrated
with a payment processor or had a “dollars” column in a
database table before. I felt like I worked at the
Federal Reserve, typing</p>

<p>INSERT INTO payments (account, dollars) VALUES
    (&#39;forest&#39;, 20.00);</p>

<p>into my database during development.</p>

<p>The application has three backends:</p>
<ul><li><p>a postgres database where all of the payment and
account data is stored</p></li>

<li><p>the virtualization backend which lifecycles the
virtual machines and provides information about them
(whether or not they exist, and current IP address)</p></li>

<li><p>Prometheus metrics database which allows the
web application to display real-time metrics for each
capsul.</p></li></ul>

<p>All of the payments are handled by external payment
processors Stripe and BTCPay Server, so the application
doesn&#39;t have to deal with credit cards or cryptocurrency
directly. What&#39;s even better, because BTCPay Server
tracks the status of invoices automatically, we can
accept unconfirmed transactions as valid payments and
then rewind the payment if we learn that it was a
double-spend attack. No need to bother the user about
Replace By Fee or anything like that.</p>

<p>The initial development phase took one week. Some days
I worked on it for 12+ hours, I think. I was having a
blast. I believe that the application should be secure
against common types of attacks. I kept the OWASP
Top 10 Web Application Security Risks in mind while I was
working on this project, and addressed each one.</p>
<ol><li><p>Injection
We use 100% parameterized queries, and we apply strict
validation to all arguments of all shell scripts.</p></li>

<li><p>Broken Authentication
We have used Flask&#39;s session implementation,
we did not roll our own sessions.</p></li>

<li><p>Sensitive Data Exposure
We do not handle particularly sensitive data such as
cryptocurrency wallets or credit card information.</p></li>

<li><p>XML External Entities (XXE)
We do not parse XML.</p></li>

<li><p>Broken Access Control
We have added the user&#39;s email address to all database
queries that we can. This email address comes from the
session, so hopefully you can only ever get information
about YOUR account, and only if you are logged in.</p></li>

<li><p>Security Misconfiguration
We made sure that the application does not display error
messages to the user, we are not running Flask in
development mode, we are not running Flask as the root
user, the server it runs on is well secured and up to
date, etc.</p></li>

<li><p>Cross-Site Scripting (XSS)
We apply strict validation to user inputs that will be
represented on the page, whether they are path variables,
query parameters, form fields, etc.</p></li>

<li><p>Insecure Deserialization
We use the most up-to-date json parsing from the
Python standard library.</p></li>

<li><p>Using Components with Known Vulnerabilities
We did check the CVE lists for any known issues with the
versions of Flask and psycopg2 (database connector),
requests, and various other packages that we are using,
although automating this process would be much better
going forward.</p></li>

<li><p>Insufficient Logging &amp; Monitoring
We may have some room for improvement here, however,
verbose logging goes slightly against the “we don&#39;t
collect any more data about you than we need to” mantra.</p></li></ol>

<p>If you would like to take a peek at the code, it&#39;s
hosted on our git server:</p>

<p><a href="https://git.cyberia.club/cyberia/capsul-flask" rel="nofollow">https://git.cyberia.club/cyberia/capsul-flask</a></p>
]]></content:encoded>
      <author>cyberia</author>
      <guid>https://blog.cyberia.club/read/a/gy7rnmx195</guid>
      <pubDate>Wed, 20 May 2020 22:13:04 +0000</pubDate>
    </item>
    <item>
      <title>Cyberia Services Update</title>
      <link>https://blog.cyberia.club/cyberia/cyberia-services-update</link>
      <description>&lt;![CDATA[---&#xA;Imported from https://cyberia.club/blog&#xA;Originally published: 2020-05-01&#xA;---&#xA;&#xA;Subject: Cyberia Services Update: 2020-04&#xA;From: j3s&#xA;Date: 01/05/2020&#xA;&#xA;Ohai,&#xA;&#xA;A lot has happened in services-land this month, and I&#39;m&#xA;hoping to pack as much of it as I can into this email. I&#xA;will try to be brief, as there is a lot to cover. I&#39;ll&#xA;also probably miss some stuff, woops!&#xA;&#xA;Capsul&#xA;&#xA;We added many new subscribers and many new features to&#xA;Capsul this month, both technical and financial.&#xA;&#xA;OpenBSD 6.6 support&#xA;  Hello puffy! We now fully support OpenBSD 6.6 as an&#xA;operating system choice on Capsul, and will support&#xA;future releases of OpenBSD as well.&#xA;&#xA;Streamlined BTC/XMR payments&#xA;  Pay with bitcoin or monero? There is now a simple&#xA;payment processor you may use to make donations or pay&#xA;for Capsuls. See https://cyberia.club/donate for details.&#xA;&#xA;Guix System 1.1.0 support&#xA;  Guix System support is very near completion! There is one&#xA;bug left to squash before it&#39;s available as a fully&#xA;supported option! :D&#xA;&#xA;IPv6-only support&#xA;  Soon, you will be able to purchase IPv6-only Capsuls at&#xA;a $2 per month discount from IPv4 prices.&#xA;&#xA;Cheaper base prices&#xA;  Pricing will very soon be heavily revised, and all&#xA;Capsuls will be cheaper. Existing customers will be&#xA;refunded the difference between the price they paid and&#xA;the new Capsul price.&#xA;&#xA;À la carte disk size selection&#xA;  All instances will start with a fully backed-up 10GB&#xA;root volume.&#xA;  We will be capable of taking variable disk size&#xA;requests at 0.2c per GB per month! You are no longer&#xA;stuck with the disk size your instance came with.&#xA;  These additional disks are not covered by our backup&#xA;schedule, otherwise we&#39;d run out of disk space almost&#xA;instantly :D we may offer a paid backup system for these&#xA;additional disks in the future.&#xA;&#xA;A huge thank you to our early Capsul users, I hope that&#xA;everything has been running smoothly for you.&#xA;&#xA;Nullhex&#xA;&#xA;I have not focused on Nullhex much throughout April, but&#xA;I do have some exciting ideas to share. Hit me up if&#xA;you&#39;re interested.&#xA;&#xA;Reputation&#xA;  Nullhex emails are no longer marked as spam by&#xA;Protonmail or Gmail, our domain reputation has grown&#xA;substantially.&#xA;&#xA;Matrix&#xA;&#xA;Matrix has cemented itself as the center of our&#xA;communication platform. If you aren&#39;t there already, feel&#xA;free to register at https://matrix.cyberia.club and join&#xA;the conversation.&#xA;&#xA;If you don&#39;t like Matrix for some other reason, email me&#xA;directly and we can figure out a way to bridge you into&#xA;our conversations.&#xA;&#xA;Backend updated&#xA;  The backend has been updated &amp; now supports cross-signing.&#xA;Bridging&#xA;  We are considering bridging specific Matrix rooms with&#xA;specific Discord rooms; more to come on this front.&#xA;&#xA;Riot&#xA;&#xA;End to end encryption by default&#xA;  Riot-web is receiving an update next week(tm) that&#xA;enables end to end encryption and cross-signing by&#xA;default for all private conversations. Please prepare&#xA;thyselves! More deets:&#xA;https://lists.cyberia.club/~cyberia/ops/%3C126414c4-80bc-1d49-570e-cf3eba9e8362%40c3f.net%3E&#xA;&#xA;New preferences&#xA;  There are two new potentially userful riot-web&#xA;preferences, in case you may have missed them:&#xA;  sort rooms alphabetically&#xA;  auto-syntax-highlight-detection&#xA;&#xA;Forge&#xA;&#xA;Forge is our development and project tool. It is intended&#xA;to be used by anyone in the Cyberia community to host&#xA;their projects, and Cyberia will eventually use it&#xA;exclusively to host our group projects.&#xA;&#xA;Forge is approaching the end of the alpha phase. There is&#xA;still a bit of rockiness, but we&#39;ve mostly settled on it&#xA;as a full-fledged service, supported by Cyberia Services.&#xA;&#xA;Forge handles the following (for now):&#xA;&#xA;git repositories&#xA;mailing lists&#xA;ticket trackers&#xA;git-driven wiki pages&#xA;paste service&#xA;&#xA;Forge may handle the following in the future, if we have&#xA;need for it:&#xA;&#xA;builds&#xA;continuous integration&#xA;mercurial repositories&#xA;&#xA;Registration is now open to the public, sign up today!&#xA;https://forge.cyberia.club&#xA;&#xA;Mailing Lists&#xA;&#xA;There are now three important mailing lists that people&#xA;might consider subscribing to:&#xA;&#xA;announce@cyberia.club = general announcements like this&#xA;ops@cyberia.club = services branch discussion&#xA;operational stuff = etc@cyberia.club - everything else&#xA;&#xA;See them and read about them on the Forge:&#xA;https://lists.cyberia.club/&#xA;&#xA;If you have questions or comments about this announcement&#xA;letter, feel free to email ops@cyberia.club and ask us&#xA;about it :)&#xA;&#xA;Misc&#xA;&#xA;Prometheus awareness&#xA;  We monitor our systems with Prometheus - like&#xA;everything else Cyberia does, we operate it publically.&#xA;Check it out at https://prometheus.cyberia.club&#xA;&#xA;Grafana awareness&#xA;  We recently set up Grafana, and fack has been hacking&#xA;on some dashboards. It&#39;s available at&#xA;https://grafana.cyberia.club for public consumption. If&#xA;you&#39;d like a read-write account, email me and I&#39;ll set&#xA;one up for you.&#xA;&#xA;misc@c3f.net deprecated&#xA;  The misc@c3f.net list has been moved to the&#xA;etc@cyberia.club list. I moved all previous misc@c3f.net&#xA;subscribers to the new list, no action is required.&#xA;&#xA;Infra Hackathon&#xA;  There are thoughts about hosting a huge infra hackathon&#xA;to move our systems from Debian to Alpine, with a giant&#xA;laundry list of crap to do. We will be targeting a full&#xA;weekend in the future. Just a heads up.&#xA;&#xA;Operations Handbook&#xA;  We have decided that a monorepo for all of our&#xA;operational-related things is appropriate. See the&#xA;handbook here:&#xA;https://git.cyberia.club/services/ops-handbook/about&#xA;&#xA;A final note: our services would be useless without the&#xA;community that makes use of them. Thanks for all of your&#xA;valuable feedback and discussion. You&#39;re all wonderful.&#xA;Let&#39;s open the next world together.&#xA;&#xA;Your lovely head of services,&#xA;&#xA;j3s&#xA;]]&gt;</description>
      <content:encoded><![CDATA[<hr>

<p>Imported from <a href="https://cyberia.club/blog" rel="nofollow">https://cyberia.club/blog</a>
Originally published: 2020-05-01</p>

<hr>

<p>Subject: Cyberia Services Update: 2020-04
From: j3s
Date: 01/05/2020</p>

<p>Ohai,</p>

<p>A lot has happened in services-land this month, and I&#39;m
hoping to pack as much of it as I can into this email. I
will try to be brief, as there is a lot to cover. I&#39;ll
also probably miss some stuff, woops!</p>

<p>Capsul
======</p>

<p>We added many new subscribers and many new features to
Capsul this month, both technical and financial.</p>
<ul><li><p>OpenBSD 6.6 support
Hello puffy! We now fully support OpenBSD 6.6 as an
operating system choice on Capsul, and will support
future releases of OpenBSD as well.</p></li>

<li><p>Streamlined BTC/XMR payments
Pay with bitcoin or monero? There is now a simple
payment processor you may use to make donations or pay
for Capsuls. See <a href="https://cyberia.club/donate" rel="nofollow">https://cyberia.club/donate</a> for details.</p></li>

<li><p>Guix System 1.1.0 support
Guix System support is very near completion! There is one
bug left to squash before it&#39;s available as a fully
supported option! :D</p></li>

<li><p>IPv6-only support
Soon, you will be able to purchase IPv6-only Capsuls at
a $2 per month discount from IPv4 prices.</p></li>

<li><p>Cheaper base prices
Pricing will very soon be heavily revised, and all
Capsuls will be cheaper. Existing customers will be
refunded the difference between the price they paid and
the new Capsul price.</p></li>

<li><p>À la carte disk size selection</p>
<ul><li>All instances will start with a fully backed-up 10GB
root volume.</li>
<li>We will be capable of taking variable disk size
requests at 0.2c per GB per month! You are no longer
stuck with the disk size your instance came with.</li>
<li>These additional disks are not covered by our backup
schedule, otherwise we&#39;d run out of disk space almost
instantly :D we may offer a paid backup system for these
additional disks in the future.</li></ul></li></ul>

<p>A huge thank you to our early Capsul users, I hope that
everything has been running smoothly for you.</p>

<p>Nullhex
=======</p>

<p>I have not focused on Nullhex much throughout April, but
I do have some exciting ideas to share. Hit me up if
you&#39;re interested.</p>
<ul><li>Reputation
Nullhex emails are no longer marked as spam by
Protonmail or Gmail, our domain reputation has grown
substantially.</li></ul>

<p>Matrix
======</p>

<p>Matrix has cemented itself as the center of our
communication platform. If you aren&#39;t there already, feel
free to register at <a href="https://matrix.cyberia.club" rel="nofollow">https://matrix.cyberia.club</a> and join
the conversation.</p>

<p>If you don&#39;t like Matrix for some other reason, email me
directly and we can figure out a way to bridge you into
our conversations.</p>
<ul><li>Backend updated
The backend has been updated &amp; now supports cross-signing.</li>
<li>Bridging
We are considering bridging specific Matrix rooms with
specific Discord rooms; more to come on this front.</li></ul>

<p>Riot
====</p>
<ul><li><p>End to end encryption by default
Riot-web is receiving an update <strong>next week</strong>™ that
enables end to end encryption and cross-signing by
default for all private conversations. Please prepare
thyselves! More deets:
<a href="https://lists.cyberia.club/~cyberia/ops/%3C126414c4-80bc-1d49-570e-cf3eba9e8362%40c3f.net%3E" rel="nofollow">https://lists.cyberia.club/~cyberia/ops/%3C126414c4-80bc-1d49-570e-cf3eba9e8362%40c3f.net%3E</a></p></li>

<li><p>New preferences
There are two new potentially userful riot-web
preferences, in case you may have missed them:</p>
<ul><li>sort rooms alphabetically</li>
<li>auto-syntax-highlight-detection</li></ul></li></ul>

<p>Forge
=====</p>

<p>Forge is our development and project tool. It is intended
to be used by anyone in the Cyberia community to host
their projects, and Cyberia will eventually use it
exclusively to host our group projects.</p>

<p>Forge is approaching the end of the alpha phase. There is
still a bit of rockiness, but we&#39;ve mostly settled on it
as a full-fledged service, supported by Cyberia Services.</p>

<p>Forge handles the following (for now):</p>
<ul><li>git repositories</li>
<li>mailing lists</li>
<li>ticket trackers</li>
<li>git-driven wiki pages</li>
<li>paste service</li></ul>

<p>Forge may handle the following in the future, if we have
need for it:</p>
<ul><li>builds</li>
<li>continuous integration</li>
<li>mercurial repositories</li></ul>

<p>Registration is now open to the public, sign up today!
<a href="https://forge.cyberia.club" rel="nofollow">https://forge.cyberia.club</a></p>

<p>Mailing Lists
=============</p>

<p>There are now three important mailing lists that people
might consider subscribing to:</p>

<p>announce@cyberia.club = general announcements like this
ops@cyberia.club = services branch discussion
operational stuff = etc@cyberia.club – everything else</p>

<p>See them and read about them on the Forge:
<a href="https://lists.cyberia.club/" rel="nofollow">https://lists.cyberia.club/</a></p>

<p>If you have questions or comments about this announcement
letter, feel free to email ops@cyberia.club and ask us
about it :)</p>

<p>Misc
====</p>
<ul><li><p>Prometheus awareness
We monitor our systems with Prometheus – like
everything else Cyberia does, we operate it publically.
Check it out at <a href="https://prometheus.cyberia.club" rel="nofollow">https://prometheus.cyberia.club</a></p></li>

<li><p>Grafana awareness
We recently set up Grafana, and fack has been hacking
on some dashboards. It&#39;s available at
<a href="https://grafana.cyberia.club" rel="nofollow">https://grafana.cyberia.club</a> for public consumption. If
you&#39;d like a read-write account, email me and I&#39;ll set
one up for you.</p></li>

<li><p>misc@c3f.net deprecated
The misc@c3f.net list has been moved to the
etc@cyberia.club list. I moved all previous misc@c3f.net
subscribers to the new list, no action is required.</p></li>

<li><p>Infra Hackathon
There are thoughts about hosting a huge infra hackathon
to move our systems from Debian to Alpine, with a giant
laundry list of crap to do. We will be targeting a full
weekend in the future. Just a heads up.</p></li>

<li><p>Operations Handbook
We have decided that a monorepo for all of our
operational-related things is appropriate. See the
handbook here:
<a href="https://git.cyberia.club/services/ops-handbook/about" rel="nofollow">https://git.cyberia.club/services/ops-handbook/about</a></p></li></ul>

<p>A final note: our services would be useless without the
community that makes use of them. Thanks for all of your
valuable feedback and discussion. You&#39;re all wonderful.
Let&#39;s open the next world together.</p>

<p>Your lovely head of services,</p>

<p>j3s</p>
]]></content:encoded>
      <author>cyberia</author>
      <guid>https://blog.cyberia.club/read/a/qe5fmqsgzz</guid>
      <pubDate>Fri, 01 May 2020 22:13:04 +0000</pubDate>
    </item>
    <item>
      <title>Simple trusted compute: Announcing Capsul</title>
      <link>https://blog.cyberia.club/cyberia/simple-trusted-compute-announcing-capsul</link>
      <description>&lt;![CDATA[---&#xA;Imported from https://cyberia.club/blog&#xA;Originally published: 2020-03-11&#xA;---&#xA;&#xA;Subject: Simple trusted compute: Announcing Capsul&#xA;From: j3s&#xA;Date: 11/03/2020&#xA;&#xA;+------------------------------------------------------+&#xA;|                                                                                        |&#xA;|                 ANNOUNCING CAPSUL                             |&#xA;|                                                                                        |&#xA;+------------------------------------------------------+&#xA;&#xA;https://capsul.org&#xA;&#xA;Over the last year we&#39;ve moved at light speed. Cyberia&#xA;Computer Club is now an entity. A formal nonprofit&#xA;organization with a democratic structure.&#xA;&#xA;We organized and bought a server. We crowdfunded, and&#xA;spent countless nights testing different configurations.&#xA;We strived to make the service very simple, and very&#xA;maintainable. We&#39;re very proud of what we&#39;re announcing&#xA;today. We think it&#39;s a very unique service.&#xA;&#xA;Capsul is a service that provides people with compute in&#xA;the form of virtual machines. All machines run on very&#xA;fast solid state storage, and have direct T3 network&#xA;access on a shared link. We do not collect user data&#xA;(besides your email address), and discard as many logs as&#xA;we feasibly can. Every VM is automatically backed up&#xA;A more official privacy policy and TOS are coming soon.&#xA;&#xA;To get you excited, here&#39;s a list of initially supported&#xA;operating systems:&#xA;&#xA;          operating system  supported&#xA;          ----------------  ---------&#xA;          alpine            yes&#xA;          ubuntu18          yes&#xA;          debian10          yes&#xA;          centos7           yes&#xA;          centos8           yes&#xA;          OpenBSD 6.6       planned&#xA;          GuixSD 1.0.1      planned&#xA;          Windows           no, never&#xA;          AIX               whyyyy&#xA;&#xA;Our prices start at ~$5.99 a month:&#xA;&#xA;        type    yearly cost  cpus  memory  ssd&#xA;        ------  -----------  ----  ------  ----&#xA;        f1-s    $70          1     512M    10G&#xA;        f1-m    $120         1     1024M   25G&#xA;        f1-l    $240         1     2048M   55G&#xA;        f1-x    $480         2     4096M   80G&#xA;        f1-xx   $960         4     8096M   160G&#xA;        f1-xxx  $1920        8     16G     320G&#xA;&#xA;Capsul is very easy to use - no signup or registration is&#xA;necessary. Simply send an email to capsul@c3f.net with&#xA;your requirements, and you&#39;ll have VMs that you can ssh&#xA;into within a day or so.&#xA;&#xA;Capsul machines are currently paid for on a yearly basis,&#xA;and we&#39;ll make every effort to remind you of payment&#xA;before your year expires. Capsul is very price-similar to&#xA;services like Vultr or Digital Ocean.&#xA;&#xA;  What sets Capsul apart?&#xA;&#xA;Simply: our organization and our morality.&#xA;&#xA;Cyberia Computer Club values privacy, simplicity,&#xA;transparency, accessibility, and inclusion.  We have no&#xA;shareholders, investors, or loaners, therefore every&#xA;change we make is directly beneficial to you. We actually&#xA;care about your experience, and it will only get better&#xA;with time - never worse.&#xA;&#xA;We have a lot more coming for Capsul. The next planned&#xA;features include:&#xA;private networking&#xA;openbsd support&#xA;monthly payments&#xA;instant provisioning and decoms&#xA;ipv6 support (with a reduced price instance type)&#xA;a storage service (for those who want pictures)&#xA;&#xA;That&#39;s all for now! Send us an email and get started with&#xA;Capsul today! :)&#xA;&#xA;love,&#xA;&#xA;j3s&#xA;&#xA;additional resources;&#xA;&#xA;Check out the Capsul website: https://capsul.org&#xA;Check out our bylaws here: https://cyberia.club/bylaws&#xA;Donate to the cause: https://cyberia.club/donate&#xA;All of our source code: https://git.cyberia.club&#xA;Chat with us on Matrix: #cyberia:cyberia.club&#xA;Chat with us on IRC: #cyberia on freenode&#xA;]]&gt;</description>
      <content:encoded><![CDATA[<hr>

<p>Imported from <a href="https://cyberia.club/blog" rel="nofollow">https://cyberia.club/blog</a>
Originally published: 2020-03-11</p>

<hr>

<p>Subject: Simple trusted compute: Announcing Capsul
From: j3s
Date: 11/03/2020</p>

<p>+———————————————————————————+
|                                                                                        |
|                 ANNOUNCING CAPSUL                             |
|                                                                                        |
+———————————————————————————+</p>

<p><a href="https://capsul.org" rel="nofollow">https://capsul.org</a></p>

<p>Over the last year we&#39;ve moved at light speed. Cyberia
Computer Club is now an entity. A formal nonprofit
organization with a democratic structure.</p>

<p>We organized and bought a server. We crowdfunded, and
spent countless nights testing different configurations.
We strived to make the service very simple, and very
maintainable. We&#39;re very proud of what we&#39;re announcing
today. We think it&#39;s a very unique service.</p>

<p>Capsul is a service that provides people with compute in
the form of virtual machines. All machines run on very
fast solid state storage, and have direct T3 network
access on a shared link. We do not collect user data
(besides your email address), and discard as many logs as
we feasibly can. Every VM is automatically backed up
A more official privacy policy and TOS are coming soon.</p>

<p>To get you excited, here&#39;s a list of initially supported
operating systems:</p>

<p>          operating system  supported
          ————————  ————-
          alpine            yes
          ubuntu18          yes
          debian10          yes
          centos7           yes
          centos8           yes
          OpenBSD 6.6       planned
          GuixSD 1.0.1      planned
          Windows           no, never
          AIX               whyyyy</p>

<p>Our prices start at ~$5.99 a month:</p>

<p>        type    yearly cost  cpus  memory  ssd
        ———  —————–  ——  ———  ——
        f1-s    $70          1     512M    10G
        f1-m    $120         1     1024M   25G
        f1-l    $240         1     2048M   55G
        f1-x    $480         2     4096M   80G
        f1-xx   $960         4     8096M   160G
        f1-xxx  $1920        8     16G     320G</p>

<p>Capsul is very easy to use – no signup or registration is
necessary. Simply send an email to capsul@c3f.net with
your requirements, and you&#39;ll have VMs that you can ssh
into within a day or so.</p>

<p>Capsul machines are currently paid for on a yearly basis,
and we&#39;ll make every effort to remind you of payment
before your year expires. Capsul is very price-similar to
services like Vultr or Digital Ocean.</p>

<blockquote><p>What sets Capsul apart?</p></blockquote>

<p>Simply: our organization and our morality.</p>

<p>Cyberia Computer Club values privacy, simplicity,
transparency, accessibility, and inclusion.  We have no
shareholders, investors, or loaners, therefore every
change we make is directly beneficial to you. We actually
care about your experience, and it will only get better
with time – never worse.</p>

<p>We have a lot more coming for Capsul. The next planned
features include:
– private networking
– openbsd support
– monthly payments
– instant provisioning and decoms
– ipv6 support (with a reduced price instance type)
– a storage service (for those who want pictures)</p>

<p>That&#39;s all for now! Send us an email and get started with
Capsul today! :)</p>

<p>love,</p>

<p>j3s</p>

<p>additional resources;</p>

<p>Check out the Capsul website: <a href="https://capsul.org" rel="nofollow">https://capsul.org</a>
Check out our bylaws here: <a href="https://cyberia.club/bylaws" rel="nofollow">https://cyberia.club/bylaws</a>
Donate to the cause: <a href="https://cyberia.club/donate" rel="nofollow">https://cyberia.club/donate</a>
All of our source code: <a href="https://git.cyberia.club" rel="nofollow">https://git.cyberia.club</a>
Chat with us on Matrix: #cyberia:cyberia.club
Chat with us on IRC: #cyberia on freenode</p>
]]></content:encoded>
      <author>cyberia</author>
      <guid>https://blog.cyberia.club/read/a/zifmda242l</guid>
      <pubDate>Wed, 11 Mar 2020 22:13:04 +0000</pubDate>
    </item>
  </channel>
</rss>