From b1eed925e590b4ace01e3a2f648ba9fb6ee5dcde5b1bacbe212b89929a644872 Mon Sep 17 00:00:00 2001 From: Nicholas Johnson Date: Mon, 25 Nov 2024 00:00:00 +0000 Subject: Move static files to subdirectory and update links It's good practice to keep static website assets isolated to their own subdirectory. --- content/about.md | 4 +- content/entry/atom-and-rss.md | 4 +- content/entry/dead-mans-switch.md | 2 +- content/entry/future-proof-digital-timestamping.md | 2 +- content/entry/icannot-be-trusted.md | 2 +- content/entry/site-update-006.md | 2 +- content/entry/statement-of-gpg-key-transition.md | 4 +- ...truggle-to-graduate-without-nonfree-software.md | 2 +- content/entry/tone-deaf-marketing.md | 2 +- content/entry/why-i-timestamped-my-journal.md | 4 +- static/climate-change-marketing-transcript.txt | 22 -- static/decision-tree.jpg | Bin 28850 -> 0 bytes static/feed-icon-28x28.png | Bin 1680 -> 0 bytes static/gpg-signify-transition-statement.txt.asc | 35 -- static/gpg-signify-transition-statement.txt.sig | 27 -- static/narrative.org | 375 --------------------- static/old-favicon.ico | Bin 15406 -> 0 bytes static/signify.pub | 2 - .../static/climate-change-marketing-transcript.txt | 22 ++ static/static/decision-tree.jpg | Bin 0 -> 28850 bytes static/static/feed-icon-28x28.png | Bin 0 -> 1680 bytes .../gpg-signify-transition-statement.txt.asc | 35 ++ .../gpg-signify-transition-statement.txt.sig | 27 ++ static/static/narrative.org | 375 +++++++++++++++++++++ static/static/old-favicon.ico | Bin 0 -> 15406 bytes static/static/signify.pub | 2 + static/static/timestamp-1.txt | 45 +++ static/static/timestamp-2.ots | Bin 0 -> 1119 bytes static/timestamp-1.txt | 45 --- static/timestamp-2.ots | Bin 1119 -> 0 bytes 30 files changed, 520 insertions(+), 520 deletions(-) delete mode 100644 static/climate-change-marketing-transcript.txt delete mode 100644 static/decision-tree.jpg delete mode 100644 static/feed-icon-28x28.png delete mode 100644 static/gpg-signify-transition-statement.txt.asc delete mode 100644 static/gpg-signify-transition-statement.txt.sig delete mode 100644 static/narrative.org delete mode 100644 static/old-favicon.ico delete mode 100644 static/signify.pub create mode 100644 static/static/climate-change-marketing-transcript.txt create mode 100644 static/static/decision-tree.jpg create mode 100644 static/static/feed-icon-28x28.png create mode 100644 static/static/gpg-signify-transition-statement.txt.asc create mode 100644 static/static/gpg-signify-transition-statement.txt.sig create mode 100644 static/static/narrative.org create mode 100644 static/static/old-favicon.ico create mode 100644 static/static/signify.pub create mode 100644 static/static/timestamp-1.txt create mode 100644 static/static/timestamp-2.ots delete mode 100644 static/timestamp-1.txt delete mode 100644 static/timestamp-2.ots diff --git a/content/about.md b/content/about.md index 69f5a46..16b6f30 100644 --- a/content/about.md +++ b/content/about.md @@ -18,7 +18,7 @@ SimpleX is my preferred method of contact. It's private and secure. My LibrePlanet talk contains a slide (at timestamp 00:40) verifying that the signing key below belongs to me. -[:key: Signify Key](/signify.pub) +[:key: Signify Key](/static/signify.pub) [:tv: LibrePlanet Talk](https://media.libreplanet.org/u/libreplanet/m/taking-back-the-web-with-haketilo/) The git-signify helper script can use my signing key to verify the authenticity of this journal. @@ -76,5 +76,5 @@ To provide some assurance that I don't use AI tools to write this journal, I tim ```sh git clone --recursive https://git.nicholasjohnson.ch/journal -ots verify -d "$(git -C journal show-ref --hash signify-signature-10)" journal/static/timestamp-2.ots +ots verify -d "$(git -C journal show-ref --hash signify-signature-10)" journal/static/static/timestamp-2.ots ``` diff --git a/content/entry/atom-and-rss.md b/content/entry/atom-and-rss.md index f7cfb04..a652a6a 100644 --- a/content/entry/atom-and-rss.md +++ b/content/entry/atom-and-rss.md @@ -5,7 +5,7 @@ tags: ['computing'] draft: false --- Most netizens are vaguely familiar with this symbol: -[RSS icon [IMG]](/feed-icon-28x28.png) +[RSS icon [IMG]](/static/feed-icon-28x28.png) It represents [Atom](https://en.wikipedia.org/wiki/Atom_%28standard%29) and [RSS](https://en.wikipedia.org/wiki/RSS). From Wikipedia ([CC BY-SA 3.0](https://creativecommons.org/licenses/by-sa/3.0/)): ## RSS @@ -22,7 +22,7 @@ I'm not inherently against social media. I'm just against proprietary walled gar Now that you know what Atom/RSS is and you have an idea what it's used for, I'll move on to the meat of this post: how to use Atom/RSS. To begin using Atom/RSS yourself, you'll need to install a feed reader. There is mature feed reader software available for all major platforms including mobile. Decent feed readers support both Atom and RSS and you probably won't need to know which is which. Most sites including this one still use RSS. I do plan to eventually switch [my site feed](/atom.xml) over to Atom since it's more modern. Once you find the feed symbol -[RSS icon [IMG]](/feed-icon-28x28.png) +[RSS icon [IMG]](/static/feed-icon-28x28.png) on the webpage with the feed you want, just copy paste the link adding it into your feed reader and you're golden. After that your reader will take care of retrieving the content from that feed automatically. If you can't find a feed icon on a site, that doesn't mean the site doesn't support RSS. They may just not advertise it. Search the web for that site's RSS feed to see if anything turns up. If nothing turns up, there are websites that will parse the page you want turning it into a web feed. As long as you're not required to log in to view the content, you can probably find an RSS feed for it. Decent Atom/RSS aggregators allow you to create groups of feeds, so you can combine related feeds or view them separately. You can even aggregate all your feeds into 1 big feed if that's what you want. With Atom/RSS, the choice is yours. If you stop reading a feed, it's as easy to remove from your aggregator as it was to add. Sites with lots of content offer Atom/RSS feeds based on category. For example if you're only interested in my posts about "computing", you can subscribe only to this RSS feed. diff --git a/content/entry/dead-mans-switch.md b/content/entry/dead-mans-switch.md index 2b7887e..f488d84 100644 --- a/content/entry/dead-mans-switch.md +++ b/content/entry/dead-mans-switch.md @@ -43,7 +43,7 @@ In theory the DMS represents a sequential, [noncooperative game](https://en.wiki This point structure assumes both Players value retribution but not as much as avoiding harm. Both Players assume the other will adopt the strategy of maximizing their own points. Using the [Minimax](https://en.wikipedia.org/wiki/Minimax#Example_2) algorithm it can be determined that both Players will do nothing. Any other action would result in both players having less points. Points are represented for each Player in the format (P1,P2) in the decision tree below: -[decision-tree [IMG]](/decision-tree.jpg) +[decision-tree [IMG]](/static/decision-tree.jpg) ## In Practice In practice there are a number of complicating factors. Player 2 may not know exactly what the leaks contain making it impossible to value the cost of violence. Player 1 can create the perception of cost but in reality not even set up the switch or set one up incorrectly so it doesn't work or simply forget to deactivate it thus triggering it. Player 2 may find a way to disarm it. To account for the real-world outcomes you would need a much larger decision tree. And even then what are the chances that both players act rationally? So don't think that a DMS is guaranteed to be effective. diff --git a/content/entry/future-proof-digital-timestamping.md b/content/entry/future-proof-digital-timestamping.md index fa83e55..f08eee6 100644 --- a/content/entry/future-proof-digital-timestamping.md +++ b/content/entry/future-proof-digital-timestamping.md @@ -25,7 +25,7 @@ Then I found [OpenTimestamps](https://opentimestamps.org/). It's based on Bitcoi Also, OpenTimestamps has an extremely efficient design compared to other Bitcoin timestamping schemes. Thanks to OpenTimestamps' clever use of [Merkle trees](https://petertodd.org/2016/opentimestamps-announcement#merkle-trees), it can timestamp unlimited data using only 1 transaction. Other Bitcoin timestamping software uses 1 transaction per timestamp, an extremely wasteful, inefficient design. At least OpenTimestamps isn't that bad. -So anyway, I created a timestamped Git commit and tagged it [timestamp-1](https://archive.softwareheritage.org/swh:1:rel:e4726ec79a43e28c616e4d5f3db0efe2237b23f9;origin=https://git.nicholasjohnson.ch/nicksphere-gmi;visit=swh:1:snp:fb9bef300f9b939382f5656232d95377c8630a10). I wrote the concatenated commit data of the timestamped commit to [a file](/timestamp-1.txt) in case you're interested to see what it looks like. The software works in a very elegant fashion. It even maintains compatibility with non-OpenTimestamps Git clients, so GnuPG can still verify the commit signature. +So anyway, I created a timestamped Git commit and tagged it [timestamp-1](https://archive.softwareheritage.org/swh:1:rel:e4726ec79a43e28c616e4d5f3db0efe2237b23f9;origin=https://git.nicholasjohnson.ch/nicksphere-gmi;visit=swh:1:snp:fb9bef300f9b939382f5656232d95377c8630a10). I wrote the concatenated commit data of the timestamped commit to [a file](/static/timestamp-1.txt) in case you're interested to see what it looks like. The software works in a very elegant fashion. It even maintains compatibility with non-OpenTimestamps Git clients, so GnuPG can still verify the commit signature. The base64-encoded timestamp appended to the commit data includes all the necessary hashes to build the Merkle path from the tagged commit to the merkle root included in the Bitcoin transaction. Using './ots --git-extract [filename]' on any file in the nicksphere-gmi repo present at the timestamped commit, you can extract an ots proof file which you can then verify with './ots --verify [filename]'. diff --git a/content/entry/icannot-be-trusted.md b/content/entry/icannot-be-trusted.md index 6fc5c9b..676822e 100644 --- a/content/entry/icannot-be-trusted.md +++ b/content/entry/icannot-be-trusted.md @@ -18,6 +18,6 @@ Ideally, you're accessing this journal [over](gemini://nick6gsepvtmkcpibpid6dqtq My Tor onion and I2P addresses aren't foolproof. They're hosted on a VPS, meaning my VPS provider could hijack them. Using nicholasjohnson.ch to access my journal, you have to trust both ICANN and my VPS though. So you're better off using Tor or I2P so you only need to trust one third party, not two. -Brief digression: To avoid trusting any third party, you can always [verify my journal's Git repository](https://archive.softwareheritage.org/swh:1:rev:0990ac4365ea2e436a9d28aeefdd16ec65c27afa;visit=swh:1:snp:d25282c0c441839d1ca147a90699bd2c7d986a21) with [my public Signify key](/signify.pub) and a small utility called [git-signify](https://git.nicholasjohnson.ch/git-signify/). If there's any doubt the key is mine, I gave a [Libreplanet talk](https://media.libreplanet.org/u/libreplanet/m/taking-back-the-web-with-haketilo/) with my public key in the slides five months ago and I have an unbroken history of public keys going back to December of 2020 starting with my original [GPG key](/2021/12/30/statement-of-gpg-key-transition/) which I transitioned away from. +Brief digression: To avoid trusting any third party, you can always [verify my journal's Git repository](https://archive.softwareheritage.org/swh:1:rev:0990ac4365ea2e436a9d28aeefdd16ec65c27afa;visit=swh:1:snp:d25282c0c441839d1ca147a90699bd2c7d986a21) with [my public Signify key](/static/signify.pub) and a small utility called [git-signify](https://git.nicholasjohnson.ch/git-signify/). If there's any doubt the key is mine, I gave a [Libreplanet talk](https://media.libreplanet.org/u/libreplanet/m/taking-back-the-web-with-haketilo/) with my public key in the slides five months ago and I have an unbroken history of public keys going back to December of 2020 starting with my original [GPG key](/2021/12/30/statement-of-gpg-key-transition/) which I transitioned away from. If you yourself are an online service provider, please follow my example and offer a Tor onion and/or I2P address to help resist ICANN's power. diff --git a/content/entry/site-update-006.md b/content/entry/site-update-006.md index 48cca96..30d47c4 100644 --- a/content/entry/site-update-006.md +++ b/content/entry/site-update-006.md @@ -7,6 +7,6 @@ draft: false # What's New I changed the website theme. It's darker now and much easier on the eyes. I didn't particularly like the last theme ever since I started using it. I only picked it because it was easy to manage with how minimal it was. I added a favicon to identify my site: -[favicon [IMG]](/old-favicon.ico) +[favicon [IMG]](/static/old-favicon.ico) It's nothing to brag about. I just thought I ought to have something there. The markdown is improved, especially the blockquotes. It didn't seem like they were rendering on the previous theme, but now they do. Each post now has a word count and estimated reading time in the metadata section. Posts are paginated so they're not all on one page like before. I'm allergic to client-side JS, so this site has none. I modified the theme to use CSS rather than JS for the interactive features. I'm happy with the way it turned out and I consider it a significant improvement. The new theme is everything I originally wanted for my blog, so it's here to stay. diff --git a/content/entry/statement-of-gpg-key-transition.md b/content/entry/statement-of-gpg-key-transition.md index 6187313..058de96 100644 --- a/content/entry/statement-of-gpg-key-transition.md +++ b/content/entry/statement-of-gpg-key-transition.md @@ -20,10 +20,10 @@ The new Signify key is: RWTJ8JZMFWhB2Ya9GyXbmOQKSxd/x57IV/oNo6/nl344CR1aqf/OgPXf If you have my old GnuPG key, you can verify this transition statement with: -gpg2 --verify [gpg-signify-transition-statement.txt.asc](/gpg-signify-transition-statement.txt.asc) +gpg2 --verify [gpg-signify-transition-statement.txt.asc](/static/gpg-signify-transition-statement.txt.asc) You can verify the new Signify key with: -signify -V -e -p key.pub -m [gpg-signify-transition-statement.txt.sig](/gpg-signify-transition-statement.txt.sig) +signify -V -e -p key.pub -m [gpg-signify-transition-statement.txt.sig](/static/gpg-signify-transition-statement.txt.sig) Thank you, and sorry for the inconvenience. diff --git a/content/entry/struggle-to-graduate-without-nonfree-software.md b/content/entry/struggle-to-graduate-without-nonfree-software.md index aad76bf..f3705d1 100644 --- a/content/entry/struggle-to-graduate-without-nonfree-software.md +++ b/content/entry/struggle-to-graduate-without-nonfree-software.md @@ -7,7 +7,7 @@ draft: false # Introduction From the title of this journal entry alone, you might think it's about my story struggling to graduate without nonfree software. But I've already beaten that topic to death on this journal. It's time for someone else's story: Wojciech Kosior. He faced the same sort of difficulties graduating that I did, except he graduated. His story is one of incredible determination and persistence. He fought hard to graduate in freedom and won. I don't know of many people with the resolve displayed in his narrative. -The revised narrative of his struggle can be found on [gnu.org](https://www.gnu.org/education/how-i-fought-to-graduate-without-using-non-free-software.html). It went through at least 20 revisions before being published. Many of the details were stripped. He kindly sent me the unedited original copy of his narrative which I personally find more inspiring than the one on gnu.org. I modified the narrative's formatting to make it more presentable here. It was originally sent as a .org. If you want the original .org file (for Emacs), I've uploaded it to this web server for [download](/narrative.org). +The revised narrative of his struggle can be found on [gnu.org](https://www.gnu.org/education/how-i-fought-to-graduate-without-using-non-free-software.html). It went through at least 20 revisions before being published. Many of the details were stripped. He kindly sent me the unedited original copy of his narrative which I personally find more inspiring than the one on gnu.org. I modified the narrative's formatting to make it more presentable here. It was originally sent as a .org. If you want the original .org file (for Emacs), I've uploaded it to this web server for [download](/static/narrative.org). If you enjoyed reading my story struggling to graduate without nonfree software, then you're in for a treat. Without further introduction, I present to you Wojciech Kosior's narrative. diff --git a/content/entry/tone-deaf-marketing.md b/content/entry/tone-deaf-marketing.md index 35812c8..4854e25 100644 --- a/content/entry/tone-deaf-marketing.md +++ b/content/entry/tone-deaf-marketing.md @@ -5,7 +5,7 @@ draft: false --- Today I visited the website of a business that I've been a long-time customer of and noticed something strange about their marketing. They were advertising a "summer heat wave special". This came off to me as absolutely tone deaf and in poor taste. We are in the middle of arguably the biggest crisis humanity has ever faced in its history and the disastrous effects it's having are being used as a marketing strategy? -Understand that I am not one of those people who complains to customer service departments on a regular basis over minor problems, but in this case I felt it appropriate. You can find the full reformatted and redacted transcript [here](/climate-change-marketing-transcript.txt "Customer Service Transcript") if you're interested. For this entry, I have cut out the irrelevant automated messages to save time: +Understand that I am not one of those people who complains to customer service departments on a regular basis over minor problems, but in this case I felt it appropriate. You can find the full reformatted and redacted transcript [here](/static/climate-change-marketing-transcript.txt "Customer Service Transcript") if you're interested. For this entry, I have cut out the irrelevant automated messages to save time: ```plaintext 5:41:45 p.m. [REDACTED]: Good Afternoon, Thank you for contacting [REDACTED]. This is [REDACTED]. How may I assist you? diff --git a/content/entry/why-i-timestamped-my-journal.md b/content/entry/why-i-timestamped-my-journal.md index 0947e74..de31e47 100644 --- a/content/entry/why-i-timestamped-my-journal.md +++ b/content/entry/why-i-timestamped-my-journal.md @@ -33,7 +33,7 @@ Commands: ```sh git clone --recursive https://git.nicholasjohnson.ch/journal -ots verify -d "$(git -C journal show-ref --hash signify-signature-10)" journal/static/timestamp-2.ots +ots verify -d "$(git -C journal show-ref --hash signify-signature-10)" journal/static/static/timestamp-2.ots ``` @@ -45,6 +45,6 @@ Timestamp chaining could perhaps provide stronger assurance of the legitimacy of But one good idea contained in that entry was to restamp this journal's Git repo to future-proof its timestamp. The old timestamp was performed on the old repo which used the broken SHA-1 hashing algorithm. Since then, I converted the repo to the new SHA-2 object format and SHA-2 support in Git has been stabilized. So everything I needed to create a new, stronger timestamp was present. Well, almost everything. -The only issue I ran into was that the OpenTimestamps software does not have sufficient [Git integration](https://github.com/opentimestamps/opentimestamps-client/blob/master/doc/git-integration.md "OpenTimestamps Git Integration") to embed timestamps within Git objects in SHA-2 repos like it can for SHA-1 repos. So I just timestamped [the most recent tag](https://git.nicholasjohnson.ch/journal/tag/?h=signify-signature-10 "Most Recent Tag of Journal Repo") manually, creating a fully separate [.ots proof file](/timestamp-2.ots "Timestamp Proof File") which is verified without using OpenTimestamps' GnuPG wrapper. +The only issue I ran into was that the OpenTimestamps software does not have sufficient [Git integration](https://github.com/opentimestamps/opentimestamps-client/blob/master/doc/git-integration.md "OpenTimestamps Git Integration") to embed timestamps within Git objects in SHA-2 repos like it can for SHA-1 repos. So I just timestamped [the most recent tag](https://git.nicholasjohnson.ch/journal/tag/?h=signify-signature-10 "Most Recent Tag of Journal Repo") manually, creating a fully separate [.ots proof file](/static/timestamp-2.ots "Timestamp Proof File") which is verified without using OpenTimestamps' GnuPG wrapper. Hopefully the new timestamp lasts. If not, both [Software Heritage](https://archive.softwareheritage.org/browse/origin/directory/?origin_url=https://git.nicholasjohnson.ch/journal "Journal Repo on Software Heritage") and [Archive.org](https://web.archive.org/web/*/https://nicholasjohnson.ch/ "Journal on Archive.org") have centralized timestamps of this journal as fallbacks. diff --git a/static/climate-change-marketing-transcript.txt b/static/climate-change-marketing-transcript.txt deleted file mode 100644 index 7417d3b..0000000 --- a/static/climate-change-marketing-transcript.txt +++ /dev/null @@ -1,22 +0,0 @@ -7/18/2023 5:37:02 p.m. IC: Welcome to [REDACTED]! -5:37:02 p.m. IC: Interaction transferred to Member Contact Center - Chat. -5:37:02 p.m. IC: All agents are busy assisting other customers. -5:37:02 p.m. IC: Your position in queue is 1. -5:37:04 p.m. IC: Your estimated wait time is approximately one minute. -5:37:04 p.m. IC: Your position in queue and estimated wait time will be updated in approximately three minutes. -5:37:04 p.m. IC: To leave a message, type YES and click the send button now. Otherwise, please continue to hold and the next available agent will assist you as soon as possible. -5:40:03 p.m. IC: All agents are busy assisting other customers. -5:40:03 p.m. IC: Your position in queue is 1. -5:40:03 p.m. IC: Your estimated wait time is approximately one minute. -5:40:03 p.m. IC: Your position in queue and estimated wait time will be updated in approximately three minutes. -5:40:03 p.m. IC: To leave a message, type YES and click the send button now. Otherwise, please continue to hold and the next available agent will assist you as soon as possible. -5:41:29 p.m. IC: Interaction alerting [REDACTED]. -5:41:31 p.m. IC: [REDACTED] has joined the conversation. -5:41:45 p.m. [REDACTED]: Good Afternoon, Thank you for contacting [REDACTED]. This is [REDACTED]. How may I assist you? -5:43:03 p.m. Nicholas Johnson: Yes. I recently noticed [REDACTED]'s marketing of the "summer heat wave special". -5:43:41 p.m. Nicholas Johnson: I think this marketing is tone deaf and should be changed, especially since 2023 is on track to be the hottest year ever recorded. Maybe something like "summer special" would be better, but not mentioning the heat wave. -5:44:43 p.m. [REDACTED]: We do appreciate your feedback Nicholas. I will be sure to pass the suggestion on to our marketing department. -5:44:51 p.m. [REDACTED]: Is there anything else I can assist you with today? -5:45:39 p.m. Nicholas Johnson: Thank you. Please do pass this on. That is all I need for today. -5:45:56 p.m. [REDACTED]: No problem at all. Thank you for contacting [REDACTED]. Have a wonderful day! -5:46:01 p.m. IC: Agent has left the conversation diff --git a/static/decision-tree.jpg b/static/decision-tree.jpg deleted file mode 100644 index af78b8d..0000000 Binary files a/static/decision-tree.jpg and /dev/null differ diff --git a/static/feed-icon-28x28.png b/static/feed-icon-28x28.png deleted file mode 100644 index 26d64ab..0000000 Binary files a/static/feed-icon-28x28.png and /dev/null differ diff --git a/static/gpg-signify-transition-statement.txt.asc b/static/gpg-signify-transition-statement.txt.asc deleted file mode 100644 index 7f55660..0000000 --- a/static/gpg-signify-transition-statement.txt.asc +++ /dev/null @@ -1,35 +0,0 @@ ------BEGIN PGP SIGNED MESSAGE----- -Hash: SHA512 - -Date: 2021-12-30 - -Statement of GPG Key Transition - -To replace my GnuPG key, I have set up a new Signify key, and will be transitioning away from my GnuPG key. - -The GnuPG key will continue to be valid until 2022-02-01 for the purpose of verifying this transition statement. Please do not use it send me encrypted emails anymore. - -This message is signed by both keys to certify the transition. - -The old GnuPG key's primary key fingerprint was: -BF49E81C1D888979B6506B225B4FE8CA89C066C0 - -The new Signify key is: -RWTJ8JZMFWhB2Ya9GyXbmOQKSxd/x57IV/oNo6/nl344CR1aqf/OgPXf - -If you have my old GnuPG key, you can verify this transition statement with: -gpg2 --verify gpg-signify-transition-statement.txt.asc - -You can verify the new Signify key with: -signify -V -e -p key.pub -m gpg-signify-transition-statement.txt - -Thank you, and sorry for the inconvenience. - -Nick ------BEGIN PGP SIGNATURE----- - -iHUEARYKAB0WIQS/SegcHYiJebZQayJbT+jKicBmwAUCX+0UgAAKCRBbT+jKicBm -wOjOAQC6NKik3E4ooWBFEXm+0jNoENASyVFRRGNZ1qnaazPZUwEAvD88rtV75Z+9 -NX1JG1iGPgTcfKO1I+m4PblgxXCsbQ8= -=novT ------END PGP SIGNATURE----- diff --git a/static/gpg-signify-transition-statement.txt.sig b/static/gpg-signify-transition-statement.txt.sig deleted file mode 100644 index 19a074f..0000000 --- a/static/gpg-signify-transition-statement.txt.sig +++ /dev/null @@ -1,27 +0,0 @@ -untrusted comment: verify with key.pub -RWTJ8JZMFWhB2eYyA14Q6xQJS/Ak0RrXKrvixXFQujsOcIwD/plAkeOhd6QxO8sQxsiwiG5Zvo6JIi7IQycjB3ycCrs/Yp0lZQQ= -Date: 2021-12-30 - -Statement of GPG Key Transition - -To replace my GnuPG key, I have set up a new Signify key, and will be transitioning away from my GnuPG key. - -The GnuPG key will continue to be valid until 2022-02-01 for the purpose of verifying this transition statement. Please do not use it send me encrypted emails anymore. - -This message is signed by both keys to certify the transition. - -The old GnuPG key's primary key fingerprint was: -BF49E81C1D888979B6506B225B4FE8CA89C066C0 - -The new Signify key is: -RWTJ8JZMFWhB2Ya9GyXbmOQKSxd/x57IV/oNo6/nl344CR1aqf/OgPXf - -If you have my old GnuPG key, you can verify this transition statement with: -gpg2 --verify gpg-signify-transition-statement.txt.asc - -You can verify the new Signify key with: -signify -V -e -p key.pub -m gpg-signify-transition-statement.txt - -Thank you, and sorry for the inconvenience. - -Nick diff --git a/static/narrative.org b/static/narrative.org deleted file mode 100644 index 49b9e62..0000000 --- a/static/narrative.org +++ /dev/null @@ -1,375 +0,0 @@ -#+TITLE: Struggle to graduate without nonfree software -#+LANG: en -#+AUTHOR: Wojciech Kosior -#+LICENSE: CC0 - -Due to pandemic many people experienced deaths of their relatives, others became -jobless. Those are some severe losses, many of which couldn't be prevented. -At the same time we also witnessed an embrace of proprietary videoconferencing -platforms, that brought a huge loss of freedom. Most ppl would disagree over -how severe this loss is, but one is certain - it *could* be prevented. - -As a university student, I struggled to avoid losing freedom and pass my courses -without surrendering to the imposed not-free-as-in-freedom services, -often by proposing free/libre solutions instead. I didn't expect to win this -fight - but now I think it may happen. I describe my fight below so as to -build up and inspire others. - -* Studies -For over 3 years I've been studying informatics at the AGH University of Science -and Technology in Kraków, Poland. Over that time I was becoming more and more -determined to avoid nonfree software. That, among others, meant getting -a librebooted ThinkPad and switching to GNU/Linux distros that only include -libre packages. - -"What about studies?" - one could ask - "Weren't You required to use Windows? - Or MS Office? Or some other proprietary tools?" - -Actually, a great majority of the jobs could be completed with (or even -required) free software. In present times there we have the luxury -of having excellent libre operating systems and libre tools for most tasks, -including free software implementations of most popular programming languages. -On those few occasions some nonfree tool was required, I was either able -to convince given professor to let me do a replacement homework (e.g. doing the -same exercises under Postgres database instead of Oracle's) or do it at the -university during other groups' classes. I admit running nonfree software -on someone else's computer doesn't fully solve the problem of nonfreeness -and is not something to be proud of. Nevertheless, it just seemed fair. - -I was also gradually taking the issue of in-browser javascript -more seriously. Web pages' js runs in an isolated sandbox, which makes many -ppl believe it's OK even when it's nonfree. Sandbox might indeed solve -security issues, but the true problem with proprietary programs lies elsewhere, -in taking away of user control. Currently, maintaining one's software freedom -in the field of web browsing is not easy. Numerous sites break with js disabled. -On many occasions I had to ask colleagues to put me into a Google sheet -for something studies-related, because I couldn't do that without js -(also, proprietary js is not the only issue with Google services). -I only dared to ask them for that, because I knew they were already accessing -Google sheets. - -* Start of the pandemic -Without bigger problems I completed the 5th semester of my studies. At the -beginning of 6th - the pandemic began. Universities closed, most students -traveled home and professors started organizing remote -lectures and classes. You guessed it - they all chose proprietary platforms. -The ones used were Cisco Webex, MS Teams, ClickMeeting and, duh, Skype. -Each of those either doesn't have a free software client or I couldn't find one. -Of course, the professors expected everyone to be able to easily connect using -web interface. They didn't realize the problem of nonfree js. - -Lectures didn't pose a real problem, since they're not obligatory at the AGH. -As to lab classes, their form varied from professor to professor. Some only -described what they want us to do for homework. Then we had to just upload the -completed homework to UPEL (AGH's modified version of Moodle). Some organized -non-obligatory consultancies. Many didn't care about actual presence on classes -and only wanted student to appear at specified time to interactively -hand homework in. Finally, one expected us all to attend the meetings at lab -class hours and was very angry about me having issues with it. - -What were my actions in those circumstances? I would *very* politely email every -single professor who announced something would be done via one of the -problematic platforms. In my mails I usually linked the Costumed Heroes video -and some free videoconferencing tools (Jami, Jitsi Meet). I often remarked, that -the service used by them has no free software client available. Centralized -nature of those services and surveillance being possibly conducted through them -are also severe issues, but to me - software freedom was the decisive factor. - -I'm under impression, that few professors didn't understand the issue or only -understood it partially. Hence, replies like "the solution would be to run -the program in a virtual machine" or "You don't need the source code to use the -service". Fortunately, even though many professors were irritated by my emails, -most of them eventually agreed to for example use another tool (Jami/Jitsi Meet) -to receive my homework. I think what helped me a bit is the fact, that they are -all teaching some field of computer science. Otherwise, the fraction of those -who don't understand the problem would be way higher. That's why I think it -could be more difficult on other faculties or in case of lower-level education -(e.g. schools). - -* 6th semester -As the universities were closing, I was in the middle of doing some kind of -group homework for machine learning course. It was quite natural, that -I asked one person doing that homework with me to forward -what the professor said during Skype sessions. She later continued to do -me this favor and everything else could be done in free software. - -The first real problem was with the artificial intelligence methods course (I shall later -just call it AI). It was rotational and we managed to have one lab class on-site before -the pandemic. The homework for this class was to be done in proprietary Framsticks -application. When emailed, the professor allowed me to do some neural networks -exercise instead. But I did have double stress, because I then had to ask him to -provide me with the required materials using some method other than Google Drive -(which I would be able to download from, but only if someone gave me a link to -a single file and not to a folder). - -Later in march we learned another professor teaching AI wanted us to -complete an online NVIDIA course and send him a certificate. This was supposed -to serve as a replacement for a single lab class. The course, -obviously, required nonfree js. I wrote an email to that professor, -but did not receive any response. - -Also in the early part of the semester, I was supposed to hand in distributed -systems homework via Webex. When I emailed the professor, he agreed to use Jami -for that. That was a little victory, but classes of this course were also -rotational - I knew I would have to ask 3 more professors with subsequent -homework. The grading system was such, that if one refused, -I would fail the entire course. - -Near the end of March, system programming (i.e. meddling with guts of Linux) -classes started. Those were obligatory and during Webex meetings students would -present their homework. The professor didn't want to lose time connecting to other -services than Webex. At that point, his response didn't give any hope. Especially -that I knew him from earlier semester and he didn't seem very kind. -I kept uploading homework exercises to UPEL but I was to live in uncertainty -through the Easter and long after it. - -At some point I emailed two professors about the use of nonfree platforms -for lectures. One didn't respond at all and the other replied rudely -and seemed not to understand the issue. That's how I stopped caring about -lectures. - -It was April. I presented second distributed systems homework. But even in cases -proprietary videoconferencing platforms were not needed, -there were other difficulties. For example, some lab classes assumed using -Java packages from Maven repository. Even though I knew given library is -free software, I would always attempt to avoid using a language-specific -package manager for it. That's because repositories used by tools like Pip (for Python) -and Gradle (for Java) allow some sorts nonfree packages and also lack good -security verification. This deserves its own essay. Eventually, I would -install libre libraries from there, but only if they were not packaged for my distro -and there were too many dependencies to install them manually. You can imagine, -that this costed some time and on my faculty - time is precious. - -Also in April, the lazy "do an NVIDIA course" professor sent us a list of -students who did not send a certificate. Surprisingly, my name was not on the list. -Instead, I was rated 100% for this exercise. I concluded, that he just wrote down -surnames of all students who sent him emails with certificates and also mistakenly -included my surname from my mail... I did not want to be a cheater, so I later -emailed him about his mistake, but he didn't respond anyway. - -More problems with AI were to come. Another professor wanted us to do homework -in proprietary Choreographe simulator. After learning about the nonfreeness issue, -he proposed that I use Webots instead and I agreed. - -Around that time I was to realize, that the most unkind professor of that semester -wold the one giving software engineering course. The course had the form of a group -project, but we were still expected to appear on meetings every week. -The professor first didn't answer my emails and eventually wrote a long reply -in which he threatened, that if I miss one more meeting, I'm going to fail the -course. He wrote why he thinks I'm obliged to connect to ClickMeeting and the -way he wrote that showed great annoyance or even anger. He did, however, write, -that he doesn't care whether I connect directly or my voice reaches him through -colleague's computer. And that's what we did. Me and 1 buddy from my project -group were connected through Mumble and he was also connected to the meeting -(as he would anyway). He moved his microphone close to the speaker so that -I could hear the others and vice-versa. That was so provisional I am very -surprised it worked! - -May. Distributed systems homework presented to 3 professors and 1 left to -convince. Another AI homework was also supposed to be handed in interactively, -but the professor first agreed to use Jami and later decided, that he's already -seen so much AIML stuff, that he doesn't even need my commentary. - -End of May was when the situation seemed to be the most overwhelming. -There was yet no course I knew for sure I would pass, there were still many -emails to be written and I was already having delays with some homework -due to lack of time. - -In June the semester was theoretically ending, but in practice grades could -be given until the middle of September. Everyone, who hoped they would be able -to conduct some classes at the university, now knew it wouldn't be possible. -One of those ppl was the last professor I had to hand in distributed systems -homework to. Although he was not eager to use another platform, he agreed -for Jitsi Meet, which doesn't require installation. - -Professor giving network security course also put up with the impossibility -to organize stationary finals, as he used to. He instead gave us some -exercise to complete and upload. Unfortunately, we were supposed to use -Cisco Packet Tracer to simulate networks. The professor was unkind at some -point earlier, so I was not sure if he would allow me to do some replacement -task. But he did. The new exercise involved Mininet and nDPI library. - -The last AI homework could only be fully done using Jupyter Notebook on Google -servers. I did what I could on a local Jupyter Notebook instance. I did not -need to have this 100% completed in order to pass the course. - -System programming classes were also finishing in June. -I wrote another email to the professor. I was afraid he would just say I failed, -but no. He said he would look at my solutions and decide and *maybe* -it would be possible to meet at the university in September. -Hence, I had some hope, but no guarantee. - -Now, another, bigger problem - the compilers course included an exam, that was -supposed to be done through MS Teams. I wrote to the professor preparing it. -Even though he always seemed to like me, he did not (could not?) give me -an option to write the exam some other way. I though I would fail then, but -funnily - Teams failed to handle the load of over 100 students connecting and -the exam was instead conducted via email (sending photos of solutions). - -In that semester we already had seminar classes. The professor wanted -students to present their prototypes on some meeting, but I didn't have -mine ready yet, so he allowed me to finish it during summer holidays and -eventually I avoided the meeting. I also had little contact with my -thesis supervisor. We were to talk in July and that was the first time -free software videoconferencing failed me by refusing to work properly -(there were some issues earlier, but not so severe). -At least it didn't happen during handing in of some homework... - -In summer I also had to do an internship. I first backed out of a well-paid -(as for internship) offer after learning, that there is no way to -negotiate a contract, that would allow my code to be released -as free software. I eventually did another, unpaid internship, -which had the benefit, that I was able to spend some of its time working -on my thesis. - -In September I finally met with the professor and presented my system -programming homework. He turned out not to be as unkind as -he seemed before. - -So after all the struggle I finally passed the summer semester and even had -decent grades. What at some point seemed almost impossible, was now a reality. - -* 7th semester -The winter semester was the last semester of the first-cycle -studies, so it was shorter - all classes had to finish by the middle of -December or earlier. Before the semester started in October, university had -specified some formal rules as to what platforms and tools can be used -to conduct classes and exams. This was mostly to comply with GDPR. -Allowed videoconferencing solutions lecturers and teachers can -officially use were MS Teams, Cisco Webex, ClickMeeting and Google Meet, -although didn't see anyone use the last one. - -This time most professors required presence on meetings. -The only exception was introduction to security engineering where -the professor announced there would only be consultancies and uploading -homework on time equals presence on lab classes. - -There was a cryptography course. The professor did not agree to use -Jitsi Meet citing too big amount of work to bother using another -platform. Even though he suggested that I write to university -authorities, I didn't do that, for reasons not related to the topic. -I just kept writing tests (those were conducted through UPEL, so it -was not a problem for me) and uploading Jupyter notebooks with completed -exercises. This course didn't involve anything like interactive handing -of homework, so the only problem were my "absences". - -Situation with computational geometry course was very silimar, with -the exception, that all homework was to be presented through MS Teams. - -Another course I chose was optimization of code for different architectures. -I knew the professor teaching this. During fortran course on one of the -earlier semesters he required us to use proprietary ifort compiler. -On the other hand, he was one of the professors showing appreciation -for stuff I do well. When I emailed him, he was kind, although -afraid of using any other platform that those allowed. He suggested -me to contact student council of our faculty to suggest Jitsi Meet to -dean and eventually get it hosted by university itself. The professor -even said, that he would then happily use it for all his classes. -Unfortunately, student council never responded to my emails. -I was allowed to gain presence by writing reports instead of -participating in the meetings. This took more of precious time, -but I was glad anyway. - -For second and final part of the seminar course the professor -made obligatory consultancies. He initially wanted to stick to allowed -platforms and even pointed out, that Jitsi Meet also runs on someone -else's server and hence - is not safer. I then responded with my -counterpoints and once again asked politely that we use Jitsi Meet. -I made it clear, that I'd rather fail, than use any proprietary platform -and he finally agreed. - -For optimization of code we were also supposed to be presenting our -homework interactively, 2 times during the semester. The first time was -at the beginning of November and the professor wrote, that he agrees -to use platform not from the official list. He just noted, that he -doesn't take responsibility for security of any data exchanged -through it. - -Then I had an argument with my supervisor, who got annoyed with -me (although there were probably other factors, too) and gave an -ultimatum that I use MS Teams. I didn't agree and my -supervisor was supposed to inform dean about resignation from -supervising. Perhaps the dean didn't read the email? -I'm just guessing. Anyway, I wrote again a few weeks later -and even borrowed some electronics from my supervisor - almost -as if the argument never happened. - -Around that time someone told on the professors giving security course -and they started organizing classes via MS Teams, but they still didn't -require students to do anything during those classes and they allowed -me to just send them emails at the right time and they marked me present -based on that. There were also difficulties with Windows VM being required -for some exploit exercise - but I eventually also avoided Windows, even -though it required some additional work. - -At the beginning of December it was clear, the only problems -were cryptography and geometry. I wrote another email asking for -a way to pass the first one. The professor told me to implement some hashing -algorithm in Jupyter. I suspect he might have needed that as a teaching -resource. I chose BLAKE2b, implemented it, sent it to him and this way -passed the course and even got the highest grade for it, despite my -mistakes in tests. That was surprisingly easy. - -I also wrote to the professor giving geometry course. At first, she -didn't respond. The semester was supposed to end on 15 December -(although only some of the professors gave final grades that early). -Before that I wrote another email and I eventually received a determined -response, that I am being failed for absences. She did not mention -some of my homework being uploaded late, but I guess that's good for me. - -At that point I was going to stop arguing. My supervisor in an email -got back to the topic of meeting on MS Teams and I responded, that -I'm not going to pass this semester and thanked for cooperation. - -Then, someone convinced me not to hesitate to argue more or seek help -from university authorities. Or rather, I still didn't want to do the -second thing, because I already declared to the professor, that I won't. -But I did write subsequent emails. She agreed for an online meeting -on 8 January... but on MS Teams only. And I refused again and yet -again wrote why it is wrong to fail me like that. -She was not responding to all of my emails and I ended up spending -a lot of time waiting for replies. She eventually told me again -to contact the authorities for a permission to use another platform -and CC'd associate dean in that email. Given that, I no longer felt obligated -not to inform him about the issue. - -As he's always busy, quite a few reminder emails were needed. In the -meantime, the deadline to upload thesis passed. Actually, that was -the deadline for those, who wanted to defend in January. Defense -in March was still possible, it would just be too late to apply -for second-cycle studies - something I wouldn't be interested in, -given all the difficulties I faced so far. - -The dean eventually responded, but he didn't read into the right email -in the thread, so another set of reminders was needed. On 13 January -he finally wrote, that he talked to the professor and she would -allow me to correct the reports she considered bad. -No mention of videoconferencing services. Was there another misunderstanding? - -The email i received from the professor explained the situation to me. -The dean pleaded for her to allow me to pass without interactive -presentation of my homework. So she would then give me a positive -grade and I would pass the semester, right? In theory only. - -She then wrote about how bad my homework is. I never claimed it -to be perfect, because it was all done in a hurry and I even couldn't fix -some problems I knew about. But I don't think it was bad either, especially -considering the mere amount of it. -She eventually wanted me to correct 2 exercises. So I did. -I finally uploaded those on 15 January. I had to actually wait 4 more days for -the grade, but I got it. I finally passed my 7th semester. - -Now, there are still some possible pitfalls, e.g. getting statement from my -supervisor. But after a month of stagnation the case seems to be finally -heading into the right direction. - -When I look behind, I'm actually glad I acted -how I acted. Perhaps I won't be able to please those who want to see -me graduate. But I don't think graduating by surrendering to -nonfree platforms would bring any long-term benefits. Only more compromises. -Come back in some time to see how this compromise-less effort ends. -This article will be updated :) - -* Notes -- I called all university teachers professors, although only the Framsticks -and seminar ones have that title. diff --git a/static/old-favicon.ico b/static/old-favicon.ico deleted file mode 100644 index 1cf1659..0000000 Binary files a/static/old-favicon.ico and /dev/null differ diff --git a/static/signify.pub b/static/signify.pub deleted file mode 100644 index 31cec86..0000000 --- a/static/signify.pub +++ /dev/null @@ -1,2 +0,0 @@ -untrusted comment: signify public key -RWTJ8JZMFWhB2Ya9GyXbmOQKSxd/x57IV/oNo6/nl344CR1aqf/OgPXf diff --git a/static/static/climate-change-marketing-transcript.txt b/static/static/climate-change-marketing-transcript.txt new file mode 100644 index 0000000..7417d3b --- /dev/null +++ b/static/static/climate-change-marketing-transcript.txt @@ -0,0 +1,22 @@ +7/18/2023 5:37:02 p.m. IC: Welcome to [REDACTED]! +5:37:02 p.m. IC: Interaction transferred to Member Contact Center - Chat. +5:37:02 p.m. IC: All agents are busy assisting other customers. +5:37:02 p.m. IC: Your position in queue is 1. +5:37:04 p.m. IC: Your estimated wait time is approximately one minute. +5:37:04 p.m. IC: Your position in queue and estimated wait time will be updated in approximately three minutes. +5:37:04 p.m. IC: To leave a message, type YES and click the send button now. Otherwise, please continue to hold and the next available agent will assist you as soon as possible. +5:40:03 p.m. IC: All agents are busy assisting other customers. +5:40:03 p.m. IC: Your position in queue is 1. +5:40:03 p.m. IC: Your estimated wait time is approximately one minute. +5:40:03 p.m. IC: Your position in queue and estimated wait time will be updated in approximately three minutes. +5:40:03 p.m. IC: To leave a message, type YES and click the send button now. Otherwise, please continue to hold and the next available agent will assist you as soon as possible. +5:41:29 p.m. IC: Interaction alerting [REDACTED]. +5:41:31 p.m. IC: [REDACTED] has joined the conversation. +5:41:45 p.m. [REDACTED]: Good Afternoon, Thank you for contacting [REDACTED]. This is [REDACTED]. How may I assist you? +5:43:03 p.m. Nicholas Johnson: Yes. I recently noticed [REDACTED]'s marketing of the "summer heat wave special". +5:43:41 p.m. Nicholas Johnson: I think this marketing is tone deaf and should be changed, especially since 2023 is on track to be the hottest year ever recorded. Maybe something like "summer special" would be better, but not mentioning the heat wave. +5:44:43 p.m. [REDACTED]: We do appreciate your feedback Nicholas. I will be sure to pass the suggestion on to our marketing department. +5:44:51 p.m. [REDACTED]: Is there anything else I can assist you with today? +5:45:39 p.m. Nicholas Johnson: Thank you. Please do pass this on. That is all I need for today. +5:45:56 p.m. [REDACTED]: No problem at all. Thank you for contacting [REDACTED]. Have a wonderful day! +5:46:01 p.m. IC: Agent has left the conversation diff --git a/static/static/decision-tree.jpg b/static/static/decision-tree.jpg new file mode 100644 index 0000000..af78b8d Binary files /dev/null and b/static/static/decision-tree.jpg differ diff --git a/static/static/feed-icon-28x28.png b/static/static/feed-icon-28x28.png new file mode 100644 index 0000000..26d64ab Binary files /dev/null and b/static/static/feed-icon-28x28.png differ diff --git a/static/static/gpg-signify-transition-statement.txt.asc b/static/static/gpg-signify-transition-statement.txt.asc new file mode 100644 index 0000000..7f55660 --- /dev/null +++ b/static/static/gpg-signify-transition-statement.txt.asc @@ -0,0 +1,35 @@ +-----BEGIN PGP SIGNED MESSAGE----- +Hash: SHA512 + +Date: 2021-12-30 + +Statement of GPG Key Transition + +To replace my GnuPG key, I have set up a new Signify key, and will be transitioning away from my GnuPG key. + +The GnuPG key will continue to be valid until 2022-02-01 for the purpose of verifying this transition statement. Please do not use it send me encrypted emails anymore. + +This message is signed by both keys to certify the transition. + +The old GnuPG key's primary key fingerprint was: +BF49E81C1D888979B6506B225B4FE8CA89C066C0 + +The new Signify key is: +RWTJ8JZMFWhB2Ya9GyXbmOQKSxd/x57IV/oNo6/nl344CR1aqf/OgPXf + +If you have my old GnuPG key, you can verify this transition statement with: +gpg2 --verify gpg-signify-transition-statement.txt.asc + +You can verify the new Signify key with: +signify -V -e -p key.pub -m gpg-signify-transition-statement.txt + +Thank you, and sorry for the inconvenience. + +Nick +-----BEGIN PGP SIGNATURE----- + +iHUEARYKAB0WIQS/SegcHYiJebZQayJbT+jKicBmwAUCX+0UgAAKCRBbT+jKicBm +wOjOAQC6NKik3E4ooWBFEXm+0jNoENASyVFRRGNZ1qnaazPZUwEAvD88rtV75Z+9 +NX1JG1iGPgTcfKO1I+m4PblgxXCsbQ8= +=novT +-----END PGP SIGNATURE----- diff --git a/static/static/gpg-signify-transition-statement.txt.sig b/static/static/gpg-signify-transition-statement.txt.sig new file mode 100644 index 0000000..19a074f --- /dev/null +++ b/static/static/gpg-signify-transition-statement.txt.sig @@ -0,0 +1,27 @@ +untrusted comment: verify with key.pub +RWTJ8JZMFWhB2eYyA14Q6xQJS/Ak0RrXKrvixXFQujsOcIwD/plAkeOhd6QxO8sQxsiwiG5Zvo6JIi7IQycjB3ycCrs/Yp0lZQQ= +Date: 2021-12-30 + +Statement of GPG Key Transition + +To replace my GnuPG key, I have set up a new Signify key, and will be transitioning away from my GnuPG key. + +The GnuPG key will continue to be valid until 2022-02-01 for the purpose of verifying this transition statement. Please do not use it send me encrypted emails anymore. + +This message is signed by both keys to certify the transition. + +The old GnuPG key's primary key fingerprint was: +BF49E81C1D888979B6506B225B4FE8CA89C066C0 + +The new Signify key is: +RWTJ8JZMFWhB2Ya9GyXbmOQKSxd/x57IV/oNo6/nl344CR1aqf/OgPXf + +If you have my old GnuPG key, you can verify this transition statement with: +gpg2 --verify gpg-signify-transition-statement.txt.asc + +You can verify the new Signify key with: +signify -V -e -p key.pub -m gpg-signify-transition-statement.txt + +Thank you, and sorry for the inconvenience. + +Nick diff --git a/static/static/narrative.org b/static/static/narrative.org new file mode 100644 index 0000000..49b9e62 --- /dev/null +++ b/static/static/narrative.org @@ -0,0 +1,375 @@ +#+TITLE: Struggle to graduate without nonfree software +#+LANG: en +#+AUTHOR: Wojciech Kosior +#+LICENSE: CC0 + +Due to pandemic many people experienced deaths of their relatives, others became +jobless. Those are some severe losses, many of which couldn't be prevented. +At the same time we also witnessed an embrace of proprietary videoconferencing +platforms, that brought a huge loss of freedom. Most ppl would disagree over +how severe this loss is, but one is certain - it *could* be prevented. + +As a university student, I struggled to avoid losing freedom and pass my courses +without surrendering to the imposed not-free-as-in-freedom services, +often by proposing free/libre solutions instead. I didn't expect to win this +fight - but now I think it may happen. I describe my fight below so as to +build up and inspire others. + +* Studies +For over 3 years I've been studying informatics at the AGH University of Science +and Technology in Kraków, Poland. Over that time I was becoming more and more +determined to avoid nonfree software. That, among others, meant getting +a librebooted ThinkPad and switching to GNU/Linux distros that only include +libre packages. + +"What about studies?" - one could ask - "Weren't You required to use Windows? + Or MS Office? Or some other proprietary tools?" + +Actually, a great majority of the jobs could be completed with (or even +required) free software. In present times there we have the luxury +of having excellent libre operating systems and libre tools for most tasks, +including free software implementations of most popular programming languages. +On those few occasions some nonfree tool was required, I was either able +to convince given professor to let me do a replacement homework (e.g. doing the +same exercises under Postgres database instead of Oracle's) or do it at the +university during other groups' classes. I admit running nonfree software +on someone else's computer doesn't fully solve the problem of nonfreeness +and is not something to be proud of. Nevertheless, it just seemed fair. + +I was also gradually taking the issue of in-browser javascript +more seriously. Web pages' js runs in an isolated sandbox, which makes many +ppl believe it's OK even when it's nonfree. Sandbox might indeed solve +security issues, but the true problem with proprietary programs lies elsewhere, +in taking away of user control. Currently, maintaining one's software freedom +in the field of web browsing is not easy. Numerous sites break with js disabled. +On many occasions I had to ask colleagues to put me into a Google sheet +for something studies-related, because I couldn't do that without js +(also, proprietary js is not the only issue with Google services). +I only dared to ask them for that, because I knew they were already accessing +Google sheets. + +* Start of the pandemic +Without bigger problems I completed the 5th semester of my studies. At the +beginning of 6th - the pandemic began. Universities closed, most students +traveled home and professors started organizing remote +lectures and classes. You guessed it - they all chose proprietary platforms. +The ones used were Cisco Webex, MS Teams, ClickMeeting and, duh, Skype. +Each of those either doesn't have a free software client or I couldn't find one. +Of course, the professors expected everyone to be able to easily connect using +web interface. They didn't realize the problem of nonfree js. + +Lectures didn't pose a real problem, since they're not obligatory at the AGH. +As to lab classes, their form varied from professor to professor. Some only +described what they want us to do for homework. Then we had to just upload the +completed homework to UPEL (AGH's modified version of Moodle). Some organized +non-obligatory consultancies. Many didn't care about actual presence on classes +and only wanted student to appear at specified time to interactively +hand homework in. Finally, one expected us all to attend the meetings at lab +class hours and was very angry about me having issues with it. + +What were my actions in those circumstances? I would *very* politely email every +single professor who announced something would be done via one of the +problematic platforms. In my mails I usually linked the Costumed Heroes video +and some free videoconferencing tools (Jami, Jitsi Meet). I often remarked, that +the service used by them has no free software client available. Centralized +nature of those services and surveillance being possibly conducted through them +are also severe issues, but to me - software freedom was the decisive factor. + +I'm under impression, that few professors didn't understand the issue or only +understood it partially. Hence, replies like "the solution would be to run +the program in a virtual machine" or "You don't need the source code to use the +service". Fortunately, even though many professors were irritated by my emails, +most of them eventually agreed to for example use another tool (Jami/Jitsi Meet) +to receive my homework. I think what helped me a bit is the fact, that they are +all teaching some field of computer science. Otherwise, the fraction of those +who don't understand the problem would be way higher. That's why I think it +could be more difficult on other faculties or in case of lower-level education +(e.g. schools). + +* 6th semester +As the universities were closing, I was in the middle of doing some kind of +group homework for machine learning course. It was quite natural, that +I asked one person doing that homework with me to forward +what the professor said during Skype sessions. She later continued to do +me this favor and everything else could be done in free software. + +The first real problem was with the artificial intelligence methods course (I shall later +just call it AI). It was rotational and we managed to have one lab class on-site before +the pandemic. The homework for this class was to be done in proprietary Framsticks +application. When emailed, the professor allowed me to do some neural networks +exercise instead. But I did have double stress, because I then had to ask him to +provide me with the required materials using some method other than Google Drive +(which I would be able to download from, but only if someone gave me a link to +a single file and not to a folder). + +Later in march we learned another professor teaching AI wanted us to +complete an online NVIDIA course and send him a certificate. This was supposed +to serve as a replacement for a single lab class. The course, +obviously, required nonfree js. I wrote an email to that professor, +but did not receive any response. + +Also in the early part of the semester, I was supposed to hand in distributed +systems homework via Webex. When I emailed the professor, he agreed to use Jami +for that. That was a little victory, but classes of this course were also +rotational - I knew I would have to ask 3 more professors with subsequent +homework. The grading system was such, that if one refused, +I would fail the entire course. + +Near the end of March, system programming (i.e. meddling with guts of Linux) +classes started. Those were obligatory and during Webex meetings students would +present their homework. The professor didn't want to lose time connecting to other +services than Webex. At that point, his response didn't give any hope. Especially +that I knew him from earlier semester and he didn't seem very kind. +I kept uploading homework exercises to UPEL but I was to live in uncertainty +through the Easter and long after it. + +At some point I emailed two professors about the use of nonfree platforms +for lectures. One didn't respond at all and the other replied rudely +and seemed not to understand the issue. That's how I stopped caring about +lectures. + +It was April. I presented second distributed systems homework. But even in cases +proprietary videoconferencing platforms were not needed, +there were other difficulties. For example, some lab classes assumed using +Java packages from Maven repository. Even though I knew given library is +free software, I would always attempt to avoid using a language-specific +package manager for it. That's because repositories used by tools like Pip (for Python) +and Gradle (for Java) allow some sorts nonfree packages and also lack good +security verification. This deserves its own essay. Eventually, I would +install libre libraries from there, but only if they were not packaged for my distro +and there were too many dependencies to install them manually. You can imagine, +that this costed some time and on my faculty - time is precious. + +Also in April, the lazy "do an NVIDIA course" professor sent us a list of +students who did not send a certificate. Surprisingly, my name was not on the list. +Instead, I was rated 100% for this exercise. I concluded, that he just wrote down +surnames of all students who sent him emails with certificates and also mistakenly +included my surname from my mail... I did not want to be a cheater, so I later +emailed him about his mistake, but he didn't respond anyway. + +More problems with AI were to come. Another professor wanted us to do homework +in proprietary Choreographe simulator. After learning about the nonfreeness issue, +he proposed that I use Webots instead and I agreed. + +Around that time I was to realize, that the most unkind professor of that semester +wold the one giving software engineering course. The course had the form of a group +project, but we were still expected to appear on meetings every week. +The professor first didn't answer my emails and eventually wrote a long reply +in which he threatened, that if I miss one more meeting, I'm going to fail the +course. He wrote why he thinks I'm obliged to connect to ClickMeeting and the +way he wrote that showed great annoyance or even anger. He did, however, write, +that he doesn't care whether I connect directly or my voice reaches him through +colleague's computer. And that's what we did. Me and 1 buddy from my project +group were connected through Mumble and he was also connected to the meeting +(as he would anyway). He moved his microphone close to the speaker so that +I could hear the others and vice-versa. That was so provisional I am very +surprised it worked! + +May. Distributed systems homework presented to 3 professors and 1 left to +convince. Another AI homework was also supposed to be handed in interactively, +but the professor first agreed to use Jami and later decided, that he's already +seen so much AIML stuff, that he doesn't even need my commentary. + +End of May was when the situation seemed to be the most overwhelming. +There was yet no course I knew for sure I would pass, there were still many +emails to be written and I was already having delays with some homework +due to lack of time. + +In June the semester was theoretically ending, but in practice grades could +be given until the middle of September. Everyone, who hoped they would be able +to conduct some classes at the university, now knew it wouldn't be possible. +One of those ppl was the last professor I had to hand in distributed systems +homework to. Although he was not eager to use another platform, he agreed +for Jitsi Meet, which doesn't require installation. + +Professor giving network security course also put up with the impossibility +to organize stationary finals, as he used to. He instead gave us some +exercise to complete and upload. Unfortunately, we were supposed to use +Cisco Packet Tracer to simulate networks. The professor was unkind at some +point earlier, so I was not sure if he would allow me to do some replacement +task. But he did. The new exercise involved Mininet and nDPI library. + +The last AI homework could only be fully done using Jupyter Notebook on Google +servers. I did what I could on a local Jupyter Notebook instance. I did not +need to have this 100% completed in order to pass the course. + +System programming classes were also finishing in June. +I wrote another email to the professor. I was afraid he would just say I failed, +but no. He said he would look at my solutions and decide and *maybe* +it would be possible to meet at the university in September. +Hence, I had some hope, but no guarantee. + +Now, another, bigger problem - the compilers course included an exam, that was +supposed to be done through MS Teams. I wrote to the professor preparing it. +Even though he always seemed to like me, he did not (could not?) give me +an option to write the exam some other way. I though I would fail then, but +funnily - Teams failed to handle the load of over 100 students connecting and +the exam was instead conducted via email (sending photos of solutions). + +In that semester we already had seminar classes. The professor wanted +students to present their prototypes on some meeting, but I didn't have +mine ready yet, so he allowed me to finish it during summer holidays and +eventually I avoided the meeting. I also had little contact with my +thesis supervisor. We were to talk in July and that was the first time +free software videoconferencing failed me by refusing to work properly +(there were some issues earlier, but not so severe). +At least it didn't happen during handing in of some homework... + +In summer I also had to do an internship. I first backed out of a well-paid +(as for internship) offer after learning, that there is no way to +negotiate a contract, that would allow my code to be released +as free software. I eventually did another, unpaid internship, +which had the benefit, that I was able to spend some of its time working +on my thesis. + +In September I finally met with the professor and presented my system +programming homework. He turned out not to be as unkind as +he seemed before. + +So after all the struggle I finally passed the summer semester and even had +decent grades. What at some point seemed almost impossible, was now a reality. + +* 7th semester +The winter semester was the last semester of the first-cycle +studies, so it was shorter - all classes had to finish by the middle of +December or earlier. Before the semester started in October, university had +specified some formal rules as to what platforms and tools can be used +to conduct classes and exams. This was mostly to comply with GDPR. +Allowed videoconferencing solutions lecturers and teachers can +officially use were MS Teams, Cisco Webex, ClickMeeting and Google Meet, +although didn't see anyone use the last one. + +This time most professors required presence on meetings. +The only exception was introduction to security engineering where +the professor announced there would only be consultancies and uploading +homework on time equals presence on lab classes. + +There was a cryptography course. The professor did not agree to use +Jitsi Meet citing too big amount of work to bother using another +platform. Even though he suggested that I write to university +authorities, I didn't do that, for reasons not related to the topic. +I just kept writing tests (those were conducted through UPEL, so it +was not a problem for me) and uploading Jupyter notebooks with completed +exercises. This course didn't involve anything like interactive handing +of homework, so the only problem were my "absences". + +Situation with computational geometry course was very silimar, with +the exception, that all homework was to be presented through MS Teams. + +Another course I chose was optimization of code for different architectures. +I knew the professor teaching this. During fortran course on one of the +earlier semesters he required us to use proprietary ifort compiler. +On the other hand, he was one of the professors showing appreciation +for stuff I do well. When I emailed him, he was kind, although +afraid of using any other platform that those allowed. He suggested +me to contact student council of our faculty to suggest Jitsi Meet to +dean and eventually get it hosted by university itself. The professor +even said, that he would then happily use it for all his classes. +Unfortunately, student council never responded to my emails. +I was allowed to gain presence by writing reports instead of +participating in the meetings. This took more of precious time, +but I was glad anyway. + +For second and final part of the seminar course the professor +made obligatory consultancies. He initially wanted to stick to allowed +platforms and even pointed out, that Jitsi Meet also runs on someone +else's server and hence - is not safer. I then responded with my +counterpoints and once again asked politely that we use Jitsi Meet. +I made it clear, that I'd rather fail, than use any proprietary platform +and he finally agreed. + +For optimization of code we were also supposed to be presenting our +homework interactively, 2 times during the semester. The first time was +at the beginning of November and the professor wrote, that he agrees +to use platform not from the official list. He just noted, that he +doesn't take responsibility for security of any data exchanged +through it. + +Then I had an argument with my supervisor, who got annoyed with +me (although there were probably other factors, too) and gave an +ultimatum that I use MS Teams. I didn't agree and my +supervisor was supposed to inform dean about resignation from +supervising. Perhaps the dean didn't read the email? +I'm just guessing. Anyway, I wrote again a few weeks later +and even borrowed some electronics from my supervisor - almost +as if the argument never happened. + +Around that time someone told on the professors giving security course +and they started organizing classes via MS Teams, but they still didn't +require students to do anything during those classes and they allowed +me to just send them emails at the right time and they marked me present +based on that. There were also difficulties with Windows VM being required +for some exploit exercise - but I eventually also avoided Windows, even +though it required some additional work. + +At the beginning of December it was clear, the only problems +were cryptography and geometry. I wrote another email asking for +a way to pass the first one. The professor told me to implement some hashing +algorithm in Jupyter. I suspect he might have needed that as a teaching +resource. I chose BLAKE2b, implemented it, sent it to him and this way +passed the course and even got the highest grade for it, despite my +mistakes in tests. That was surprisingly easy. + +I also wrote to the professor giving geometry course. At first, she +didn't respond. The semester was supposed to end on 15 December +(although only some of the professors gave final grades that early). +Before that I wrote another email and I eventually received a determined +response, that I am being failed for absences. She did not mention +some of my homework being uploaded late, but I guess that's good for me. + +At that point I was going to stop arguing. My supervisor in an email +got back to the topic of meeting on MS Teams and I responded, that +I'm not going to pass this semester and thanked for cooperation. + +Then, someone convinced me not to hesitate to argue more or seek help +from university authorities. Or rather, I still didn't want to do the +second thing, because I already declared to the professor, that I won't. +But I did write subsequent emails. She agreed for an online meeting +on 8 January... but on MS Teams only. And I refused again and yet +again wrote why it is wrong to fail me like that. +She was not responding to all of my emails and I ended up spending +a lot of time waiting for replies. She eventually told me again +to contact the authorities for a permission to use another platform +and CC'd associate dean in that email. Given that, I no longer felt obligated +not to inform him about the issue. + +As he's always busy, quite a few reminder emails were needed. In the +meantime, the deadline to upload thesis passed. Actually, that was +the deadline for those, who wanted to defend in January. Defense +in March was still possible, it would just be too late to apply +for second-cycle studies - something I wouldn't be interested in, +given all the difficulties I faced so far. + +The dean eventually responded, but he didn't read into the right email +in the thread, so another set of reminders was needed. On 13 January +he finally wrote, that he talked to the professor and she would +allow me to correct the reports she considered bad. +No mention of videoconferencing services. Was there another misunderstanding? + +The email i received from the professor explained the situation to me. +The dean pleaded for her to allow me to pass without interactive +presentation of my homework. So she would then give me a positive +grade and I would pass the semester, right? In theory only. + +She then wrote about how bad my homework is. I never claimed it +to be perfect, because it was all done in a hurry and I even couldn't fix +some problems I knew about. But I don't think it was bad either, especially +considering the mere amount of it. +She eventually wanted me to correct 2 exercises. So I did. +I finally uploaded those on 15 January. I had to actually wait 4 more days for +the grade, but I got it. I finally passed my 7th semester. + +Now, there are still some possible pitfalls, e.g. getting statement from my +supervisor. But after a month of stagnation the case seems to be finally +heading into the right direction. + +When I look behind, I'm actually glad I acted +how I acted. Perhaps I won't be able to please those who want to see +me graduate. But I don't think graduating by surrendering to +nonfree platforms would bring any long-term benefits. Only more compromises. +Come back in some time to see how this compromise-less effort ends. +This article will be updated :) + +* Notes +- I called all university teachers professors, although only the Framsticks +and seminar ones have that title. diff --git a/static/static/old-favicon.ico b/static/static/old-favicon.ico new file mode 100644 index 0000000..1cf1659 Binary files /dev/null and b/static/static/old-favicon.ico differ diff --git a/static/static/signify.pub b/static/static/signify.pub new file mode 100644 index 0000000..31cec86 --- /dev/null +++ b/static/static/signify.pub @@ -0,0 +1,2 @@ +untrusted comment: signify public key +RWTJ8JZMFWhB2Ya9GyXbmOQKSxd/x57IV/oNo6/nl344CR1aqf/OgPXf diff --git a/static/static/timestamp-1.txt b/static/static/timestamp-1.txt new file mode 100644 index 0000000..4f48250 --- /dev/null +++ b/static/static/timestamp-1.txt @@ -0,0 +1,45 @@ +tree 1c3569eccb0109da67d15f58d1a74d2c38dd3b3f +parent 04c9625977a7ad28a0bd4150a198121d8d143cc6 +author Nicholas Johnson 1636502400 +0000 +committer Nicholas Johnson 1636502400 +0000 +gpgsig -----BEGIN PGP SIGNATURE----- + + iHUEABYKAB0WIQTA24M2cjnhOx8C5Q/rFUe/DFrSVAUCX8Q2AAAKCRDrFUe/DFrS + VKYwAP4pkzBCpyWmXNLeL4CBDimQa6Lq4dzLlhakDkiZatJCcgD/Tr7jNbbv+PeV + xizfe0wunT8RTvVpLtS4Hx2sGiCyEgA= + =Zx9G + -----END PGP SIGNATURE----- + -----BEGIN OPENTIMESTAMPS GIT TIMESTAMP----- + + AQHwIKZ0M3RaIiJQ9rQazVBQhSNbxuQ5VSddbNSOGPsbudsdCP/wEANiYun41xWt + 2Jsg27FKDR8I8QRhi+XD8AgWRdJJvBcJUv8Ag9/jDS75DI4jImh0dHBzOi8vYnRj + LmNhbGVuZGFyLmNhdGFsbGF4eS5jb20I8CCF1SLU5/dyPCa3YcO0vgrmXt5rAUu6 + M1jREKXwqqcxDwjxIEswtUlnUdjL0oJRaHJbq2iu7ZDy0VvArmcNUqVAK8GRCPEg + CWu8w6I9r2rAWgRmHpqIvsyIJv6M9zeZvJFi6L85zRoI8CDzpbaG0nHjf+NQgVGY + 2JMe+r0KbO7Flh5QSjkl7lHW3wjwIOYPKdtm5P6LioriewhZtRrRA2WM5SmQV1YZ + 7FY7DVeqCPEgrXnl5Y03zTEL7PjKlTR0aMDvDK+hXUEplWta/T+/LFAI8SAmOtbn + SLD6Yta/vYbsOpyQTLD/kpq9QWlCcY4df1j+igjxILxbJ04OT68piwAw3stqdykY + 71fZmyOibMOJ7BACTQQCCPAgj75wv/R5qQb9HR7+P1rBjAuOO3+GGi2iEr0MrVzp + GosI8SB66x5B3F44JmPVPq+I1re2r1mx2STk6oWTTsHT5IfOwQjxWQEAAAABT6Qi + UX1oF9NejbGEgegj+JM2S2BRy66eI9pt9HQNSI0AAAAAAP3///8CQUE8AAAAAAAW + ABSZOR1FaAmMnptJFyY5RisS+dgriQAAAAAAAAAAImog8ATe0QoACAjxIA5pCUrE + 4aLY3sIP/8EXiEs3gS0Xx/yUQDrF6AbO2a1wCAjwINJ9k2c9JPooOuz7O7Gen4ao + VCCljy/J81M/bxsPocyYCAjxIPhNhFpWvANWebQMmLgzevdvr4TcF4ftsuK/O6Mt + zmHUCAjxIKnvmVOPk4QNWAgN5KM1VgvSxTV8a+U80DKMaZxuhSJ5CAjwILsDNhTx + 3IVSKHcxgd+ilZ8rMFPYF67MCIhkQokdgok7CAjwIDwakjR7y1N8lYCuaUHx5m5g + zxtsNSH8lW/3tisU2aVeCAjwIIuvD6K6/Bh0zL07RAj6oJyx6q6dLl/Se7aNu7nV + QiTcCAjxIMInKQEad7ilxhq+HyXNIBUg/kA4pLn/CSsTxdmNi77UCAjwIG8OsFhx + 5Xfj6XjxNEle2n4ODQiEGyhNV5t72rhcggCcCAjwIAWHPs5vGbXGq+S6PSRKnJtS + ltq5eBuq0bxrMNldAyitCAjwIJuOqlfMi+/VES3i9EKauEJ5p3TVG1pTDbVdbf88 + B8b8CAjxIHWzxfzIjOHWEvIgki7SChNKXQRX1Rn/P1ECeOCXS+/qCAgABYiWDXPX + GQED36Mr//AQEha5S4UztINmFaswTVRI6AjxBGGL5cPwCBbwxjPwZjVsAIPf4w0u + +QyOLCtodHRwczovL2JvYi5idGMuY2FsZW5kYXIub3BlbnRpbWVzdGFtcHMub3Jn + //AQi6M/mGb5529M71c04F8hcAjwIHTSXoHjHsWGuRbaRsu3QLNdk6QQY7R8WzWU + mOc7+4wxCPAg01jytwMO7K6GA80LZ3mbxI2G51iqk2JQmcJ6L4I9cZII8QRhi+XD + 8Ai2QIimGJFT8gCD3+MNLvkMjikoaHR0cHM6Ly9maW5uZXkuY2FsZW5kYXIuZXRl + cm5pdHl3YWxsLmNvbfAQkir30fYfxn06h4vQ74OFMAjxIBwV2Gi/pTIhwfaUbdyj + IoXfJIFms/F0nKBP6GVz3xl4CPEEYYvlw/AIqlQ3ujOnrdIAg9/jDS75DI4uLWh0 + dHBzOi8vYWxpY2UuYnRjLmNhbGVuZGFyLm9wZW50aW1lc3RhbXBzLm9yZw== + -----END OPENTIMESTAMPS GIT TIMESTAMP----- + +Timestamp \ No newline at end of file diff --git a/static/static/timestamp-2.ots b/static/static/timestamp-2.ots new file mode 100644 index 0000000..fb0e4a0 Binary files /dev/null and b/static/static/timestamp-2.ots differ diff --git a/static/timestamp-1.txt b/static/timestamp-1.txt deleted file mode 100644 index 4f48250..0000000 --- a/static/timestamp-1.txt +++ /dev/null @@ -1,45 +0,0 @@ -tree 1c3569eccb0109da67d15f58d1a74d2c38dd3b3f -parent 04c9625977a7ad28a0bd4150a198121d8d143cc6 -author Nicholas Johnson 1636502400 +0000 -committer Nicholas Johnson 1636502400 +0000 -gpgsig -----BEGIN PGP SIGNATURE----- - - iHUEABYKAB0WIQTA24M2cjnhOx8C5Q/rFUe/DFrSVAUCX8Q2AAAKCRDrFUe/DFrS - VKYwAP4pkzBCpyWmXNLeL4CBDimQa6Lq4dzLlhakDkiZatJCcgD/Tr7jNbbv+PeV - xizfe0wunT8RTvVpLtS4Hx2sGiCyEgA= - =Zx9G - -----END PGP SIGNATURE----- - -----BEGIN OPENTIMESTAMPS GIT TIMESTAMP----- - - AQHwIKZ0M3RaIiJQ9rQazVBQhSNbxuQ5VSddbNSOGPsbudsdCP/wEANiYun41xWt - 2Jsg27FKDR8I8QRhi+XD8AgWRdJJvBcJUv8Ag9/jDS75DI4jImh0dHBzOi8vYnRj - LmNhbGVuZGFyLmNhdGFsbGF4eS5jb20I8CCF1SLU5/dyPCa3YcO0vgrmXt5rAUu6 - M1jREKXwqqcxDwjxIEswtUlnUdjL0oJRaHJbq2iu7ZDy0VvArmcNUqVAK8GRCPEg - CWu8w6I9r2rAWgRmHpqIvsyIJv6M9zeZvJFi6L85zRoI8CDzpbaG0nHjf+NQgVGY - 2JMe+r0KbO7Flh5QSjkl7lHW3wjwIOYPKdtm5P6LioriewhZtRrRA2WM5SmQV1YZ - 7FY7DVeqCPEgrXnl5Y03zTEL7PjKlTR0aMDvDK+hXUEplWta/T+/LFAI8SAmOtbn - SLD6Yta/vYbsOpyQTLD/kpq9QWlCcY4df1j+igjxILxbJ04OT68piwAw3stqdykY - 71fZmyOibMOJ7BACTQQCCPAgj75wv/R5qQb9HR7+P1rBjAuOO3+GGi2iEr0MrVzp - GosI8SB66x5B3F44JmPVPq+I1re2r1mx2STk6oWTTsHT5IfOwQjxWQEAAAABT6Qi - UX1oF9NejbGEgegj+JM2S2BRy66eI9pt9HQNSI0AAAAAAP3///8CQUE8AAAAAAAW - ABSZOR1FaAmMnptJFyY5RisS+dgriQAAAAAAAAAAImog8ATe0QoACAjxIA5pCUrE - 4aLY3sIP/8EXiEs3gS0Xx/yUQDrF6AbO2a1wCAjwINJ9k2c9JPooOuz7O7Gen4ao - VCCljy/J81M/bxsPocyYCAjxIPhNhFpWvANWebQMmLgzevdvr4TcF4ftsuK/O6Mt - zmHUCAjxIKnvmVOPk4QNWAgN5KM1VgvSxTV8a+U80DKMaZxuhSJ5CAjwILsDNhTx - 3IVSKHcxgd+ilZ8rMFPYF67MCIhkQokdgok7CAjwIDwakjR7y1N8lYCuaUHx5m5g - zxtsNSH8lW/3tisU2aVeCAjwIIuvD6K6/Bh0zL07RAj6oJyx6q6dLl/Se7aNu7nV - QiTcCAjxIMInKQEad7ilxhq+HyXNIBUg/kA4pLn/CSsTxdmNi77UCAjwIG8OsFhx - 5Xfj6XjxNEle2n4ODQiEGyhNV5t72rhcggCcCAjwIAWHPs5vGbXGq+S6PSRKnJtS - ltq5eBuq0bxrMNldAyitCAjwIJuOqlfMi+/VES3i9EKauEJ5p3TVG1pTDbVdbf88 - B8b8CAjxIHWzxfzIjOHWEvIgki7SChNKXQRX1Rn/P1ECeOCXS+/qCAgABYiWDXPX - GQED36Mr//AQEha5S4UztINmFaswTVRI6AjxBGGL5cPwCBbwxjPwZjVsAIPf4w0u - +QyOLCtodHRwczovL2JvYi5idGMuY2FsZW5kYXIub3BlbnRpbWVzdGFtcHMub3Jn - //AQi6M/mGb5529M71c04F8hcAjwIHTSXoHjHsWGuRbaRsu3QLNdk6QQY7R8WzWU - mOc7+4wxCPAg01jytwMO7K6GA80LZ3mbxI2G51iqk2JQmcJ6L4I9cZII8QRhi+XD - 8Ai2QIimGJFT8gCD3+MNLvkMjikoaHR0cHM6Ly9maW5uZXkuY2FsZW5kYXIuZXRl - cm5pdHl3YWxsLmNvbfAQkir30fYfxn06h4vQ74OFMAjxIBwV2Gi/pTIhwfaUbdyj - IoXfJIFms/F0nKBP6GVz3xl4CPEEYYvlw/AIqlQ3ujOnrdIAg9/jDS75DI4uLWh0 - dHBzOi8vYWxpY2UuYnRjLmNhbGVuZGFyLm9wZW50aW1lc3RhbXBzLm9yZw== - -----END OPENTIMESTAMPS GIT TIMESTAMP----- - -Timestamp \ No newline at end of file diff --git a/static/timestamp-2.ots b/static/timestamp-2.ots deleted file mode 100644 index fb0e4a0..0000000 Binary files a/static/timestamp-2.ots and /dev/null differ -- cgit v1.2.3