| Mozz.us Homepage | |
| ________________________________ | |
| / The mozz.us single-page phlog \ | |
| \ "a place to store all my junk" / | |
| -------------------------------- | |
| \ | |
| \ , _ ___.--'''`--''//-,-_--_. | |
| \`"' ` || \\ \ \\/ / // / ,-\\`,_ | |
| /'` \ \ || Y | \|/ / // / - |__ `-, | |
| /@"\ ` \ `\ | | ||/ // | \/ \ `-._`-,_., | |
| / _.-. `.-\,___/\ _/|_/_\_\/|_/ | `-._._) | |
| `-'``/ / | // \__/\__ / \__/ \ | |
| `-' /-\/ | -| \__ \ |-' | | |
| __/\ / _/ \/ __,-' ) ,' _|' | |
| (((__/(((_.' ((___..-'((__,' | |
| -[2019-05-13]-------------------------------------------------------- | |
| I've made several significant additions to my gopherhole over the | |
| past few weeks. I haven't particularly felt like writing a phlog | |
| post, so I've given myself permission to have fun tinkering without | |
| documenting anything. | |
| *shrug* | |
| -[2019-05-01]-------------------------------------------------------- | |
| I've been thinking about making some sort of telnet game/application. | |
| I found this great Python telnet library that I want to use: | |
| shmup/miniboa (github) | |
| But I realized that I don't actually know how the TELNET protocol | |
| works, so I've been slogging through all of the old RFCs. I enjoy | |
| reading the RFC documents for old protocols. They're succinct and | |
| written in clear, precise language. It's such a stark contrast from | |
| the overly verbose papers that are coming out of academia. | |
| -[2019-04-30]-------------------------------------------------------- | |
| Presenting a new gopher applet... | |
| A Random Dad Joke! | |
| (Start preview) | |
| A Random Dad Joke | |
| _________________ | |
| _______________________________________ | |
| / Two fish are in a tank, one turns to \ | |
| | the other and says, "how do you drive | | |
| \ this thing?" / | |
| --------------------------------------- | |
| \ ^__^ | |
| \ (oo)\_______ | |
| (__)\ )\/\ | |
| ||----w | | |
| || || | |
| (refresh the page for a new joke) | |
| Powered by https://icanhazdadjoke.com | |
| (End preview) | |
| This was a fun little 15-minute gopher app that I decided to create | |
| after stumbling upon the following site: | |
| https://icanhazdadjoke.com/ | |
| The Python (3) code was only a few lines long: | |
| ``` | |
| from subprocess import run, PIPE | |
| from unidecode import unidecode | |
| def generate(): | |
| command = 'curl https://icanhazdadjoke.com | cowsay' | |
| resp = run(command, shell=True, stdout=PIPE, encoding='utf-8') | |
| return unidecode(resp.stdout) | |
| ``` | |
| I had to throw the unidecode converter in there because the service | |
| returns those annoying UTF-8 quotation marks and apostrophes. | |
| I briefly considered scraping all of the dad jokes into a local file | |
| so it wasn't depending on making an HTTP request. But then I decided | |
| that I was probably over-thinking it. Maybe I'll come back to this | |
| later if I'm still interested. | |
| -[2019-04-23]-------------------------------------------------------- | |
| I updated the layout of some of the pages on my main gopherhole. | |
| Specifically, I added formatted gopher directories to the top-level | |
| listing pages for file repositories. I wanted to be able to group | |
| similar files and include helpful descriptions, instead of simply | |
| dumping all of the file names to a page. I also added some nifty | |
| ASCII art banners. | |
| - Music Library | |
| - Flash Library | |
| - Qi/Ph Source Code | |
| I can't stop myself from tweaking things. Every time I start browsing | |
| through other sites in the gopherverse, I end up with a bunch of new | |
| ideas for how to display content. Everyone has their own little | |
| personal touches that they add. I still have a lot to learn. | |
| -[2019-04-22]-------------------------------------------------------- | |
| My latest gopher app is live! | |
| Cocktails (Drink Recipe Search Engine) | |
| I'm really happy with how it turned out! The only bug that I've | |
| encountered so far is that the floodgap HTTP-proxy chokes on the | |
| type "7" search query, because the URL contains a "?" character. For | |
| some reason, it URL escapes the "?" character when it shouldn't be... | |
| But that's a small nitpick, everything else works great :) | |
| It's nice to be able to work on a gopher site for a couple of days, | |
| pronounce it as "done", and then move on to something new. This was | |
| the perfect size. I'm going to try to do more projects like this in | |
| the future. Right now I'm thinking about porting some ASCII art over | |
| to gopher. The artist below is who I've gotten like 90 percent of | |
| the art for my sites so far. She's really incredible: | |
| Joan Stark's ASCII Art Gallery | |
| -[2019-04-19]-------------------------------------------------------- | |
| I've been increasingly negative on the prospect of gopher over TLS. | |
| Not from a technical perspective. I added TLS to Flask-Gopher a while | |
| ago and it works just fine. | |
| TLS using FLask-Gopher | |
| Rather, from a perspective of "Why is everyone wasting their time on | |
| this?". I can't think of any good reasons for gopher to *need* TLS | |
| connections. Let's be real here: | |
| 1. Nobody is sending passwords or secure information over search | |
| queries. It's just not a reality in gopher. There are several | |
| non-TLS reasons for this, including gopher's lack of support for | |
| session cookies. | |
| 2. Your ISP is not going MITM your port 70 gopher connection. Yes, | |
| they technically *could* if they wanted to. But there are not ads | |
| on gopher, no commercialization opportunities. There's simply no | |
| financial incentive for them to give a damn about gopher. | |
| 3. Yes, a government agency could spy on your requests. But if you're | |
| being targeted by a nation state (or any sophisticated individual), | |
| you've already lost. No amount of TLS encryption will save you. | |
| -[2019-04-16]-------------------------------------------------------- | |
| I added my library of flash (.swf) files to the mozz.us gopher | |
| homepage. They were already sitting on the server being used by | |
| another webapp, so I figured "why not?". | |
| Flash Library | |
| I want to be careful to avoid turning my gopher server into a dumping | |
| ground for 1000's of random files, just for the sake of it. It feels | |
| messy and pointless. In this case, I'm going to let it slide because | |
| there's some poetic beauty in serving a dead file format (.swf) over | |
| a dead server protocol. | |
| For the same reason, I also want to avoid adding an "external links" | |
| section with links to other gopher holes that I appreciate. There are | |
| already plenty of gopher servers that do a good job aggregating links. | |
| Let's keep mozz focused on serving unique and delightful content. | |
| -[2019-04-15]-------------------------------------------------------- | |
| The past few days, I've been working on a new gopher service that | |
| contains a sortable database to cocktail drink recipes. I was inspired | |
| after seeing a few recipes on gopher and noticing how nice they looked | |
| formatted as ASCII. Basically, I like the A E S T H E T I C. | |
| So first I wrote a scraper to pull recipes from liqour.com | |
| liqour.com | |
| That part was surprisingly easy. The hard part now is building some | |
| kind of menu system in gopher to allow selecting and filtering by tags | |
| like "Difficulty: [Medium]". That's what I'm working on for the moment | |
| whenever I can find the time. | |
| Here's a preview of what the recipes look like formatted. All of the | |
| information is pulled from a sqlite database. | |
| Manhattan Drink Recipe | |
| -[2019-04-15]-------------------------------------------------------- | |
| I keep flip-flopping on how I should format headers on my main page. | |
| The problem is this: I can chose something and it looks great in lynx | |
| because links are highlighted in a different color so they stand out | |
| from the header info lines. But when I test using a different browser, | |
| it becomes hard to read because there's no visual separation between | |
| headers and content. | |
| So, I need to pick a format that meets the following criteria: | |
| - Easily distinguishable on clients that don't use text formatting. | |
| - Gracefully degrades on screens that wrap less than 70 characters. | |
| - Allows the header text to include non-alphanum characters (like | |
| parenthesis) without looking awkward. | |
| Today, I've settled on using a tilde character + uppercase. Tilde is | |
| nice because it's not often used in ASCII for other purposes. | |
| ~ EXAMPLE HEADER | |
| Some example styles that I have been playing around with | |
| I will probably change my mind again tomorrow. | |
| -[2019-04-12]-------------------------------------------------------- | |
| Here's a little rock-paper-scissors app that I made for gopher. I | |
| felt that the quality turned out too low to post it on the main page, | |
| but there's no harm in sharing it here. | |
| Rock Paper Scissors - The Ultimate Game of Strategy | |
| The random token at the end of the URL (e.g "/bfhqK3kH") doesn't | |
| actually represent anything. I only added it for cache-busting on | |
| lynx (otherwise you would always see the same result as the first | |
| time you loaded the page). I really hate doing that because it screws | |
| with the purity of my gopher routes. But a lot of people (including | |
| myself) use lynx. It sort of reminds me of JS hacking to support old | |
| Internet Explorer versions. | |
| Now that I think about it, in the future I might disregard lynx and | |
| settle with putting a disclaimer on the page about browser caching | |
| breaking dynamic applications. | |
| -[2019-04-11]-------------------------------------------------------- | |
| I recently stumbled across this interesting article on formatting: | |
| ASCII Formatting in Gopher Menus | |
| ... | |
| TITLE = Deeply indent, then precede and end phrase with arrows: | |
| ---> Title <--- | |
| HEADING = Left align, then box above and below with equal-signs: | |
| ======= | |
| Heading | |
| ======= | |
| BULLET = Indent, then precede with a dash and a space: | |
| - bullet | |
| SUB-BULLET = Heavily indent, then precede with a tilde and a space: | |
| ~ sub-bullet | |
| BOLD = Type phrase using all capitals: | |
| BOLD | |
| ITALIC = Precede and end phrase with a dash: | |
| -italic- | |
| BOLD/ITALIC = Combine the bold and italic indicators: | |
| -BOLD/ITALIC- | |
| UNDERLINE = Precede and end phrase with a double-quote: | |
| "underline" | |
| HIGHLIGHT = Precede and end phrase with a single-quote: | |
| 'highlight' | |
| ... | |
| Unfortunately I couldn't find the date of when this was published. | |
| It seems to be more-or-less a primitive version of markdown. Using | |
| quotes for underline instead of _underline_ doesn't make any sense | |
| to me. Using arrows for the title is an interesting idea though. I | |
| wonder how many servers back in the 90's settled on a common scheme | |
| for formatting. It's not something that was ever outlined in any of | |
| the RFCs. | |
| In related news, I've started using three periods to divide sections, | |
| kind of like a <div></div> tag. I think it works pretty well. | |
| -[2019-04-10]-------------------------------------------------------- | |
| New Release: Flask-Gopher 2.1.1 | |
| (GitHub) Flask-Gopher 2.1.1 Release Notes | |
| Yesterday I discovered a bug in Flask-Gopher that was causing query | |
| parameters to be chopped off the end of HTTP links. | |
| The link that lead to the discovery | |
| https://kb.wisc.edu/page.php?id=4418 | |
| was redirecting here instead | |
| https://kb.wisc.edu/page.php | |
| Here's the source of the bug: | |
| @app.route('/URL:<path:url>') | |
| def gopher_url_redirect(url): | |
| url = url_quote(url) | |
| return self.URL_REDIRECT_TEMPLATE.format(url=url).strip() | |
| I had assumed that the flask <path:url> regex would capture | |
| everything after the "/URL:". However, flask has special behavior | |
| for query parameters where they get stripped and parsed separately | |
| from the rest of the path. So the ``url`` variable only contained | |
| the base path before the ? character. | |
| This also got me thinking about how the URL string should be escaped | |
| in the HTML redirect page. I was using URL escaping, when I *should* | |
| have been using HTML *escaping*. At least... I think so. | |
| Otherwise you could craft a malicious URL like this | |
| <a>{url}</a> | |
| (turns into) | |
| <a>http://www.google.com/<script>malicious.javascript</script></a> | |
| (Stack Overflow) Difference between URL encode and HTML encode | |
| Here's what I ended up changing it to: | |
| @app.route('/URL:<path:url>') | |
| def gopher_url_redirect(url): | |
| # Use the full_path because it keeps any query params intact | |
| url = request.full_path.split(':', 1)[1] # Drop the "/URL:" | |
| url = url.rstrip('?') # Flask adds an ? even if there are no | |
| url = escape(url) | |
| return self.URL_REDIRECT_TEMPLATE.format(url=url).strip() | |
| -[2019-04-09]-------------------------------------------------------- | |
| Plaintext is beautiful! | |
| ...but is it, really? | |
| I would rather read a LaTeX generated pdf than an ASCII version of | |
| the same document. I would also rather read a Markdown formatted | |
| README.md on Github than a plain text README in a project's root dir. | |
| A little formatting can go a long way towards improving readability. | |
| - headings are nice | |
| - bold / italics / underlines are nice | |
| - hypertext links are nice | |
| I would absolutely love it if there was a link descriptor type in | |
| gopher for markdown formatted text (say, "m"?). There are already | |
| lots of cool tools for converting markdown to ANSI terminal codes. | |
| Terminal Markdown Viewer (Github) | |
| -[2019-04-08]-------------------------------------------------------- | |
| Go ahead, I know, you can't resist asking: "What is Mozz?" | |
| Mozz is a 4-letter domain name that was still available in 2018. | |
| Often short for "mozzarella" (a damn good cheese, in my top 5). | |
| Pronunciation rhymes with "Woz", as in "Steve Woz-niak". | |
| "Mozz in the morning, mozz in the evening, mozz at suppertime. | |
| When mozz is on a bagel, you can eat mozz.us anytime!" | |
| -[2019-04-07]-------------------------------------------------------- | |
| Fuck it, I'm starting a phlog. | |
| I want a place to jot down random observations on gopher and | |
| technology, site updates, and other junk. But I don't want the | |
| pressure of maintaining an active blog and writing long-form | |
| articles. To be honest, I don't actually like writing very much. | |
| This'll work for now. | |
| Don't expect much, and you won't be disappointed. | |
| ps. That kick ass tiger logo was generated with "$ cowsay -f meow" | |
| Wikipedia article on cowsay | |
| --------------------------------------------------------------------- | |
| . . . |