diff options
| author | Hannah Isopod <me@bathynomus.xyz> | 2025-06-11 03:25:00 -0600 |
|---|---|---|
| committer | Hannah Isopod <me@bathynomus.xyz> | 2025-06-11 03:25:00 -0600 |
| commit | b3bb0b898d3178963fefb9c0b16a00a76cf2a034 (patch) | |
| tree | eec6da7a21790183b15f31283fe3b8bcaabfaa4d | |
| parent | 5023bdef46281034c0476bc4201342a0a4cc2ae7 (diff) | |
total guestbook overhaul + new blog post + etc
- Added /about/pronouns/ in leiu of something like
a pronouns.cc profile
- New blog post about my new and improved AI
opinions
- Moved Stop Using Chromium to an actual blog post
page
- Blog posts now have previous and next buttons
- New /blog/ background
- Moved status.cafe widget from /blog/ to landing
page
- Total overhaul of guestbook:
- Merged guestbook and blog comment section code
- Beefed up bot protection
- Added a word filter
- Added a property to entries to facilitate
holding comments for review and approving or
denying them manually (The interface for this
is somewhere else)
- IP address from which a post originates is now
tracked in order to IP ban malicious actors
- Various new buttons
- Updated /greenhouse/
- The site is now a member of the No AI Webring
- a couple minor CSS fixes
40 files changed, 631 insertions, 551 deletions
@@ -1,4 +1,5 @@ pronouns.txt blog/posts/invaluable_contributions Parsedown.php -/stuff/fonts/*
\ No newline at end of file +/stuff/fonts/* +guestbook/bannedwords.json diff --git a/about/index.php b/about/index.php index 652ddc9..6abad48 100644 --- a/about/index.php +++ b/about/index.php @@ -28,7 +28,7 @@ </tr> <tr> <td>Pronouns</td> - <td><?php echo file_get_contents($_SERVER['DOCUMENT_ROOT'] . '/pronouns.txt'); ?></td> + <td><?php echo file_get_contents($_SERVER['DOCUMENT_ROOT'] . '/pronouns.txt'); ?> >> <a href="pronouns">more info</a></td> </tr> <tr> <td>Preoccupations</td> @@ -50,6 +50,14 @@ <td>Signal</td> </tr> <tr> + <td>ask</td> + <td>Discord</td> + </tr> + <tr> + <td>ask</td> + <td>Steam</td> + </tr> + <tr> <td>bathynomus#5230</td> <td>Revolt</td> </tr> diff --git a/about/pronouns/bad.svg b/about/pronouns/bad.svg new file mode 100644 index 0000000..069da16 --- /dev/null +++ b/about/pronouns/bad.svg @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="size-6">
+ <path stroke-linecap="round" stroke-linejoin="round" d="M7.498 15.25H4.372c-1.026 0-1.945-.694-2.054-1.715a12.137 12.137 0 0 1-.068-1.285c0-2.848.992-5.464 2.649-7.521C5.287 4.247 5.886 4 6.504 4h4.016a4.5 4.5 0 0 1 1.423.23l3.114 1.04a4.5 4.5 0 0 0 1.423.23h1.294M7.498 15.25c.618 0 .991.724.725 1.282A7.471 7.471 0 0 0 7.5 19.75 2.25 2.25 0 0 0 9.75 22a.75.75 0 0 0 .75-.75v-.633c0-.573.11-1.14.322-1.672.304-.76.93-1.33 1.653-1.715a9.04 9.04 0 0 0 2.86-2.4c.498-.634 1.226-1.08 2.032-1.08h.384m-10.253 1.5H9.7m8.075-9.75c.01.05.027.1.05.148.593 1.2.925 2.55.925 3.977 0 1.487-.36 2.89-.999 4.125m.023-8.25c-.076-.365.183-.75.575-.75h.908c.889 0 1.713.518 1.972 1.368.339 1.11.521 2.287.521 3.507 0 1.553-.295 3.036-.831 4.398-.306.774-1.086 1.227-1.918 1.227h-1.053c-.472 0-.745-.556-.5-.96a8.95 8.95 0 0 0 .303-.54" />
+</svg>
diff --git a/about/pronouns/bg.jpg b/about/pronouns/bg.jpg Binary files differnew file mode 100644 index 0000000..2cc9218 --- /dev/null +++ b/about/pronouns/bg.jpg diff --git a/about/pronouns/friend.svg b/about/pronouns/friend.svg new file mode 100644 index 0000000..ad67d3c --- /dev/null +++ b/about/pronouns/friend.svg @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="size-6">
+ <path stroke-linecap="round" stroke-linejoin="round" d="M17.982 18.725A7.488 7.488 0 0 0 12 15.75a7.488 7.488 0 0 0-5.982 2.975m11.963 0a9 9 0 1 0-11.963 0m11.963 0A8.966 8.966 0 0 1 12 21a8.966 8.966 0 0 1-5.982-2.275M15 9.75a3 3 0 1 1-6 0 3 3 0 0 1 6 0Z" />
+</svg>
+
diff --git a/about/pronouns/good.svg b/about/pronouns/good.svg new file mode 100644 index 0000000..a2d6d96 --- /dev/null +++ b/about/pronouns/good.svg @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="size-6">
+ <path stroke-linecap="round" stroke-linejoin="round" d="M6.633 10.25c.806 0 1.533-.446 2.031-1.08a9.041 9.041 0 0 1 2.861-2.4c.723-.384 1.35-.956 1.653-1.715a4.498 4.498 0 0 0 .322-1.672V2.75a.75.75 0 0 1 .75-.75 2.25 2.25 0 0 1 2.25 2.25c0 1.152-.26 2.243-.723 3.218-.266.558.107 1.282.725 1.282m0 0h3.126c1.026 0 1.945.694 2.054 1.715.045.422.068.85.068 1.285a11.95 11.95 0 0 1-2.649 7.521c-.388.482-.987.729-1.605.729H13.48c-.483 0-.964-.078-1.423-.23l-3.114-1.04a4.501 4.501 0 0 0-1.423-.23H5.904m10.598-9.75H14.25M5.904 18.5c.083.205.173.405.27.602.197.4-.078.898-.523.898h-.908c-.889 0-1.713-.518-1.972-1.368a12 12 0 0 1-.521-3.507c0-1.553.295-3.036.831-4.398C3.387 9.953 4.167 9.5 5 9.5h1.053c.472 0 .745.556.5.96a8.958 8.958 0 0 0-1.302 4.665c0 1.194.232 2.333.654 3.375Z" />
+</svg>
diff --git a/about/pronouns/index.php b/about/pronouns/index.php new file mode 100644 index 0000000..015609c --- /dev/null +++ b/about/pronouns/index.php @@ -0,0 +1,46 @@ +<!DOCTYPE html> +<html lang="en"> + <head> + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width, initial-scale=1"> + <title>Pronounce</title> + <link href="/style.css" rel="stylesheet" type="text/css" media="all"> + <?php include($_SERVER['DOCUMENT_ROOT'] . '/seasonal.php'); ?> + <style> + .entry-container { + display: flex; + flex-wrap: wrap; + justify-content: center; + align-items: center; + gap: var(--stdpadding); + } + .labeled-entry { + display: flex; + align-items: center; + gap: calc(var(--stdpadding) / 2); + } + .labeled-entry img { + height: 2em; + filter: invert(); + } + </style> + </head> + <body> + <?php include($_SERVER['DOCUMENT_ROOT'] . '/nav.php'); bg(false, -30, "Of course you have this") ?> + <h1>pronouns & shit</h1> + <h2 id="caption">extended director's cut special edition</h2> + <p>I briefly had a page on <a href="https://pronouns.cc">pronouns.cc</a> once but hell if I'm gonna use it when I have my own website</p> + <div class="entry-container"> + <span class="labeled-entry"><img src="good.svg" alt="Good"> Preferred</span> + <span class="labeled-entry"><img src="friend.svg" alt="Friends only"> Friends only</span> + <span class="labeled-entry"><img src="bad.svg" alt="Bad"> Don't</span> + </div> + <h2>Pronouns</h2> + <div class="entry-container"> + <span class="labeled-entry"><img src="good.svg" alt="Good"> she/her</span> + <span class="labeled-entry"><img src="good.svg" alt="Good"> it/its</span> + <span class="labeled-entry"><img src="friend.svg" alt="Friends only"> they/them</span> + <span class="labeled-entry"><img src="bad.svg" alt="Bad"> he/him</span> + </div> + </body> +</html> diff --git a/blog/bg.jpg b/blog/bg.jpg Binary files differindex a27cf66..36c9c72 100644 --- a/blog/bg.jpg +++ b/blog/bg.jpg diff --git a/blog/bg.jxl b/blog/bg.jxl Binary files differindex a56559f..7889748 100644 --- a/blog/bg.jxl +++ b/blog/bg.jxl diff --git a/blog/blog.atom b/blog/blog.atom index a6cc5b8..7951ab6 100644 --- a/blog/blog.atom +++ b/blog/blog.atom @@ -3,7 +3,7 @@ <title>isopod.cool blog</title> <id>https://isopod.cool/blog/</id> <link rel="alternate" href="https://isopod.cool/blog/"></link> - <updated>2025-05-12T00:00:00+00:00</updated> + <updated>2025-06-11T00:00:00+00:00</updated> <author> <name>Hannah Isopod</name> <uri>https://isopod.cool/</uri> @@ -23,6 +23,17 @@ <category term="php"/> </entry--> <entry> + <title>Revisiting "AI"</title> + <id>ai2</id> + <link rel="alternate" href="https://isopod.cool/blog/posts/ai2/" type="html" title="Revisiting AI"></link> + <published>2025-06-11T00:00:00+00:00</published> + <updated>2025-06-11T00:00:00+00:00</updated> + <summary>I'm still not very fond of the subject of the current tech hype cycle, but my thoughts on the matter have developed some nuance since I last posted about it.</summary> + <category term="ai"/> + <category term="chatgpt"/> + <category term="capitalism"/> + </entry> + <entry> <title>Fighting LLM Scrapers With Nepenthes And Fail2Ban</title> <id>grow_spikes</id> <link rel="alternate" href="https://isopod.cool/blog/posts/grow_spikes/" type="html" title="Fighting LLM Scrapers With Nepenthes And Fail2Ban"></link> @@ -180,7 +191,7 @@ <entry> <title>Stop Using Chromium</title> <id>stop_using_chromium</id> - <link rel="alternate" href="https://chrome.bathynomus.xyz/" type="html" title="Stop Using Chromium"></link> + <link rel="alternate" href="https://isopod.cool/blog/posts/stop_using_chromium/" type="html" title="Stop Using Chromium"></link> <published>2023-08-16T00:00:00+00:00</published> <updated>2023-08-16T00:00:00+00:00</updated> <summary>An article about why you should quit using Chromium-based browsers, published as a standalone website for the purpose of automatically redirecting Chromium users to it.</summary> diff --git a/blog/comment/feed.php b/blog/comment/feed.php deleted file mode 100644 index 889514f..0000000 --- a/blog/comment/feed.php +++ /dev/null @@ -1,29 +0,0 @@ -<?php -include("../../Parsedown.php"); -$Parsedown = new Parsedown(); -$Parsedown->setSafeMode(true); - -header('Content-Type: text/xml'); - -echo '<rss version="2.0"><channel>'; -echo '<title>isopod.cool blog comments</title>'; -echo '<description>Every comment posted on my blog in chronological order.</description>'; -echo '<language>en-us</language>'; -echo '<link>https://isopod.cool/blog/comment/</link>'; -echo '<generator>My crappy PHP code</generator>'; - -$postlist = json_decode(file_get_contents("posts.json")); -$totaloutput = ""; -foreach($postlist as $post) { - $output = ""; - $date = date("D, d M Y H:m:s", $post->date) . " GMT"; - $name = $post->name; - $message = $Parsedown->text(html_entity_decode($post->message)); - $entry = $post->entry; - - $output = $output."Comment from ".$name." on ".$entry.":<br><br>".$message."<br><br>"; - $totaloutput = "<item><title>Comment on " . $entry . " from " . $name . "</title><link>https://isopod.cool/blog/posts/" . $entry . "/</link><pubDate>" . $date . "</pubDate><description>".htmlentities($output)."</description><guid isPermaLink='false'>" . $entry . $post->date . $name . "</guid></item>".$totaloutput; -} - -echo $totaloutput; -echo "</channel></rss>";
\ No newline at end of file diff --git a/blog/comment/index.php b/blog/comment/index.php deleted file mode 100644 index 2d5f6a6..0000000 --- a/blog/comment/index.php +++ /dev/null @@ -1,40 +0,0 @@ -<!DOCTYPE html> -<html lang="en"> - <head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>blog comments</title> - <link href="/style.css" rel="stylesheet" type="text/css" media="all"> - <link href="comments.css" rel="stylesheet" type="text/css" media="all"> - <style> - - </style> - <?php include($_SERVER['DOCUMENT_ROOT'] . '/seasonal.php'); ?> - </head> - <body> - <?php include($_SERVER['DOCUMENT_ROOT'] . '/nav.php'); ?> - <h1>blog</h1> - <h2 id="caption">every comment</h2> - <nav> - <a href="feed.php">RSS</a> - </nav> - <?php - include("../../Parsedown.php"); - $Parsedown = new Parsedown(); - $Parsedown->setSafeMode(true); - - $totaloutput = ""; - $postlist = json_decode(file_get_contents("posts.json")); - foreach($postlist as $post) { - $output = ""; - $date = date("Y-m-d h:iA", $post->date); - $name = $post->name; - $message = $Parsedown->text(html_entity_decode($post->message)); - $entry = $post->entry; - - $output = $output."<hr><article><table><tr><td style='text-align: left;'>".$name." <i>on</i> <a href='/blog/posts/".$entry."/'>".$entry."</a></td><td style='text-align: right;'>".$date."</td></tr><tr><td colspan='2'>".$message."</td></tr></table></article>"; - $totaloutput = $output.$totaloutput; - } - echo $totaloutput; ?> - </body> -</html> diff --git a/blog/comment/submit.php b/blog/comment/submit.php deleted file mode 100644 index 26e5647..0000000 --- a/blog/comment/submit.php +++ /dev/null @@ -1,81 +0,0 @@ -<?php - if ($_SERVER["REQUEST_METHOD"] == "POST") { - - $returnLocation = $_POST["entry"]; - $returnCode = "success"; - if($_POST["botcheck"] != "isopod") { - $returnCode = "botcheckfailed"; - } else if(!$_POST["name"]) { - $returnCode = "noname"; - } else if(!$_POST["message"]) { - $returnCode = "nomessage"; - } else { - - date_default_timezone_set("America/Edmonton"); - $currentPost = array( - "date" => time(), - "name" => htmlentities($_POST["name"]), - "message" => htmlentities($_POST["message"]), - "entry" => $_POST["entry"] - ); - - $filename = "posts.json"; - - $handle = @fopen($filename, 'r+'); - - // create the file if needed - if ($handle === null) - { - $handle = fopen($filename, 'w+'); - } - - if ($handle) - { - // seek to the end - fseek($handle, 0, SEEK_END); - - // are we at the end of is the file empty - if (ftell($handle) > 0) - { - // move back a byte - fseek($handle, -2, SEEK_END); - - // add the trailing comma - fwrite($handle, ",\n", 2); - - // add the new json string - fwrite($handle, json_encode($currentPost) . "]\n"); - } - else - { - // write the first event inside an array - fwrite($handle, json_encode(array($currentPost))); - } - - // close the handle on the file - fclose($handle); - } - } - } - header("Location: ../posts/$returnLocation/?return=$returnCode"); -?> -<!DOCTYPE html> -<html lang="en"> - <head> - <meta charset="utf-8"> - <title>Guestbook</title> - <link href="../style.css" rel="stylesheet" type="text/css" media="all"> - <style type="text/css"> - body { - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - } - </style> - <?php include($_SERVER['DOCUMENT_ROOT'] . '/seasonal.php'); ?> - </head> - <body> - <p>Your post has been submitted! It's weird that you're seeing this page though. Maybe your browser can't process location headers? At any rate, click <?php echo "<a href='./?return=$returnCode'>here</a>"; ?> to get where you're supposed to be right now.</p> - </body> -</html>
\ No newline at end of file diff --git a/blog/index.php b/blog/index.php index 2433e97..1fbe75a 100644 --- a/blog/index.php +++ b/blog/index.php @@ -91,28 +91,6 @@ error_reporting(E_ALL); ?> </nav> <?php - $username = "niceopod"; // Your username here! - $ch = curl_init("https://status.cafe/users/$username/status.json"); - - curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); - curl_setopt($ch, CURLOPT_HEADER, 0); - - $str = curl_exec($ch); - if(curl_error($ch)) { - //echo curl_error($ch); - $str = ""; - } - curl_close($ch); - $status_data = json_decode($str, true); - $status_content = $status_data["content"]; - $face = $status_data["face"]; - $timeago = $status_data["timeAgo"]; - if(strlen($status_content) < 1) { - $status_content = "Something's gone wrong server side..."; - } - echo "<div id='statuscafe'><div id='statuscafe-username'><a href='https://status.cafe/users/$username' target='_blank'>status</a> $face $timeago</div><div id='statuscafe-content'>$status_content</div></div>"; - ?> - <?php $stag = $_GET["tag"]; $nostag = empty($stag); if(!$nostag) { @@ -156,9 +134,6 @@ error_reporting(E_ALL); } echo "</ul>"; ?> - <div class="buttons" style="margin-bottom: 1rem;"> - <a href="https://status.cafe/"><img src="media/banner-statuscafe.png" alt="Status Cafe"></a> - </div> </body> </html> diff --git a/blog/posts/ai2/index.md b/blog/posts/ai2/index.md new file mode 100644 index 0000000..37d7d0f --- /dev/null +++ b/blog/posts/ai2/index.md @@ -0,0 +1,100 @@ +It's no secret that I'm generally not very fond of the Silicon Valley tech hype cycle we currently find ourselves in — in fact I've [posted](/blog/posts/ai_art/) about my feelings on "AI" technology before, and I think that post still mostly holds up, but having had circa 15 months since to ruminate about it and watch this shitshow pan out, my opinions on the matter have gotten substantially more nuanced, and I'd like to formally express them, ideally in a more level-headed way than my first go, so here's that. + +## The still-bad + +The primary product being inescapably pushed on us, generative AI (oft shortened to GenAI, and henceforth referred to here as genai<sup id="n1r"><a href="#n1">1</a></sup>), remains pretty self-evidently worthless, surprising nobody less than me. + +For one, the output quality of LLM chatbots and such things in particular [doesn't seem](https://garymarcus.substack.com/p/chatgpt-blows-mapmaking-101) [to have](https://arxiv.org/pdf/2502.15840) [meaninfully changed](https://www.reddit.com/r/ExperiencedDevs/comments/1krttqo/my_new_hobby_watching_ai_slowly_drive_microsoft/)[.](https://calcgpt.io/) In fact, in some cases it's [gotten worse](https://www.pcgamer.com/software/ai/chatgpts-hallucination-problem-is-getting-worse-according-to-openais-own-tests-and-nobody-understands-why/). Really, I don't see how it could ever improve — these are *language models*, after all, statistical models of human speech that "AI" vendors are trying desperately to coax into being effective proxies for actual thought. It was clear then and it's even clearer now that that's never going to work, and it would honestly be kind of sad if it wasn't so infuriating watching these giant companies still burning billions of dollars to inflict<sup id="n2r"><a href="#n2">2</a></sup> this shit on everyone in the hopes that it will. + +<figure class="quote"> + <blockquote> + LLMs aren't intelligence they're just Markov bots that take requests + </blockquote> + <figcaption> + — <a href="https://isopod.zone/notes/9p7fa2ulne194ndl">me</a> + </figcaption> +</figure> + +### Ethics? What? I think we fired those guys + +Ethical problems also continue to abound. I'm not personally aware that [labeling practices](https://www.theguardian.com/technology/article/2024/jul/06/mercy-anita-african-workers-ai-artificial-intelligence-exploitation-feeding-machine) have gotten any better, and on top of that, poorly written, badly behaved scrapers run by popular genai vendors are now [effectively](https://www.gamedeveloper.com/business/-this-was-essentially-a-two-week-long-ddos-attack-game-ui-database-slowdown-caused-by-openai-scraping) [DDOSing](https://techcrunch.com/2025/01/10/how-openais-bot-crushed-this-seven-person-companys-web-site-like-a-ddos-attack/) [random websites](https://social.kernel.org/notice/AqJkUigsjad3gQc664) in their attempts to suck down as much data as possible for training. Many website admins, especially those running git forges, which are targeted by coding assistants like GitHub Copilot, have had to resort to countermeasures like [Anubis](https://anubis.techaro.lol/) to protect their sites from this behaviour. I've had a run-in with this activity personally, when a big spender on Alibaba Cloud slammed my [Nepenthes](https://zadzmo.org/code/nepenthes/) instance so hard I had to [set up a custom Fail2ban jail](/blog/posts/grow_spikes/) that blocked over 300 IPs inside a day just to make its statistics endpoints reachable again. + +Furthermore, the environmental impact of this technology [remains really bad](https://www.technologyreview.com/2025/05/20/1116327/ai-energy-usage-climate-footprint-big-tech/). Electricity use alone has gotten so bad that, for example, Microsoft has had to [spin a decommissioned nuclear power plant back up](https://www.npr.org/2024/09/20/nx-s1-5120581/three-mile-island-nuclear-power-plant-microsoft-ai) to run their datacentres. Although, some amount of proliferation and normalization of nuclear energy would be a nice little upside to this whole debacle. + +## The actually good + +The class of algorithm that "AI" as a marketing term refers to, that is to say, machine learning and neural networks, actually has some compelling use cases that we've seen crystallize over the past couple years, and I think they merit mention here. + +For one, machine learning-based upscaling in videogames (for example, Nvidia's DLSS, AMD's FSR, and Intel's XeSS) seems like a pretty uncomplicatedly good thing. It's stupid as hell that it's necessary, but from what I can tell this tech kind of just makes games run better with no significant downsides outside of maybe some minor visual artifacting, so I see no issue here. + +Genai is also kind of just the best way to make good-sounding text-to-speech and accurate speech-to-text, and it's legitimately exciting for accessibility that we've reached a point where these things can be run fully locally and offline on your device. This could be huge for things like screen readers and [auto-generated captions](https://www.pcmag.com/news/vlc-media-player-to-use-ai-to-generate-subtitles-for-videos). From what I've seen, this is the primary benefit to the incessant push for integrated "NPUs" in every new CPU. + +Of course, tech like this isn't the *point* of the hype cycle. Nvidia didn't become the first trillion dollar company by inventing a niche technology to make new GeForce video cards perform better in demanding games, and Microsoft isn't desperate to make "AI PCs" a thing because of the potential for better screen readers. The "AI" hype cycle is about genai supposedly having the potential to revolutionize *everything*. In five more years. And please don't ask how. + +## The it's-complicated + +LLMs are, by nature, endless fountains of grammatically-fluent drivel utterly devoid of real meaning. This makes it anywhere from unsettling to infuritating to see them used in contexts such as education, journalism, or software development<sup id="n3r"><a href="#n3">3</a></sup>, but it makes them uniquely suited to two use cases: spam, and the sort of high-verbosity, low-meaning communication that's expected of you in a professional setting — in other words, the LLM has democratized the least valuable forms of written communication in existence. + +Naturally the addition of more spam to the world is never a good thing, but I can't honestly begrudge anyone using an LLM to expand a sticky note's worth of information into an appropriately vacuous cover letter or work email or whatever. I might just be autistic, but I frankly believe that this kind of writing deserves to be delegated to the verbose bullshit machine if it doesn't come naturally to you, especially if employers are going to, well, employ these tools themselves to field your job application. Of course, a just world would provide no incentive to create either of these types of writing anyway. + +To be honest, I also struggle to find it in myself to blame students of the public school system who are using genai to cheat on essays. I could fill a full A4 sheet of paper, maybe two, in <span style="font-size: 12pt; font-family: Calibri, sans-serif;">single-spaced 12-point Calibri</span> with a rant about this, but suffice it to say that this isn't a new problem — the American style of public education has always prioritized number go up with genuine learning as a fortunate side effect, and it's not the kids' fault there's every incentive to game that system to make a fundamentally broken and hostile environment more bearable<sup id="n4r"><a href="#n4">4</a></sup>. + +This is a pattern I've noticed with a lot of the more infamous uses of genai products: As much as this new, horrible technology is creating new, horrible problems, it's getting just as much bad press for giving new form to existing ones: High school students were already cheating on their essays, the internet was already flooded with useless spam crowding out valuable information, and media companies of all stripes were always eager for new ways to throw their employees under the bus to reduce costs at the expense of quality. + +Even if completely ridding the world of genai technology was possible at this point, it wouldn't be the solution to these sorts of problems. The solution is to destroy the incentive structures that motivate this behaviour in the first place — create a school system where students don't feel the need to cheat on schoolwork, remove the profit incentive to generate spam and replace human workers with cheap, unreliable machines, etc. In other words, the real problem is capitalism. + +### The AI art thing + +Then there's the issue of "AI art". I stand by the it's-not-art-on-a-technicality argument I made before — I still don't think typing a prompt into Stable Diffusion and then taking the output and pretending you "made" something constitutes any kind of real artistic contribution, and frankly the only worthwhile artistic statements I've seen made using these tools have been statements *about* genai. I also tend to find the aesthetics of the output of genai thoroughly repulsive in general. The silver lining here is that blatant use of genai to make, say, game assets or promotional art is usually a pretty damn good indicator that whatever the slop is being poured on was never worth your time to begin with. + +That said, I'm unsure at this point how to feel about the whole "art theft" business. I don't begrudge artists using tools like [Glaze](https://glaze.cs.uchicago.edu/) to try to prevent genai models from using their art or replicating their styles without permission — I certainly wouldn't be thrilled if someone did that with my work — but also, like, I'm generally very anti-copyright, and I struggle to come up with an internally consistent ethical framework that excludes genai from that sentiment. Certainly tightening copyright law to restrict what genai vendors who already violate it can do is a bad idea. This is one dilemma that I'll admit I don't have a good answer for. + +Let's get one thing straight, however: If you use genai to generate memes or, like, bespoke profile pictures or whatever, I think you are a coward and a fool who will not survive the winter. + +<figure class="quote"> + <blockquote> + mass art theft and environmental destruction are one thing but i draw the line at using ai image generators to trick me into thinking the world contains slightly more whimsy than it actually does + </blockquote> + <figcaption> + — <a href="https://isopod.zone/notes/a00ro9k8hv">me</a> + </figcaption> +</figure> + +## They did a conclusion on this one + +Here's hoping this one comes off as less of an unhinged rant than the last time I posted about this. This is by no means a complete compendium of every thought I've had about genai, but it is everything I think I have something substantial to say about. For example, the whole concept of deepfakes is pretty horrifying, but I don't have anything to add to that conversation beyond gesturing vaguely at it and going like "wow, that's pretty fucked up, huh?". + +It's clear at this point that genai is here to stay in at least *some* capacity, but I'd be shocked if the push for unsolicited LLM chatbots and image generators in everything was able to sustain itself for much longer. I personally can't wait for a year or two from now when someone finds yet another novel way to make their Nvidia GPU draw 500 watts for hours on end and it gets marketed as Quantum Computing™ or some shit. + +--- + +## Further reading + +Linked above: + +- [My previous writing on this topic](/blog/posts/ai_art/) +- [ChatGPU Blows Mapmaking 101](https://garymarcus.substack.com/p/chatgpt-blows-mapmaking-101) +- [Vending-Bench: A Benchmark for Long-Term Coherence of Autonomous Agents](https://arxiv.org/pdf/2502.15840) +- [My new hobby: watching AI slowly drive Microsoft employees insane](https://www.reddit.com/r/ExperiencedDevs/comments/1krttqo/my_new_hobby_watching_ai_slowly_drive_microsoft/) +- [ChatGPT's hallucination problem is getting worse according to OpenAI's own tests and nobody understands why](https://www.pcgamer.com/software/ai/chatgpts-hallucination-problem-is-getting-worse-according-to-openais-own-tests-and-nobody-understands-why/) +- [We did the math on AI’s energy footprint. Here’s the story you haven’t heard.](https://www.technologyreview.com/2025/05/20/1116327/ai-energy-usage-climate-footprint-big-tech/) +- [Three Mile Island nuclear plant will reopen to power Microsoft data centers](https://www.npr.org/2024/09/20/nx-s1-5120581/three-mile-island-nuclear-power-plant-microsoft-ai) +- [Meet Mercy and Anita – the African workers driving the AI revolution, for just over a dollar an hour](https://www.theguardian.com/technology/article/2024/jul/06/mercy-anita-african-workers-ai-artificial-intelligence-exploitation-feeding-machine) +- ['This was essentially a two-week long DDoS attack': Game UI Database slowdown caused by relentless OpenAI scraping](https://www.gamedeveloper.com/business/-this-was-essentially-a-two-week-long-ddos-attack-game-ui-database-slowdown-caused-by-openai-scraping) +- [How OpenAI’s bot crushed this seven-person company’s website ‘like a DDoS attack’](https://techcrunch.com/2025/01/10/how-openais-bot-crushed-this-seven-person-companys-web-site-like-a-ddos-attack/) +- [LWN maintainer attributing recent slowdowns to "beyond unsustainable" levels of AI traffic](https://social.kernel.org/notice/AqJkUigsjad3gQc664) +- [Anubis](https://anubis.techaro.lol/) +- [Nepenthes](https://zadzmo.org/code/nepenthes/) +- [Fighting LLM Scrapers With Nepenthes And Fail2Ban](https://isopod.cool/blog/posts/grow_spikes/) +- [VLC Media Player to Use AI to Generate Subtitles for Videos](https://www.pcmag.com/news/vlc-media-player-to-use-ai-to-generate-subtitles-for-videos) +- [Glaze](https://glaze.cs.uchicago.edu/) + +--- + +<p id="n1"><a href="#n1r">1</a>. Pronounced "gen-eye", with the "G" sound from "graphics". This is to annoy people who think genai is cool.</p> + +<p id="n2"><a href="#n2r">2</a>. In particular, Microsoft's insistence on this garbage is <span style="color: yellow;">Pissing</span> me off. I'm genuinely considering getting a Macbook for some upcoming Adobe-requiring classes just to avoid Copilot/Recall/whatever nonsense they come up with next.</p> + +<p id="n3"><a href="#n3r">3</a>. If you unironically self-identify as a "vibe coder" I'm coming to your house and confiscating every internet-capable device you own. Hand over the MacBook, dipshit, you've lost your computer priveleges until you're ready to develop a working understanding of how the technology you're working with professionally actually functions.</p> + +<p id="n4"><a href="#n4r">4</a>. That said, this doesn't excuse <em>post-secondary</em> students who do this. You're paying ungodly money to be here and you're outsourcing the learning you're paying to do to a machine? What's wrong with you? Are you stupid?</p>
\ No newline at end of file diff --git a/blog/posts/ai2/index.php b/blog/posts/ai2/index.php new file mode 100644 index 0000000..f572f79 --- /dev/null +++ b/blog/posts/ai2/index.php @@ -0,0 +1 @@ +<?php include("../post.php");
\ No newline at end of file diff --git a/blog/posts/post.php b/blog/posts/post.php index e6b13b6..65d2661 100644 --- a/blog/posts/post.php +++ b/blog/posts/post.php @@ -1,17 +1,36 @@ <?php +/*ini_set('display_errors', 1); +ini_set('display_startup_errors', 1); +error_reporting(E_ALL);*/ + +if($_SERVER['REQUEST_URI'] === "/blog/posts/post.php") { + header("Location: /blog/"); + die(); +} + $cwd = preg_replace('/^.*\//', '', getcwd()); $feed = simplexml_load_file($_SERVER['DOCUMENT_ROOT']."/blog/blog.atom"); $pdate = ""; $udate = ""; $title = ""; $descr = ""; +$prevtitle = ""; +$prevlink = ""; +$nexttitle = ""; +$nextlink = ""; foreach($feed->entry as $entry) { if($entry->id == $cwd) { $pdate = preg_replace('/T.*$/', ' ', $entry->published); $udate = preg_replace('/T.*$/', ' ', $entry->updated); $title = $entry->title; $descr = $entry->summary; + } else if($title) { + $nextlink = $entry->link["href"]; + $nexttitle = $entry->title; break; + } else { + $prevlink = $entry->link["href"]; + $prevtitle = $entry->title; } } ?> @@ -21,27 +40,50 @@ foreach($feed->entry as $entry) { <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <link href="/style.css" rel="stylesheet" type="text/css" media="all"> - <link href="/blog/comment/comments.css" rel="stylesheet" type="text/css" media="all"> + <link href="/guestbook/comments.css" rel="stylesheet" type="text/css" media="all"> <?php echo("<title>$title</title><meta name='description' content='$descr'>"); $bgfile = glob('bg.*')[0]; if(!is_null($bgfile)) { - echo("<style> h1 { background-image: url('$bgfile') } </style>"); + echo("<style> body > h1:first-of-type { background-image: url('$bgfile') } </style>"); } ?> <style> - td { - display: table-cell; + form { + display: flex; + flex-direction: column; + gap: calc(var(--stdpadding) / 2); + } + #commentform-top, #commentform-bottom { + display: flex; + gap: calc(var(--stdpadding) / 2); + align-items: center; + } + #commentform-bottom { + justify-content: right; + } + input[type="submit"] { + width: fit-content; + } + .error, .success { + flex-grow: 1; + } + @media only screen and (hover: none) { + #commentform-top { + flex-direction: column; + } } </style> <?php include($_SERVER['DOCUMENT_ROOT'] . '/seasonal.php'); ?> </head> <body> - <?php + <?php include($_SERVER['DOCUMENT_ROOT'] . '/nav.php'); + include($_SERVER['DOCUMENT_ROOT'] . '/common.php'); $udates = ""; if($pdate != $udate) { $udates = " | Updated on $udate"; } echo("<h1>isoblog</h1><h2 id='caption'>$title</h2><p style='text-align: center;'><em>Posted on $pdate$udates</em></p>"); + //echo("<p style='text-align: right;'>I'm testing in prod right now. don't worry about it"); include("../../../Parsedown.php"); $Parsedown = new Parsedown(); echo $Parsedown->text(file_get_contents("index.md")); @@ -49,57 +91,36 @@ foreach($feed->entry as $entry) { $return = $_GET["return"]; ?> <hr> + <nav style="flex-direction: column;"> + <?php + if($prevlink) { + echo("<a style='width: 100%; box-sizing: border-box;' href='$prevlink'><svg style='max-height: 1em;' xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 4 28 16' stroke-width='1.5' stroke='currentColor' class='size-6'><path stroke-linecap='round' stroke-linejoin='round' d='m4.5 18.75 7.5-7.5 7.5 7.5' /><path stroke-linecap='round' stroke-linejoin='round' d='m4.5 12.75 7.5-7.5 7.5 7.5' /></svg>$prevtitle</a>"); + } + if($nextlink) { + echo("<a style='width: 100%; box-sizing: border-box;' href='$nextlink'><svg style='max-height: 1em;' xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 4 28 16' stroke-width='1.5' stroke='currentColor' class='size-6'><path stroke-linecap='round' stroke-linejoin='round' d='m4.5 5.25 7.5 7.5 7.5-7.5m-15 6 7.5 7.5 7.5-7.5' /></svg>$nexttitle</a>"); + } + ?> + </nav> + <hr> <h2>Comments</h2> - <form action="/blog/comment/submit.php" method="post" autocomplete="off"> + <form action="/guestbook/submit.php" method="post" autocomplete="off"> <?php echo "<input type='text' name='entry' value='".preg_replace("/^.*\//","",getcwd())."' style='display: none;' readonly>"; ?> - <table> - <tr> - <td><input type="text" name="name" placeholder="Name"></td> - <td><input type="text" name="botcheck" placeholder="Bot test (type "isopod")"></td> - </tr> - <tr> - <td colspan="2"><textarea name="message" placeholder="Comment (Now supports Markdown!)"></textarea></td> - </tr> - - <tr> - <?php - switch ($return) { - case 'noname': - echo "<td><span class='error'>Name required!</span></td>"; - break; - case 'nomessage': - echo "<td><span class='error'>Message required!</span></td>"; - break; - case 'botcheckfailed': - echo "<td><span class='error'>You failed the bot check!</span></td>"; - break; - case 'success': - echo "<td><span class='success'>Successfully posted!</span></td>"; - break; - default: - echo "<td></td>"; - break; - } - ?> - <td style="text-align: right;"><input type="submit" value="Post"></td> - </tr> - </table> + <textarea name="msg" placeholder="I know what you are." style="opacity: 0; position: absolute; left: -10000rem; height: 0; width: 0; overflow: clip;"></textarea> + <div id="commentform-top"> + <input type="text" name="name" placeholder="Name"> + <input type="text" name="website" placeholder="Website (optional)"> + <input type="text" name="botcheck" placeholder="Bot test (type "isopod")"> + </div> + <textarea name="message" placeholder="Comment (Now supports Markdown!)"></textarea> + <div id="commentform-bottom"> + <?php + if($return) { + echo($gbform_messages[$return]); + } + ?> + <input type="submit" value="Submit"> + </div> </form> - <?php - - $totaloutput = ""; - $postlist = json_decode(file_get_contents("../../comment/posts.json")); - foreach($postlist as $post) { - if ($post->entry == preg_replace("/^.*\//","",getcwd())) { - $output = ""; - $date = date("Y-m-d h:iA", $post->date); - $name = $post->name; - $message = $Parsedown->text(html_entity_decode($post->message)); - - $output = $output."<hr><article><table><tr><td style='text-align: left;'>".$name."</td><td style='text-align: right;'>".$date."</td></tr><tr><td colspan='2'>".$message."</td></tr></table></article>"; - $totaloutput = $output.$totaloutput; - } - } - echo $totaloutput; ?> + <?php include('../../../guestbook/comments.php'); echo_comments(preg_replace("/^.*\//","",getcwd()), $Parsedown); ?> </body> </html> diff --git a/blog/posts/stop_using_chromium/index.md b/blog/posts/stop_using_chromium/index.md new file mode 100644 index 0000000..bbfacc2 --- /dev/null +++ b/blog/posts/stop_using_chromium/index.md @@ -0,0 +1,68 @@ +*This post was also published as a standalone site [here](https://chrome.bathynomus.xyz/).* + +Chromium is the open-source foundation upon which Google's otherwise proprietary Chrome browser is based. Most modern web browsers are also based on this codebase, for example: + +- Google Chrome +- Microsoft Edge +- Opera +- Brave Browser +- Vivaldi +- Qutebrowser +- [Many others](https://en.wikipedia.org/wiki/Chromium_(web_browser)#Browsers_based_on_Chromium) + +## Why is that a bad thing? + +Chrome and other Chromium-based browsers account for around 90% of the total web browser market share at the moment. This gives Google, a trillion-dollar for-profit advertising firm, immense control over the web and the standards on which it runs, control that it frequently abuses and inarguably should not have. + +## What kind of abuses? + +You name it. To name a few recent examples: + +### FLoC/Topics API + +Google's response to the phasing out of third-party cookies, a system that had legitimate uses which were outweighed by the privacy violations they could be and more frequently were used to commit, was to introduce an API that was only capable of the sketchy parts. + +The now-scrapped FLoC, or "Federated Learning of Cohorts" was a system by which users with similar browsing habits, for an unspecified definition thereof, would be grouped algorithmically into "cohorts" which would then be used to target ads to you, essentially making your browser do some of the work that online ad agencies used to do themselves, and more importantly, used to rely on a feature you could easily disable to do. + +FLoC received enough well-earned backlash that Google reconsidered its approach, and replaced it with the Topics API, a system that's basically the same as cohorts except that instead of "Federated Learning", the groups are defined manually by humans - the browser compiles a list of "topics" you're interested in based on your browsing history, and sends that to advertisers instead of an algorithmically generated ID. + +While theoretically better than third-party cookies, which make identifying you as an individual trivial, neither API addresses the root issue here: maybe you don't want targeted advertising. Maybe you actually value your privacy, and don't want to send arbitrary websites even vague details about what you've been up to online. While other, more privacy-respecting browsers will likely refuse to implement Topics if possible, if you're one of the 90% of people using a Chromium-based browser, you don't get a choice. + +- [Electronic Frontier Foundation - Google's FLoC Is a Terrible Idea](https://www.eff.org/deeplinks/2021/03/googles-floc-terrible-idea) +- [Ars Technica - Google drops FLoC after widespread opposition, pivots to "Topics API" plan](https://arstechnica.com/gadgets/2022/01/google-drops-floc-after-widespread-opposition-pivots-to-topics-api-plan/) +- [Update 2023-09-08] [Ars Technica - Google gets its way, bakes a user-tracking ad platform directly into Chrome](https://arstechnica.com/gadgets/2023/09/googles-widely-opposed-ad-platform-the-privacy-sandbox-launches-in-chrome/) + +### JPEG XL + +JPEG XL is a new image format created by the Joint Photographic Experts Group, who you may know as the people who brought you JPEG back in '92. JPEG XL is fully backwards compatible with legacy JPEG, supports features like transparency, lossless compression, and animation, and has far superior compression and support for far larger images with higher color depth than existing formats. It's objectively better in every way than everything it competes with. However... + +Google killed JPEG XL, plain and simple. It implemented opt-in support for it in Chrome as an optional flag for a while, and then took it out citing insufficient "interest from the entire ecosystem". The real reason is Google wanted to push its own inferior format, AVIF, its replacement for WebP, which it also created. JPEG XL had near-universal industry support outside of web browsers, but because Google dominates that market, it had the power to kill the format completely for online use. + +- [jpegxl.info](https://jpegxl.info/) +- [Free Software Foundation - Google's decision to deprecate JPEG-XL emphasizes the need for browser choice and free formats](https://www.fsf.org/blogs/community/googles-decision-to-deprecate-jpeg-xl-emphasizes-the-need-for-browser-choice-and-free-formats) + +### Web Environment Integrity + +Web Environment Integrity is a proposal by Google (or, if you care about semantics, four Google engineers on one of their personal GitHub accounts) for a standard that would allow websites to check with a third-party attester to prove that a "web environment" - in other words, the user's web browser and operating system - is "trustworthy" and has not been "tampered with". + +This could be used to block users with untrusted extensions, such as adblockers, installed, and it would automatically lock out any browser or OS that doesn't have support for the standard or isn't trusted by major attesters. It is likely that this would be used to make websites impossible to use with adblockers and similar safety and accessibility tools enabled or on systems not running major proprietary OSes and browsers like Windows and Chrome, whether intentionally or not. + +In this way, Web Environment Integrity would act as the ultimate form of DRM for the web, giving governments, rights holders, and corporations like Google and Netflix absolute control over what browsers and operating systems have access to their services. Describing all the problems this would cause could fill a dozen EFF blog posts, so I'll leave it to your imagination here. + +Despite this spec being merely a proposal on a Google engineer's personal GitHub, Google is already fast-tracking its implementaion in Chromium, presumably in an attempt to go over the heads of the W3C, the standards body it's a part of, to force its standardization on the basis of "standardizing existing functionality". + +- [Defective By Design - "Web Environment Integrity" is an all-out attack on the free Internet](https://www.defectivebydesign.org/blog/web_environment_integrity_is_an_all_out_attack_on_free_internet) +- [Vivaldi - Unpacking Google's new “dangerous” Web-Environment-Integrity specification](https://vivaldi.com/blog/googles-new-dangerous-web-environment-integrity-spec/) +- [Ben Wiser (Google), Borbala Benko (Google), Philipp Pfeiffenberger (Google), Sergey Kataev (Google) - Web Environment Integrity Explainer](https://github.com/RupertBenWiser/Web-Environment-Integrity/blob/main/explainer.md) + +### So what do I do then? + +I implore you to use a browser that's not based on Chromium. If you're on a Mac, you can just use Safari, but otherwise, your only major option is [Firefox](https://www.mozilla.org/en-US/firefox/), or a fork thereof such as [LibreWolf](https://librewolf.net/). + +I get the impression that a lot of less tech-savvy users find the prospect of switching browsers, especially after years of using the same one, to be quite intimidating, but it's really not. Firefox is able to import all your bookmarks, saved passwords, and other browsing data directly from Chrome, and is highly customizable and has a rich ecosystem of extensions and themes so you can make it resemble what you're used to. Mozilla has an easy official [guide](https://support.mozilla.org/en-US/kb/switching-chrome-firefox) to import your data from Chrome, and it works with most other browsers as well. + +### Cool, but I don't care. Let me look at your website. + +If you got redirected here, you may be able to circumvent it by configuring your browser to send a different user-agent string. I'd recommend clearing your cache after, in case your browser cached the redirect signal. + +I won't explain how to do this myself, both because I don't know what browser you're using and because the idea here is to try to force you to be knowledgable enough about this subject to know better before deciding to use Chromium anyway. diff --git a/blog/posts/stop_using_chromium/index.php b/blog/posts/stop_using_chromium/index.php new file mode 100644 index 0000000..f572f79 --- /dev/null +++ b/blog/posts/stop_using_chromium/index.php @@ -0,0 +1 @@ +<?php include("../post.php");
\ No newline at end of file diff --git a/common.php b/common.php new file mode 100644 index 0000000..3433d20 --- /dev/null +++ b/common.php @@ -0,0 +1,15 @@ +<?php + +# Common data for the various guestbook scripts +$datadir = "/var/www/data/isopoddotcool/"; +$defaultmodstatus = 1; # If 0, all posts will be held for review by default. + # If 1, only posts containing the banned words defined in + # $datadir/bannedwords.json will be held for review. +$gbform_messages = array ( + "success" => "<span class='success'>Successfully posted!</span>", + "review" => "<span class='warning'>Sumitted for review!</span>", + "botcheckfailed" => "<span class='error'>Bot test failed!</span>", + "noname" => "<span class='error'>Name required!</span>", + "nomessage" => "<span class='error'>Message required!</span>", + "invalidlink" => "<span class='error'>Invalid link!</span>" +);
\ No newline at end of file diff --git a/etc/buttons/miku-approved.gif b/etc/buttons/miku-approved.gif Binary files differnew file mode 100644 index 0000000..106c982 --- /dev/null +++ b/etc/buttons/miku-approved.gif diff --git a/etc/buttons/neo-fedi.gif b/etc/buttons/neo-fedi.gif Binary files differnew file mode 100644 index 0000000..5e84e5c --- /dev/null +++ b/etc/buttons/neo-fedi.gif diff --git a/etc/buttons/she-her.gif b/etc/buttons/she-her.gif Binary files differnew file mode 100644 index 0000000..2c15fe4 --- /dev/null +++ b/etc/buttons/she-her.gif diff --git a/etc/buttons/trans.png b/etc/buttons/trans.png Binary files differindex 9e3b390..2e63a5e 100644 --- a/etc/buttons/trans.png +++ b/etc/buttons/trans.png diff --git a/etc/buttons/tyg.gif b/etc/buttons/tyg.gif Binary files differnew file mode 100644 index 0000000..9215840 --- /dev/null +++ b/etc/buttons/tyg.gif diff --git a/etc/index.php b/etc/index.php index 5d368c9..f164f9a 100644 --- a/etc/index.php +++ b/etc/index.php @@ -41,14 +41,16 @@ <h2>Buttons</h2> <div class="buttons"> <a target="_blank" href="https://easyussr.neocities.org/torrenting.html"><img src="buttons/piracy.gif" alt="Piracy Now!"></a> - <a target="_blank" href="https://frame.work"><img src="buttons/bestviewed.gif" alt="Best viewed with a computer"></a> <a target="_blank" href="https://www.videolan.org/"><img src="buttons/getvlcnow.png" alt="get VLC now!"></a> + <a target="_blank" href="https://isopod.zone/"><img src="buttons/neo-fedi.gif" alt="Join the Fediverse!"></a> <a target="_blank" href="https://www.youtube.com/watch?v=nleepK7P978"><img src="buttons/35mm.gif" alt="Best heard through a 3.5mm jack"></a> + <a target="_blank" href="https://frame.work"><img src="buttons/bestviewed.gif" alt="Best viewed with a computer"></a> <img src="buttons/tested_on_firefox.gif" alt="Tested on Firefox"> <img src="buttons/nowebp.gif" alt="No WebP! Just use PNG"> <img src="buttons/svg.svg" alt="Scalable Vector Graphics Now!" style="width:88px; height:31px;" /> <a target="_blank" href="http://web3.14159.annwfn.net/"><img src="buttons/web-pi.png" alt="Web Pi Certified"></a> <a target="_blank" href="https://neocities.org"><img src="buttons/neocities_stamp.gif" alt="Neocities: The web is yours"></a> + <a href="https://status.cafe/"><img src="/blog/media/banner-statuscafe.png" alt="Status Cafe"></a> <a target="_blank" href="http://www.ermel.org/handcoded/"><img src="buttons/handcode.png" alt="100% hand coded HTML"></a> <a target="_blank" href="https://12ft.io/"><img src="buttons/dontyouhate.gif" alt="Don't you hate it when you're reading a page and then some-- This content is for subscribers only! Paywalls Gatekeep Knowledge."></a> <img src="buttons/righttorepair.png" alt="I support right to repair"> @@ -62,16 +64,20 @@ <img src="buttons/linux_powered.gif" alt="Linux powered"> <img src="buttons/drpepper.gif" alt="Powered by Dr Pepper"> <img src="buttons/the_void.gif" alt="Powered by the void"> + <img src="buttons/miku-approved.gif" alt="This site is Miku approved"> <img src="buttons/krisbtn.png" alt="Kris where tf are we"> <a target="_blank" href="https://neofoxfloofexplo.de/"><img src="buttons/floof_explode_88x31.gif" alt=":neofox_floof_explode:"></a> <img src="buttons/badhtml.png" alt="W3C Bad HTML Markup"> <img src="buttons/bantimetravel.png" alt="Ban Time Travel "Now""> <img src="buttons/css.png" alt="CSS is awesome"> + <img src="buttons/tyg.gif" alt="Trans your gender"> <a target="_blank" href="https://we-are-jammin.xyz/"><img src="https://damcraft.de/88x31/jammin.webp" alt="We're jammin!"></a> + <iframe src="//incr.easrng.net/badge?key=isopoddotcool" style="background: url(//incr.easrng.net/bg.gif)" title="increment badge" width="88" height="31" frameborder="0"></iframe> <a target="_blank" href="https://crouton.net/"><img src="buttons/usatoday.gif" alt="USA Today Hot Site"></a> <a target="_blank" href="https://seaslug.neocities.org/"><img src="buttons/shrimp.png" alt="Shrimp Now!"></a> <img src="buttons/canadian.gif" title="Regrettably..." alt="Canadian on the web"> <img src="buttons/queercoded.png" alt="You're telling me a queer coded this"> + <img src="buttons/she-her.gif" alt="she/her" title="Its pronouns are she/her"> <img src="buttons/aro.png" alt="Aromantic pride flag"> <!--img src="buttons/ace.png"--> <a href="https://rainy.gay/pride/pridebuttons.html"><img src="buttons/trans.png" alt="Trans pride flag"></a> @@ -82,8 +88,6 @@ <h3>My buttons</h3> <div class="buttons"> <img src="buttons/isopodhours.png" alt="isopod hours"> - <!--img src="buttons/niceopod_button_2.png" alt="niceopod"> - <img src="buttons/niceopod_button.png" alt="niceopod"--> <a target="_blank" href="https://deeptwisty.com/"><img src="buttons/deeptwisty_button.png" alt="deep twisty"></a> </div> diff --git a/etc/quotes/index.php b/etc/quotes/index.php index 7245c34..ad9f8b6 100644 --- a/etc/quotes/index.php +++ b/etc/quotes/index.php @@ -26,12 +26,14 @@ error_reporting(E_ALL); .pfp { border-radius: 50%; height: 3rem; + min-width: 3rem; box-shadow: none; } .message { display: flex; margin: 1rem; text-shadow: none; + word-break: break-word; } .content { margin-left: 1rem; diff --git a/greenhouse/index.php b/greenhouse/index.php index c0e10d3..9455c22 100644 --- a/greenhouse/index.php +++ b/greenhouse/index.php @@ -42,20 +42,23 @@ <body> <?php include($_SERVER['DOCUMENT_ROOT'] . '/nav.php'); bg(true, 10); ?> <h1 style="overflow: hidden;">webgreenhouse</h1> - <h2 id="caption"> </h2> + <h2 id="caption">I'll be honest, I'm not sure some of these plants belong underwater...</h2> <div class="shelf"> <iframe src="https://isopod.cool/stuff/webgarden/" scrolling="no" loading="lazy"></iframe> <div id="bodytext"> <p style="margin-top: 0; margin-bottom: 0.85rem;">You've found my webgarden page! A <a href="https://webgardens.neocities.org/tutorial/" title="or pot, or bonsai">webgarden</a> is a mini‑webpage that other people can embed in their websites, as defined by <a href="https://justbecaws.neocities.org/">Corv</a>. Here's the code for mine:</p> <textarea style="width: 100%; margin: 0; box-sizing: border-box;" rows="2" readonly><iframe src="https://isopod.cool/stuff/webgarden/" style="height: 250px; width: 250px;" scrolling="no" loading="lazy"></iframe></textarea> + <p>I'm afraid it probably won't be fully functional if you're on mobile, but then again this entire standard isn't really the most responsive thing in the world anyway.</p> </div> <iframe src="https://lu.tiny-universes.net/webgarden/webgarden.html" scrolling="no" loading="lazy"></iframe> <iframe src="https://obspogon.neocities.org/webgarden" scrolling="no" loading="lazy"></iframe> <iframe src="https://pip-pepping.neocities.org/web-garden/webgarden.html" scrolling="no" loading="lazy"></iframe> <iframe src="https://dantescanline.com/webgarden.html" scrolling="no" loading="lazy"></iframe> - <iframe src="https://missmoss.neocities.org/webgarden.html/" scrolling="no" loading="lazy"></iframe> + <iframe src="https://justbecaws.neocities.org/webgarden" scrolling="no" loading="lazy"></iframe> <iframe src="https://neonriser.neocities.org/webgarden.html" scrolling="no" loading="lazy"></iframe> <iframe src="https://zeusofthecrows.github.io/stadt/webgarden" scrolling="no" loading="lazy"></iframe> + <iframe src="https://sixey.es/greenhouse/webgarden.html" scrolling="no" loading="lazy"></iframe> + <iframe src="https://shroom.ink/webgarden.html" scrolling="no" loading="lazy"></iframe> </div> </body> diff --git a/blog/comment/comments.css b/guestbook/comments.css index 7f97c4c..031320f 100644 --- a/blog/comment/comments.css +++ b/guestbook/comments.css @@ -17,6 +17,16 @@ article { margin: 2rem auto; display: grid; gap: 1rem; + grid-template-areas: + 'gb-name gb-date gb-index' + 'gb-cool gb-cool gb-cool' + 'gb-found gb-found gb-found' + 'gb-message gb-message gb-message' + 'gb-reply gb-reply gb-reply'; +} +article :is(h1,h2,h3,h4,h5,h6) { + border: none; + padding-left: initial; } input, textarea { @@ -49,16 +59,39 @@ input[type="submit"]:hover, input[type="reset"]:hover { font-size: 0.85em; } .success { - color: #00ff00; + color: lime; + font-size: 0.85em; +} +.warning { + color: yellow; font-size: 0.85em; } .reply { - border-left: 3px solid gainsboro; - padding-left: 1rem; + padding: calc(var(--stdpadding) * 1.5); + margin: 0; + margin-bottom: initial; + border-left: var(--stdaccentborder); + background-color: var(--blockbg); + margin-bottom: var(--stdpadding); +} +.reply > :last-child { + margin-bottom: 0; } .message { padding-top: 1.5rem; } +.gb-date { + text-align: center; +} +.gb-index { + text-align: right; +} +.gb-cool { + word-break: break-all; +} +.gb-name, .gb-date, .gb-index { + min-width: calc((var(--bodywidth) / 3) - (var(--stdpadding) * 2)) +} @media only screen and (hover: none) { form td:first-child { text-align: left; @@ -75,6 +108,17 @@ input[type="submit"]:hover, input[type="reset"]:hover { article { margin: 2rem auto; } + @media (max-width: 43rem) { + article { + grid-template-areas: + 'gb-name gb-name gb-index' + 'gb-date gb-date gb-date' + 'gb-cool gb-cool gb-cool' + 'gb-found gb-found gb-found' + 'gb-message gb-message gb-message' + 'gb-reply gb-reply gb-reply'; + } + } } @media (prefers-contrast: more) { input[type="text"], input[type="email"], textarea { diff --git a/guestbook/comments.php b/guestbook/comments.php new file mode 100644 index 0000000..3f65fb9 --- /dev/null +++ b/guestbook/comments.php @@ -0,0 +1,46 @@ +<?php +function echo_comments($page, $Parsedown = null) { + include($_SERVER['DOCUMENT_ROOT'] . '/common.php'); + if(!$Parsedown) { + include($_SERVER['DOCUMENT_ROOT']."/Parsedown.php"); + $Parsedown = new Parsedown(); + $Parsedown->setSafeMode(true); + } + + $totaloutput = ""; + $postlist = json_decode(file_get_contents($datadir."posts.json")); + $index = 1; + foreach($postlist as $post) { + if($post->entry === $page and $post->modstatus > 0) { + $output = ""; + $date = date("Y-m-d h:iA", $post->date); + $name = htmlentities($post->name); + $message = $Parsedown->text($post->message); + $found = htmlentities($post->found); + $website = $post->website; + $cool = $post->cool; + $coolsanitized = htmlentities(preg_replace("/https?:\/\//i", "", $cool)); + $reply = $Parsedown->text($post->reply); + + $output = $output."<hr><article><div style='grid-area:gb-name;' class='gb-name'>"; + if($website) { $output = $output."<a href='$website'>$name</a>"; } + else { $output = $output.$name; } + $output = $output."</div><div style='grid-area:gb-date;' class='gb-date'>$date</div><div style='grid-area:gb-index;' class='gb-index'>Entry #$index</div>"; + if($cool) { + $output = $output."<div style='grid-area:gb-cool;' class='gb-cool'><b>cool thing</b>: <a href='$cool'>$coolsanitized</a></div>"; + } + if($found) { + $output = $output."<div style='grid-area:gb-found;'><b>How did you find me?</b><br>$found</div>"; + } + $output = $output."<div style='grid-area:gb-message;'>$message</div>"; + if($reply) { + $output = $output."<div style='grid-area:gb-reply;' class='reply'><b>Reply</b>:$reply</div>"; + } + $output = $output."</article>"; + $index++; + $totaloutput = $output.$totaloutput; + } + } + echo $totaloutput; +} + diff --git a/guestbook/feed.php b/guestbook/feed.php index 7cdb62e..64d1b31 100644 --- a/guestbook/feed.php +++ b/guestbook/feed.php @@ -4,43 +4,51 @@ header('Content-Type: text/xml'); echo '<rss version="2.0"><channel>'; echo '<title>isopod.cool guestbook</title>'; -echo '<description>The guestbook on isopod.cool</description>'; +echo '<description>The guestbook and blog comments on isopod.cool</description>'; echo '<language>en-us</language>'; echo '<link>https://isopod.cool/guestbook/</link>'; echo '<generator>My crappy PHP code</generator>'; -$postlist = json_decode(file_get_contents("posts.json")); + +include($_SERVER['DOCUMENT_ROOT']."/Parsedown.php"); +$Parsedown = new Parsedown(); +$Parsedown->setSafeMode(true); +include($_SERVER['DOCUMENT_ROOT'] . '/common.php'); +$postlist = json_decode(file_get_contents($datadir."posts.json")); $index = 1; $totaloutput = ""; foreach($postlist as $post) { - $output = ""; - $date = date("D, d M Y H:m:s", $post->date) . " GMT"; - $name = $post->name; - $message = $post->message; - $found = $post->found; - $website = $post->website; - $cool = $post->cool; - $coolsanitized = htmlentities(preg_replace("/https?:\/\//i", "", $cool)); - $reply = htmlentities($post->reply); - - if($website) { $output = $output."<a href='$website'>$name</a>:<br><br>"; } - else { $output = $output.$name.":<br><br>"; } - - if($cool) { - $output = $output."<b>cool thing</b>: <a href='$cool'>$coolsanitized</a><br><br>"; - } - - if($found) { - $output = $output."<b>How did you find me?</b><br>$found<br><br>"; - } - - $output = $output.$message."<br><br>"; - - if($reply) { - $output = $output."<hr><b>Reply:</b><br>$reply"; + if($post->modstatus == 1) { + $output = ""; + $entry = $post->entry; + $date = date("D, d M Y H:m:s", $post->date) . " GMT"; + $name = $post->name; + $message = $Parsedown->text($post->message); + $found = $post->found; + $website = $post->website; + $cool = $post->cool; + $reply = $Parsedown->text($post->reply); + + if($website) { $output = $output."<p><a href='$website'>$name</a>:</p>"; } + else { $output = $output."</p>$name:</p>"; } + + if($cool) { + $output = $output."<p><b>cool thing</b>: <a href='$cool'>$cool</a></p>"; + } + + if($found) { + $output = $output."<p><b>How did you find me?</b><br>$found</p>"; + } + + $output = $output.$message; + + if($reply) { + $output = $output."<hr><p><b>Reply</b>:</p>$reply"; + } + $output_sanitized = preg_replace("/&gt;/", ">", preg_replace("/&lt;/", "<", htmlspecialchars($output))); + $totaloutput = "<item><title>Entry #" . $index . " on " . $entry . " - " . $name . "</title><link>https://isopod.cool/guestbook/</link><pubDate>" . $date . "</pubDate><description>".$output_sanitized."</description><guid isPermaLink='false'>" . $index . $post->date . $name . "</guid></item>\n".$totaloutput; + $index++; } - $totaloutput = "<item><title>Entry #" . $index . " - " . $name . "</title><link>https://isopod.cool/guestbook/</link><pubDate>" . $date . "</pubDate><description>".htmlentities($output)."</description><guid isPermaLink='false'>" . $index . $post->date . $name . "</guid></item>".$totaloutput; - $index++; } echo $totaloutput; diff --git a/guestbook/index.php b/guestbook/index.php index 7d85fd1..77d211e 100644 --- a/guestbook/index.php +++ b/guestbook/index.php @@ -10,144 +10,17 @@ error_reporting(E_ALL); <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Guestbook</title> <link href="../style.css" rel="stylesheet" type="text/css" media="all"> + <link href="./comments.css" rel="stylesheet" type="text/css" media="all"> <style> - table { - border-collapse: collapse; - table-layout: fixed; - } - td { - padding: 0.3rem; - } - - form > table { - width: 100%; - margin: auto; - margin-bottom: 1.5rem; - } form td:first-child { text-align: right; } - - article { - width: 100%; - margin: 2rem auto; - display: grid; - gap: 1rem; - grid-template-areas: - 'gb-name gb-date gb-index' - 'gb-cool gb-cool gb-cool' - 'gb-found gb-found gb-found' - 'gb-message gb-message gb-message' - 'gb-reply gb-reply gb-reply'; - } - article :is(h1,h2,h3,h4,h5,h6) { - border: none; - padding-left: initial; - } - - input, textarea { - border: none; - font-family: var(--stdfont); - } - input[type="text"], input[type="email"], textarea { - width: 100%; - background: none; - border-bottom: 2px solid #444444; - color: gainsboro; - padding: 0.35rem; - box-sizing: border-box; - font-size: .9em; - } - input[type="submit"], input[type="reset"] { - padding: 0.35rem 0.5rem; - box-shadow: 2px 2px 6px black; - margin: 0.3rem; - display: inline-block; - } - input[type="submit"]:active, input[type="reset"]:active { - transform: translate(1px, 1px); box-shadow: 0 0 2px black; - } - input[type="submit"]:hover, input[type="reset"]:hover { - cursor: pointer; - } - - hr { - width: 30%; - } - .error { - color: red; - font-size: 0.85em; - } - .success { - color: #00ff00; - font-size: 0.85em; - } - .reply { - border-left: 3px solid gainsboro; - padding-left: 1rem; - } - .message { - padding-top: 1.5rem; - } - .gb-date { - text-align: center; - } - .gb-index { - text-align: right; - } - .gb-cool { - word-break: break-all; - } - .gb-name, .gb-date, .gb-index { - min-width: calc(var(--bodywidth) / 3); - } - @media only screen and (hover: none) { - form td:first-child { - text-align: left; - } - form td:nth-child(2) { - padding-left: 0; - padding-right: 0; - } - input[type="text"], input[type="email"], textarea { - background: none; - border: 2px solid #00000033; - border-bottom: 2px solid #888888; - } - article { - margin: 2rem auto; - } - @media (max-width: 43rem) { - article { - grid-template-areas: - 'gb-name gb-name gb-index' - 'gb-date gb-date gb-date' - 'gb-cool gb-cool gb-cool' - 'gb-found gb-found gb-found' - 'gb-message gb-message gb-message' - 'gb-reply gb-reply gb-reply'; - } - } - } - @media (prefers-contrast: more) { - input[type="text"], input[type="email"], textarea { - outline: 1px solid white; - color: white; - } - input:focus, textarea:focus { - outline: 3px solid white; - } - input[type="submit"] { - background: none; - color: white; - outline: 1px solid white; - } - } </style> <?php include($_SERVER['DOCUMENT_ROOT'] . '/seasonal.php'); ?> </head> <body> - <?php include($_SERVER['DOCUMENT_ROOT'] . '/nav.php'); bg(); ?> + <?php include($_SERVER['DOCUMENT_ROOT'] . '/nav.php'); bg(); + include($_SERVER['DOCUMENT_ROOT'] . '/common.php'); ?> <h1>guestbook</h1> <h2 id="caption">say hi!</h2> <nav> @@ -157,88 +30,41 @@ error_reporting(E_ALL); $return = $_GET["return"]; ?> <form action="submit.php" method="post" autocomplete="off"> + <textarea name="msg" placeholder="I know what you are." style="opacity: 0; position: absolute; left: -10000rem; height: 0; width: 0; overflow: clip;"></textarea> <table> - - <?php if($return == "noname") { echo "<td></td><td><span class='error'>Name required!</span></td>"; } ?> <tr> <td>Name<span style="color:red;">*</span></td> <td><input type="text" name="name"></td> </tr> - - <?php if($return == "invalidwebsite") { echo "<td></td><td><span class='error'>Invalid URL!</span></td>"; } ?> <tr> <td>Website</td> <td><input type="text" name="website" placeholder="https://"></td> </tr> - - <?php if($return == "invalidlink") { echo "<td></td><td><span class='error'>Invalid URL!</span></td>"; } ?> <tr> <td>Link something cool</td> <td><input type="text" name="cool" placeholder="https://"></td> </tr> - <tr> <td>How did you find me?</td> <td><textarea name="found"></textarea></td> </tr> - - <?php if($return == "nomessage") { echo "<td></td><td><span class='error'>Message required!</span></td>"; } ?> <tr> <td>Message<span style="color:red;">*</span></td> <td><textarea name="message" placeholder="Now supports Markdown!"></textarea></td> </tr> - - <?php if($return == "botcheckfailed") { echo "<td></td><td><span class='error'>You failed the bot check!</span></td>"; } ?> <tr> <td>Bot test (six-letter scientific term for a roly-poly or woodlouse)<span style="color:red;">*</span></td> <td><input type="text" name="botcheck" placeholder="*.cool"></td> </tr> - <?php if($return == "success") { echo "<td></td><td><span class='success'>Successfully posted!</span></td>"; } ?> + <?php if($return) { echo("<tr><td></td><td>".$gbform_messages[$return]."</td></tr>"); }?> <tr> - <td colspan="2" style="text-align: center;"><input type="reset"><input type="submit" value="Post"></td> + <td colspan="2" style="text-align: center;"><input type="reset"><input type="submit" value="Submit"></td> </tr> </table> + <input type='text' name='entry' value='guestbook' style='display: none;' readonly> </form> - <?php - include("../Parsedown.php"); - $Parsedown = new Parsedown(); - $Parsedown->setSafeMode(true); - - $totaloutput = ""; - $postlist = json_decode(file_get_contents("posts.json")); - $index = 1; - foreach($postlist as $post) { - $output = ""; - $date = date("Y-m-d h:iA", $post->date); - $name = $post->name; - $message = $Parsedown->text(html_entity_decode($post->message)); - $found = $post->found; - $website = $post->website; - $cool = $post->cool; - $coolsanitized = htmlentities(preg_replace("/https?:\/\//i", "", $cool)); - $reply = $Parsedown->text($post->reply); - - $output = $output."<hr><article><div style='grid-area:gb-name;' class='gb-name'>"; - if($website) { $output = $output."<a href='$website'>$name</a>"; } - else { $output = $output.$name; } - $output = $output."</div><div style='grid-area:gb-date;' class='gb-date'>$date</div><div style='grid-area:gb-index;' class='gb-index'>Entry #$index</div>"; - if($cool) { - $output = $output."<div style='grid-area:gb-cool;' class='gb-cool'><b>cool thing</b>: <a href='$cool'>$coolsanitized</a></div>"; - } - if($found) { - $output = $output."<div style='grid-area:gb-found;'><b>How did you find me?</b><br>$found</div>"; - } - $output = $output."<div style='grid-area:gb-message;'>$message</div>"; - if($reply) { - $output = $output."<div style='grid-area:gb-reply;' class='reply'><b>Reply</b>:<br>$reply</div>"; - } - $output = $output."</article>"; - $index++; - $totaloutput = $output.$totaloutput; - } - echo $totaloutput; ?> - + <?php include('./comments.php'); echo_comments('guestbook'); ?> </body> </html> diff --git a/guestbook/submit.php b/guestbook/submit.php index 09d0404..7fab0d5 100644 --- a/guestbook/submit.php +++ b/guestbook/submit.php @@ -1,69 +1,56 @@ <?php + include($_SERVER['DOCUMENT_ROOT'] . '/common.php'); if ($_SERVER["REQUEST_METHOD"] == "POST") { - + $returnCode = "success"; - if($_POST["botcheck"] != "isopod") { + if($_POST["botcheck"] != "isopod" or $_POST['msg']) { $returnCode = "botcheckfailed"; } else if(!$_POST["name"]) { $returnCode = "noname"; } else if(!$_POST["message"]) { $returnCode = "nomessage"; - } else if($_POST["website"] and !preg_match("/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i", $_POST["website"])) { - $returnCode = "invalidwebsite"; - } else if($_POST["cool"] and !preg_match("/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i", $_POST["cool"])) { + } else if( + $_POST["website"] and !preg_match("/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i", $_POST["website"]) + or $_POST["cool"] and !preg_match("/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i", $_POST["cool"]) + ) { $returnCode = "invalidlink"; } else { - date_default_timezone_set("America/Edmonton"); + $modstatus = $defaultmodstatus; + $bannedwords = json_decode(file_get_contents($datadir."bannedwords.json")); + $bwspotted = false; + foreach($bannedwords as $word) { + if(preg_grep($word, $_POST)) { + $modstatus = 0; + } + } + if($modstatus < 1) { + $returnCode = "review"; + } + $currentPost = array( + "entry" => $_POST["entry"], + "sourceip" => $_SERVER['REMOTE_ADDR'], "date" => time(), - "name" => htmlentities($_POST["name"]), - "message" => htmlentities($_POST["message"]), - "found" => htmlentities($_POST["found"]), + "name" => $_POST["name"], + "message" => $_POST["message"], + + "found" => $_POST["found"], "website" => $_POST["website"], "cool" => $_POST["cool"], - "reply" => "" + "reply" => "", + "modstatus" => $modstatus ); - $filename = "posts.json"; - - $handle = @fopen($filename, 'r+'); - - // create the file if needed - if ($handle === null) - { - $handle = fopen($filename, 'w+'); - } - - if ($handle) - { - // seek to the end - fseek($handle, 0, SEEK_END); - - // are we at the end of is the file empty - if (ftell($handle) > 0) - { - // move back a byte - fseek($handle, -2, SEEK_END); - - // add the trailing comma - fwrite($handle, ",\n", 2); - - // add the new json string - fwrite($handle, json_encode($currentPost) . "]\n"); - } - else - { - // write the first event inside an array - fwrite($handle, json_encode(array($currentPost))); - } - - // close the handle on the file - fclose($handle); - } + $filename = $datadir."posts.json"; + $extantPosts = json_decode(file_get_contents($filename)); + array_push($extantPosts, $currentPost); + file_put_contents($filename, json_encode($extantPosts, JSON_PRETTY_PRINT)); + } } - header("Location: ./?return=$returnCode"); + $referrer = preg_replace("/\?.*/", "", $_SERVER['HTTP_REFERER']); + header("Location: $referrer?return=$returnCode"); ?> <!DOCTYPE html> <html lang="en"> @@ -41,13 +41,14 @@ margin-right: var(--stdpadding); } #bubblecolumn { - position: absolute; + position: fixed; right: 7%; top: 0; width: 29px; height: 100%; background-image: url(images/bubblecolumn1.gif); background-repeat: repeat-y; + pointer-events: none; } #bucketfish, .bflink { --red: #ffcaca; @@ -137,6 +138,7 @@ } </style> <?php + include($_SERVER['DOCUMENT_ROOT'] . '/common.php'); include($_SERVER['DOCUMENT_ROOT'] . '/seasonal.php'); if(!preg_match('/(headless.*)/i', $_SERVER['HTTP_USER_AGENT'])) { $captions = array(); @@ -254,6 +256,9 @@ 'is this a bedbuge?', 'is this buge trans gener?', 'Now in HD!', + 'Hard Disk Drive!', + '"Tablet or smartphone device"', + 'Free Palestine!', 'COUNTER', 'TUEADAY', 'PLACEHIM', @@ -274,9 +279,9 @@ if(!$seasonal) { switch($cap) { case 'COUNTER': - $num = (int) filter_var(file_get_contents("views.txt"), FILTER_SANITIZE_NUMBER_INT); + $num = (int) filter_var(file_get_contents($datadir."caption_views.txt"), FILTER_SANITIZE_NUMBER_INT); $num++; - file_put_contents("views.txt", $num); + file_put_contents($datadir."caption_views.txt", $num); $cap = "This caption has been viewed $num times!"; $tit = "This title has been viewed $num times!"; break; @@ -333,6 +338,28 @@ <h1 style="margin-top: 0;">isopod dot cool<sup>v3.1</sup></h1> <h2 id="caption"><?php echo $cap; ?></h2> </div> + <?php + $username = "niceopod"; // Your username here! + $ch = curl_init("https://status.cafe/users/$username/status.json"); + + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_HEADER, 0); + + $str = curl_exec($ch); + if(curl_error($ch)) { + //echo curl_error($ch); + $str = ""; + } + curl_close($ch); + $status_data = json_decode($str, true); + $status_content = $status_data["content"]; + $face = $status_data["face"]; + $timeago = $status_data["timeAgo"]; + if(strlen($status_content) < 1) { + $status_content = "Something's gone wrong server side..."; + } + echo "<figure class='quote'><blockquote id='statuscafe'><div id='statuscafe-username'><a href='https://status.cafe/users/$username' target='_blank'>status</a> $face $timeago</div><div id='statuscafe-content'>$status_content</div></blockquote></figure>"; + ?> <nav id="webrings"> <div style="font-family: sans-serif; font-weight: bold;"> <a href="https://hotlinewebring.club/bathynomus/previous" style="color: white; text-decoration: none;">←</a> @@ -354,7 +381,17 @@ <a href="https://fediring.net/random">?</a> <a href="https://fediring.net/next?host=isopod.cool">→</a> </div> + <div> + <a href="https://baccyflap.com/noai/?prv&s=ipd">←</a> + <a href="https://baccyflap.com/noai">no AI webring</a> + <a href="https://baccyflap.com/noai/?rnd">?</a> + <a href="https://baccyflap.com/noai/?nxt&s=ipd">→</a> + </div> </nav> + <div class="buttons"> + <img src="etc/buttons/isopodhours.png" alt="isopod hours"> + <a target="_blank" href="https://deeptwisty.com/"><img src="etc/buttons/deeptwisty_button.png" alt="deep twisty"></a> + </div> <!--script type="text/javascript">document.write('<a href="desktop.html">$login<span class="blinking" >_</span></a>');</script--> </main> diff --git a/links/buttons/crimew.png b/links/buttons/crimew.png Binary files differnew file mode 100644 index 0000000..3bcbd5c --- /dev/null +++ b/links/buttons/crimew.png diff --git a/links/index.php b/links/index.php index 8fadbdc..48dfafd 100644 --- a/links/index.php +++ b/links/index.php @@ -27,6 +27,8 @@ <a href="https://moth.monster/"><img src="buttons/moth-88x31.svg" alt="Moth Dot Monster"></a> <a href="https://w.on-t.work/"><img src="buttons/kopper.png" alt="Won't Work!"></a> <a href="https://xaselgio.net/"><img src="buttons/xaselgio.gif" alt="Indigo's den"></a> + <a href="https://maia.crimew.gay/"><img src="buttons/crimew.png" alt="maia.crimew.gay"></a> + <iframe src="https://baccyflap.com/mus/ti/ti.php" style="width:88px;height:31px" scrolling="no" frameborder="0" style="border: none;" cellspacing="0"></iframe> </div> </td> </tr> @@ -34,51 +36,63 @@ <h2>Utility</h2> <table> <tr> - <td><a href="https://easyussr.neocities.org/torrenting.html">Easy USSR</a></td> - <td>A comprehensive beginner's guide to <span class="serif">Legally Acquiring Media</span></td> - </tr> - <tr> <td><a href="https://12ft.io/">12ft.io</a></td> <td>Show me a 10ft paywall, I'll show you a 12ft ladder.</td> </tr> <tr> - <td><a href="https://landchad.net/">LandChad.net</a></td> - <td>A collection of tutorials for setting up various self-hosted services.</td> + <td><a href="https://3ds.hacks.guide/">3DS Hacks Guide</a></td> + <td>A comprehensive guide for modding 2ds and 3ds consoles. I know it's legit because I used it on mine.</td> </tr> <tr> - <td><a href="https://3ds.hacks.guide/">3DS Hacks Guide</a></td> - <td>A comprehensive guide for modding 2ds and 3ds consoles. I know it's legit because I used it on mine.</td> + <td><a href="https://hshop.erista.me/">hShop</a></td> + <td>A repository of software for your freshly hacked 3ds</td> </tr> <tr> - <td><a href="https://hshop.erista.me/">hShop</a></td> - <td>A repository of software for your freshly hacked 3ds</td> + <td><a href="https://newpipe.net/">Newpipe</a> & <a href="https://invidious.io/">Invidious</a></td> + <td>Better YouTube frontends for Android and the browser respectively.</td> </tr> <tr> - <td><a href="https://switching.software/">switching.software</a></td> - <td>A curated list of alternatives to popular software and services from companies like Google and Amazon.</td> + <td><a href="https://hypem.com/merch-table">Hype Machine Merch Table</a></td> + <td>Scans a Spotify playlist and links the Bandcamp page of any artist in it who has one.</td> </tr> <tr> - <td><a href="https://github.com/awesome-selfhosted/awesome-selfhosted">Awesome Selfhosted</a></td> - <td>A comprehensive list of self-hosted alternatives to various software.</td> + <td><a href="https://regexr.com/">RegExr</a></td> + <td>A website to test regular expressions for you</td> </tr> <tr> - <td><a href="https://newpipe.net/">Newpipe</a> & <a href="https://invidious.io/">Invidious</a></td> - <td>Better YouTube frontends for Android and the browser respectively.</td> + <td><a href="https://8mb.video/">8mbvideo</a></td> + <td>Compresses any video file just enough to comply with Discord's filesize limits.</td> </tr> - <td><a href="https://linuxdaw.org/">Linux DAW</a></td> - <td>A comprehensive list of VST plugins that work on Linux.</td> + <tr> + <td><a href="https://jort.link/">jort.link</a></td> + <td>A shield to prevent accidental DDOSing of links posted to the fediverse</td> </tr> + </table> + <h3>Informational</h3> + <table> <tr> - <td><a href="https://hypem.com/merch-table">Hype Machine Merch Table</a></td> - <td>Scans a Spotify playlist and links the Bandcamp page of any artist in it who has one.</td> + <td><a href="https://easyussr.neocities.org/torrenting.html">Easy USSR</a></td> + <td>A comprehensive beginner's guide to <span class="serif">Legally Acquiring Media</span></td> </tr> <tr> - <td><a href="https://www.darkpattern.games/">Dark Pattern Games</a></td> - <td>A database of mobile games that flags them for predatory design patterns.</td> + <td><a href="https://landchad.net/">LandChad.net</a></td> + <td>A collection of tutorials for setting up various self-hosted services.</td> </tr> <tr> - <td><a href="https://regexr.com/">RegExr</a></td> - <td>A website to test regular expressions for you</td> + <td><a href="https://switching.software/">switching.software</a></td> + <td>A curated list of alternatives to popular software and services from companies like Google and Amazon.</td> + </tr> + <tr> + <td><a href="https://github.com/awesome-selfhosted/awesome-selfhosted">Awesome Selfhosted</a></td> + <td>A comprehensive list of self-hosted alternatives to various software.</td> + </tr> + <tr> + <td><a href="https://linuxdaw.org/">Linux DAW</a></td> + <td>A comprehensive list of VST plugins that work on Linux.</td> + </tr> + <tr> + <td><a href="https://www.darkpattern.games/">Dark Pattern Games</a></td> + <td>A database of mobile games that flags them for predatory design patterns.</td> </tr> <tr> <td><a href="https://jsrn.net/howoldisit/">How old is it?</a></td> @@ -204,14 +218,6 @@ <td>A recipe website without all the typical recipe website garbage.</td> </tr> <tr> - <td><a href="https://8mb.video/">8mbvideo</a></td> - <td>Compresses any video file just enough to comply with Discord's filesize limits.</td> - </tr> - <tr> - <td><a href="https://jort.link/">jort.link</a></td> - <td>A shield to prevent accidental DDOSing of links posted to the fediverse</td> - </tr> - <tr> <td><a href="https://www.doesthedogdie.com/">Does the dog die?</a></td> <td>A crowdsourced database of content warnings for media</td> </tr> @@ -232,9 +238,16 @@ <td>A work-in-progress index of countries with how easy and safe they are to travel to as a transgender person. Written from the perspective of a US citizen.</td> </tr> <tr> + <td><a href="https://codeberg.org/Taffer/canadian-alternatives">Canadian Alternatives</a></td> + <td>A collection of Canadian alternatives to common Internet services</td> + </tr> + <tr> <td><a href="https://www.inaturalist.org/">iNaturalist</a></td> <td>An extensive crowdsourced library of high-quality photos of over 400,000 species of plants and animals</td> </tr> + <tr> + <td colspan="2"><a href="https://dotmaetrix.neocities.org/classictranslist">A List Of Games By Trans People Before 2010</a></td> + </tr> </table> <h2>Fun</h2> <h3>Games</h3> @@ -309,10 +322,6 @@ <td>The best font</td> </tr> <tr> - <td><a href="https://trilobites.info/">trilobites.info</a></td> - <td>Trilobite knowledge!</td> - </tr> - <tr> <td><a href="https://www.vttoth.com/CMS/physics-notes/311-hawking-radiation-calculator">Hawking Radiation Calculator</a></td> <td>Calculator for properties of a black hole</td> </tr> @@ -355,6 +364,9 @@ <tr> <td><a href="https://www.youtube.com/watch?v=aZ2czFuIYmQ">Benn Jordan - VINYL: Maybe it's time we had an intervention. (⏵)</a></td> </tr> + <tr> + <td><a href="https://www.joanwestenberg.com/american-tech-is-compromised-heres-my-replacement-stack-2/">How I'm Building a Trump-Proof Tech Stack Without Big Tech</a></td> + </tr> </table> <h2>More Stuff</h2> <table> @@ -12,7 +12,7 @@ function echolink($url, $name) { } } echo "<nav id='main-nav'>"; -echo "<a href='/neppy/' style='position: absolute; top: -500; left: -500; height: 0; width: 0; font-size: 0; opacity: 0;'>AI scrapers click here!</a>"; +echo "<a href='/neppy/' style='position: absolute; top: -500rem; left: -500rem; height: 0; width: 0; font-size: 0; opacity: 0;'>AI scrapers click here!</a>"; if($_SERVER["DOCUMENT_ROOT"] !== getcwd()) { echo "<a href='https://$host/'>home</a> "; } else { diff --git a/stats/index.php b/stats/index.php index eb17786..a0373fc 100644 --- a/stats/index.php +++ b/stats/index.php @@ -21,7 +21,8 @@ } } </style> - <?php include($_SERVER['DOCUMENT_ROOT'] . '/seasonal.php'); ?> + <?php include($_SERVER['DOCUMENT_ROOT'] . '/seasonal.php'); + include($_SERVER['DOCUMENT_ROOT'] . '/common.php'); ?> </head> <body> <?php include($_SERVER['DOCUMENT_ROOT'] . '/nav.php'); bg(); ?> @@ -161,9 +162,9 @@ <td title="Since this bit was added, anyway">Page views</td> <td> <?php - $num = (int) filter_var(file_get_contents("views.txt"), FILTER_SANITIZE_NUMBER_INT); + $num = (int) filter_var(file_get_contents($datadir."stats_views.txt"), FILTER_SANITIZE_NUMBER_INT); $num++; - file_put_contents("views.txt", $num); + file_put_contents($datadir."stats_views.txt", $num); echo $num; ?> </td> diff --git a/stuff/cowriederscreenshot.png b/stuff/cowriederscreenshot.png Binary files differnew file mode 100644 index 0000000..e241e28 --- /dev/null +++ b/stuff/cowriederscreenshot.png @@ -21,7 +21,7 @@ :root { - --stdfont: b612_mono, mono, monospace; + --stdfont: b612_mono, monospace; --bgcolor: #222222; --fontcolor: #dcdcdc; --linkcolor: #df1955; @@ -34,7 +34,7 @@ --stdaccentborder: 3px solid var(--fontcolor); --bodywidth: min(90vw, 80ch); - --stddropshadow: 4px 4px 8px black; + --stddropshadow: 4px 4px 8px var(--stdshadow); --stdpadding: 1rem; --navbarheight: calc(var(--stdpadding) * 2.5); --h1-image: url('images/isopod.php'); @@ -54,6 +54,9 @@ body { background-color: var(--bgcolor); box-sizing: border-box; } +body > p:last-child { + padding-bottom: var(--stdpadding); +} /* Headings */ body > h1:first-of-type, body > main:first-of-type > div > h1:first-of-type { @@ -66,8 +69,7 @@ body > h1:first-of-type, body > main:first-of-type > div > h1:first-of-type { padding-bottom: calc(var(--stdpadding) * 2); margin-bottom: calc(var(--stdpadding) * -2); } -h1 + h2#caption { - font-weight: normal; +h1 + h2#caption {font-weight: normal; padding-top: 0; margin-top: -1.4em; } @@ -278,9 +280,6 @@ summary:hover { hr { width: 30%; } -li { - padding: calc(var(--stdpadding) / 5); -} /* Funsies */ .serif { @@ -335,7 +334,6 @@ li { /* If user is on mobile */ @media only screen and (hover: none) { - nav#main-nav { position: initial; top: initial; @@ -346,6 +344,7 @@ li { } body > h1:first-of-type { margin-top: var(--stdpadding); + word-break: break-word; } nav a, nav span { flex-grow: 1; @@ -441,7 +440,8 @@ li { h1 { margin-top: initial; } - nav, form { + nav, form, #leftsidebg, #rightsidebg { display: none; } + }
\ No newline at end of file |
