<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"><channel><title>Oh! The Huge Manatee!</title><link>https://ohthehugemanatee.net/</link><description></description><lastBuildDate>Tue, 05 Dec 2023 10:21:00 -0500</lastBuildDate><item><title>Adding Content to This Site</title><link>https://ohthehugemanatee.net/2023/12/adding-content-to-this-site/</link><description>
  &lt;p&gt;
    I don&amp;#39;t add content to this site very often. I should. Part of
    the reason for that is I don&amp;#39;t actually rememember &lt;i&gt;how&lt;/i&gt;
    to get content to appear here.
  &lt;/p&gt;
  &lt;p&gt;
    When I first setup this system up, I had it so that any content
    I checked into &lt;a href="https://github.com/mankyd/othm/"&gt;github&lt;/a&gt;
    would automatically regenerate the site and upload here. At some
    point that system stopped working, and my knowledge of how it
    was all setup atrophied.
  &lt;/p&gt;
  &lt;p&gt;
    I am going to attempt to document my progress of getting it
    working again here. I&amp;#39;ll hopefully be able to use this docunent
    as a reference in the future.
  &lt;/p&gt;
  &lt;h1&gt;2023-12-05 10:26&lt;/h1&gt;
  &lt;p&gt;
    First to specify what I know:
    &lt;ul&gt;
      &lt;li&gt;
        The content is hosted in github at 
        &lt;a href="https://github.com/mankyd/othm/"&gt;https://github.com/mankyd/othm/&lt;/a&gt;
      &lt;/li&gt;
      &lt;li&gt;
        This site, I believe, is hosted on Google Cloud. I can access this by
        visiting
        &lt;a href="https://console.cloud.google.com/"&gt;https://console.cloud.google.com/&lt;/a&gt;.
      &lt;/li&gt;
      &lt;li&gt;
        The "project" is called "Oh the Huge Manatee", has a 
        "Project number" of "448264688868", and a "Project ID" of "gce-othm".
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/p&gt;
  &lt;p&gt;
    Initial clicking around appears to suggest usage of the 
    "Compute Engine API".
  &lt;/p&gt;
  &lt;h1&gt;2023-12-05 10:41&lt;/h1&gt;
  &lt;p&gt;
    I clicked around a bunch and came up empty. Then I remembered that it might
    actually be based on &lt;a href="https://console.firebase.google.com/"&gt;Firebase&lt;/a&gt;
    instead of Google Cloud directly. Clicking through to the console seems to
    confirm this.
  &lt;/p&gt;
  &lt;p&gt;
    I am going to pause here for awhile. I think I need a personal computer with
    command line access to continue.
  &lt;/p&gt;
  &lt;h1&gt;2025-02-12 20:17&lt;/h1&gt;
  &lt;p&gt;
    Whew, it&amp;#39;s been awhile!
  &lt;/p&gt;
  &lt;p&gt;
    The next thing to try was downloading a copy of the site locally. I have a new
    (to me) OSX laptop. I ran "git" but it was not installed. OSX prompted me to
    install it automatically, and I did.
  &lt;/p&gt;
  &lt;p&gt;
    I had to setup an SSH key to actually work on the code. I could have cloned the
    repository with out it, but I won&amp;#39;t be able to push. I started with GitHub&amp;#39;s
    &lt;a href="https://docs.github.com/en/authentication/connecting-to-github-with-ssh/adding-a-new-ssh-key-to-your-github-account"&gt;
    instructions for adding an ssh key to an account.&lt;/a&gt; This, of course, meant
    generating an ssh key first. Thankfully, github has 
    &lt;a href="https://docs.github.com/en/authentication/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent"&gt;
    an article for that&lt;/a&gt; as well.
  &lt;/p&gt;
  &lt;code&gt;
    ssh-keygen -t ed25519 -C "your_email@example.com"
  &lt;/code&gt;
  &lt;p&gt;
    Followed by
  &lt;/p&gt;
  &lt;code&gt;
    eval "$(ssh-agent -s)"
  &lt;/code&gt;
  &lt;p&gt;
    Then adding the following to ~/.ssh/config
  &lt;/p&gt;
  &lt;code&gt;
    Host github.com
      AddKeysToAgent yes
      UseKeychain yes  # omit line if not using a passphrase
      IdentityFile ~/.ssh/id_ed25519
  &lt;/code&gt;
  &lt;p&gt;
    Then
  &lt;/p&gt;
  &lt;code&gt;
    ssh-add --apple-use-keychain ~/.ssh/id_ed25519
  &lt;/code&gt;
  &lt;p&gt;
    And lastly
  &lt;/p&gt;
  &lt;code&gt;
    pbcopy &lt; ~/.ssh/id_ed25519.pub
  &lt;/code&gt;
  &lt;p&gt;
    This last command copied the public key to my clipboard. 
    I could then paste it into the
    &lt;a href="https://github.com/settings/ssh/new"&gt;new ssh key&lt;/a&gt;
    page and save it.
  &lt;/p&gt;
  &lt;p&gt;WHEW!&lt;/p&gt;
  &lt;p&gt;
    I cloned the repository locally, where I am editing it now.
  &lt;/p&gt;
  &lt;p&gt;
    The next step was getting python up and working. This blog is
    generated by &lt;a href="https://getpelican.com/"&gt;Pelican&lt;/a&gt;.
    I am actually a little terrified that new versions of Pelican
    may actually not be backwards compatible, but one thing at a time!
  &lt;/p&gt;
  &lt;p&gt;
    Python does not come installed on OSX by default. Some quick
    googling suggested that &lt;a href="https://brew.sh/"&gt;Homebrew&lt;/a&gt;
    was the best way to install and manage Python these days. I copied
    and pasted the install command at the top of the page:
  &lt;/p&gt;
  &lt;code&gt;
    /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
  &lt;/code&gt;
  &lt;p&gt;
    Always a little terrifying to curl random bash scripts, but I suppose
    it&amp;#39;s no worse than downloading and running any other random, uninspected
    binary.
  &lt;/p&gt;
  &lt;p&gt;
    Next was "brew install python". This installed Python 3.13.2. It did
    not, however, add "python" to the path, only "python3". Documentation
    I found suggested adding 
  &lt;/p&gt;
  &lt;code&gt;
    export PATH="/usr/local/opt/python/libexec/bin:$PATH"
  &lt;/code&gt;
  &lt;p&gt;
    to my "~/.profile" file, but this didn&amp;#39;t work. OSX runs zsh by
    default, so I needed to add it to "~/.zprofile".
  &lt;/p&gt;
  &lt;p&gt;
    Next to setup a virtual environment to run pelican in.
  &lt;/p&gt;
  &lt;code&gt;
    pip install --user pipenv
  &lt;/code&gt;
  &lt;p&gt;
    Homebrew intercepted me here and told me it was an error to do so.
    Instead, it suggested
  &lt;/p&gt;
  &lt;code&gt;
    python3 -m venv path/to/venv
  &lt;/code&gt;
  &lt;h1&gt;2025-02-12 20:51&lt;/h1&gt;
  &lt;p&gt;
    I ran "python3 -m venv ." in my repository but this seems to have
    been a mistake. It edited my ".gitignore" file to ignore 
    everything. I restored ".gitignore" and saw that it had had added
    several files and directories to the repository. Time to try
    something different.
  &lt;/p&gt;
  &lt;p&gt;
    I made a new directory, which will server as my vitual environent,
    and moved my repository in as a subdirectory. I then reran the
    venv command, and everything seems happier now. I ran
  &lt;/p&gt;
  &lt;code&gt;
    . bin/activate
  &lt;/code&gt;
  &lt;p&gt;
    to enter my vitual environment.
  &lt;/p&gt;
  &lt;p&gt;
    Pelican suggests installing it with
  &lt;/p&gt;
  &lt;code&gt;
    python -m pip install "pelican[markdown]"
  &lt;/code&gt;
  &lt;p&gt;
    pip then informed me that I should upgrade it, so I did.
  &lt;/p&gt;
  &lt;p&gt;
    Pelican says to run
  &lt;/p&gt;
  &lt;code&gt;
    pelican -r -l
  &lt;/code&gt;
  &lt;p&gt;
    So I changed to my repositories subdirectory, ran it, and was
    met with a bunch of errors.
  &lt;/p&gt;
  &lt;blockquote&gt;
    [21:03:45] WARNING  Feeds generated without SITEURL set properly may not be valid                                                                                  settings.py:679
           WARNING  No timezone information specified in the settings. Assuming your timezone is UTC for feed generation. Check                                    settings.py:684
                    https://docs.getpelican.com/en/latest/settings.html#TIMEZONE for more information                                                                             
  --- AutoReload Mode: Monitoring `content`, `theme` and `settings` for changes. ---
Feeds generated without SITEURL set properly may not be valid
No timezone information specified in the settings. Assuming your timezone is UTC for feed generation. Check https://docs.getpelican.com/en/latest/settings.html#TIMEZONE for more information
Process Process-1:
Traceback (most recent call last):
  File "/usr/local/Cellar/python@3.13/3.13.2/Frameworks/Python.framework/Versions/3.13/lib/python3.13/multiprocessing/process.py", line 313, in _bootstrap
    self.run()
    ~~~~~~~~^^
  File "/usr/local/Cellar/python@3.13/3.13.2/Frameworks/Python.framework/Versions/3.13/lib/python3.13/multiprocessing/process.py", line 108, in run
    self._target(*self._args, **self._kwargs)
    ~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/dave/devel/othm/lib/python3.13/site-packages/pelican/__init__.py", line 572, in autoreload
    settings_file = os.path.abspath(args.settings)
  File "&lt;frozen posixpath&gt;", line 378, in abspath
TypeError: expected str, bytes or os.PathLike object, not NoneType
Serving site at: http://127.0.0.1:8000 - Tap CTRL-C to stop
  &lt;/blockquote&gt;
  &lt;p&gt;
    The SITEURL and timezone matters I can fix. I am currently unsure
    about the stacktrace however. Visiting the site as it suggests also
    fails.
  &lt;/p&gt;
  &lt;h1&gt;2025-02-15 09:22&lt;/h1&gt;
  &lt;p&gt;
    Back to it, the reason for the above errors is the version of Pelican this
    site was originally compiled with (2? 3?) ran on Python 2, while Pelican 4
    only supports Python 3. I have a choice: install Python 2, and then install
    an old version of Pelican, or just upgrade this site.
  &lt;/p&gt;
  &lt;p&gt;
    Time to upgrade this site!
  &lt;/p&gt;
  &lt;p&gt;
    First, I created a new Pelican site alongside the existing one, just to see
    what&amp;#39;s changed. After creating a new emptry directory, I run 
    "pelican-quickstart" per the instructions, but the command doesn&amp;#39;t work. I
    see the the command exists in my virtual environment&amp;#39;s "bin" directory, but
    that bin is not in my path. I run "../bin/pelican-quickstart" instead.
  &lt;/p&gt;
  &lt;p&gt;
    I followed the on screen prompts with mostly default or obvious values. 
    When I got to the timezone option, it defaulted to "Europe/Rome", which is
    not correct, so I started googling around for the appropriate string
    (something related to us eastern timezone). The first Wikipedia article
    on the &lt;a href="https://en.wikipedia.org/wiki/Eastern_Time_Zone"&gt;Eastern
    Time Zone&lt;/a&gt; does not appear to contain a magic string that looks correctly
    formatted. I am pretty sure I am looking for something like "New York/US" 
    or similar. Next I found &lt;a href="https://time.is/ET"&gt;Time.is&lt;/a&gt; which 
    contains a bunch of "IANA time zone identifiers" which look correct. I
    selected "America/New_York". After a few more questions where I selected
    the defaults, my new site was setup.
  &lt;/p&gt;
  &lt;code&gt;
    pelican content
    pelican --listen
  &lt;/code&gt;
  &lt;p&gt;
    With those two commands, I had a working, if bare, Pelican site. I stopped
    the pelican process.
  &lt;/p&gt;
  &lt;p&gt;
    I copied over the "content" directory of this existing site into the 
    content directory of this temporary site and ran "pelican -l -r". I was
    greeted by many errors, including an apparent infinite loop:
  &lt;/p&gt;
  &lt;blockquote&gt;
Skipping /Users/dave/devel/othm/tmp/content/word-o-matic/index.html: could not find information about &amp;#39;date&amp;#39;
There are 2 items "with slug "2016-in-review"" with lang en: 
/Users/dave/devel/othm/tmp/content/articles/2016/2016_in_review.html
/Users/dave/devel/othm/tmp/content/articles/2022/butterfly.html
There are 2 original (not translated) items with slug "2016-in-review": 
/Users/dave/devel/othm/tmp/content/articles/2016/2016_in_review.html
/Users/dave/devel/othm/tmp/content/articles/2022/butterfly.html
{filename} used for linking to static content /images/2016/parachute-skydiving-parachuting-jumping-38447.jpeg in articles/2016/double_blind_parachute_trial.html. Use {static} instead
Caught exception:
"File /Users/dave/devel/othm/tmp/output/2016-in-review.html is to be overwritten".
Skipping /Users/dave/devel/othm/tmp/content/word-o-matic/index.html: could not find information about &amp;#39;date&amp;#39;
Skipping /Users/dave/devel/othm/tmp/content/word-o-matic/index.html: could not find information about &amp;#39;date&amp;#39;
Skipping /Users/dave/devel/othm/tmp/content/word-o-matic/index.html: could not find information about &amp;#39;date&amp;#39;
Skipping /Users/dave/devel/othm/tmp/content/word-o-matic/index.html: could not find information about &amp;#39;date&amp;#39;
Skipping /Users/dave/devel/othm/tmp/content/word-o-matic/index.html: could not find information about &amp;#39;date&amp;#39;
...
  &lt;/blockquote&gt;
  &lt;p&gt;
    First, I fixed the metadata in butterfly.html, changing the title, keywords, 
    and date. Then I added the time to the the_magical_wordomatic.html, hoping 
    that would resolve the loop. I reran "pelican content" and it appears to have
    worked, outside of a few deprecation warnings. I then ran "pelican -l -r"
    again and it appeared to be working site.
  &lt;/p&gt;
  &lt;p&gt;
    Then I looked over some of the earlier output and realized that I still
    have an error in the_magical_wordomatic.html page:
  &lt;/p&gt;
  &lt;blockquote&gt;
    ERROR    Skipping /Users/dave/devel/othm/tmp/content/word-o-matic/index.html: could not find information about &amp;#39;date&amp;#39; 
  &lt;/blockquote&gt;
  &lt;p&gt;
    &lt;i&gt;Then&lt;/i&gt;I looked closer and realized that all my articles are actually in 
    "content/articles" and that it is trying to parse what it supposed to be a
    static page.
  &lt;/p&gt;
  &lt;p&gt;
    The documentation says that setting "STATIC_PATHS" in "pelicanconf.py"
    should be enough to fix it. I copied over the values from the old version
    of the site, but the error persisted. After a bit of playing around and
    making no progress, I decided to move on. Maybe this was happening because
    my output structure was flat, instead of nested directories as it is
    currently?
  &lt;/p&gt;
  &lt;h1&gt;2025-02-15 11:38&lt;/h1&gt;
  &lt;p&gt;
    I copied and pasted over the ARTICLE_SAVE_AS and ARTICLE_URL
    values from the previous site. This seems to have organize things, but
    still no luck on the word-o-matic.
  &lt;/p&gt;
  &lt;p&gt;
    Finally, I changed "ARTICLE_PATHS" from its default value to 
    "[&amp;#39;articles&amp;#39;]" and this seems to have resolved the issue.
  &lt;/p&gt;
  &lt;p&gt;
    I copied over the "theme" directory next, and blindly set the
    "THEME" property to "theme/othm" as I had in the prioer version and was
    met with a new error: "Encountered unknown tag &amp;#39;assets&amp;#39;.". Some plugin I
    am missing perhaps? I copied over the "plugins" and "pelicanplugins"
    directories, added them to the pelicanconf.py file and...
  &lt;/p&gt;
  &lt;blockquote&gt;
[11:53:21] ERROR    Cannot load plugin `assets`                                                                                                                                              
                    Cannot import plugin `assets`                                                                                                                                                           
           ERROR    Cannot load plugin `gzip_cache`                                                                                                                                          
                    Cannot import plugin `gzip_cache`                                                                                                                                                       
           ERROR    Cannot load plugin `htmlminify`                                                                                                                                           
                    No module named &amp;#39;htmlmin&amp;#39;                                                                                                                                                               
           ERROR    Cannot load plugin `optimize_images`                                                                                                                                      
                    Cannot import plugin `optimize_images`                                                                                                                                                  
           ERROR    Cannot load plugin `summary`                                                                                                                                              
                    Cannot import plugin `summary`                                                                                                                                                          
           ERROR    Cannot load plugin `tag_cloud`                                                                                                                                         
                    Cannot import plugin `tag_cloud`                                                                                                                                                        
  --- AutoReload Mode: Monitoring `content`, `theme` and `settings` for changes. ---
Cannot load plugin `assets`
Cannot import plugin `assets`
Cannot load plugin `gzip_cache`
Cannot import plugin `gzip_cache`
Cannot load plugin `htmlminify`
No module named &amp;#39;htmlmin&amp;#39;
Cannot load plugin `optimize_images`
Cannot import plugin `optimize_images`
Cannot load plugin `summary`
Cannot import plugin `summary`
Cannot load plugin `tag_cloud`
Cannot import plugin `tag_cloud`
Serving site at: http://127.0.0.1:8000 - Tap CTRL-C to stop
Caught exception:
"Encountered unknown tag &amp;#39;assets&amp;#39;.".
  &lt;/blockquote&gt;
  &lt;p&gt;
    I cloned the old
    &lt;a href="https://github.com/getpelican/pelican-plugins"&gt;pelican-plugins&lt;/a&gt; 
    which is evidently deprecated in favor of the newer
    &lt;a href="https://github.com/pelican-plugins"&gt;pelican-plugins github org&lt;/a&gt;.
    I&amp;#39;ll sort that all out later. 
  &lt;/p&gt;
  &lt;p&gt;
    Still, a few plugins were broken: htmlmin, summary, and assets. I disabled
    the htmlmin plugin. Summary asked for the "bs4" package to be installed,
    which I did. Assets needed the "webassets" package.
  &lt;/p&gt;
  &lt;p&gt;
    Now running "pelican content" almost works, save for a new error about
    "cssmin" not being installed. After installing that, things maybe worked, 
    except now I get an error agout "jpegtran" and "optipng" not being installed,
    although the content says it generated succesfully. Loading the site
    in a browser now sort of works, though css appears incorrect. Viewing the
    network traffic does not show any 404 errors. Maybe I inlined the css?
  &lt;/p&gt;
  &lt;h1&gt;2023-12-05 17:29:00&lt;/h1&gt;
  &lt;p&gt;
    Looking at the source for the output site, I indeed saw an empty style
    tag at the top. The theme is expecting some sort of "ASSET_CONTENTS"
    variable to be populated, but I can&amp;#39;t see this documented anywhere in
    the asset&amp;#39;s plugin documentation.
  &lt;/p&gt;
  &lt;p&gt;
    Instead of inlining the content, I uncommented a link tag I had at the
    top and that seems have to restored things. I think I am getting close!
  &lt;/p&gt;
  &lt;p&gt;
    Clicking on tag on the side brings me to a different (though functional)
    url than is live on the site today. I scanned through the difference
    in the settings file and found that TAG_URL and PAGE_URL were set on the
    prior version of the site, so I copied those over. Things seems very
    similar now!
  &lt;/p&gt;
  &lt;p&gt;
    There are only two obvious differences: First, the dates are displaying
    differently on the articles, but I am ok with that. I will probalby
    change it to something different in the future. Second, the new site has
    the front page paginated. I have wanted to do this for awhile, but not
    as it is currently implemented. Setting "DEFAULT_PAGINATION" to false
    fixes this up.
  &lt;/p&gt;
  &lt;p&gt;
    Ok, so I had a newly generated site. I copied it over the old content,
    ran git diff, saw nominal differences, and commited.
  &lt;/p&gt;
  &lt;p&gt;
    But now I still need to push to the server.
  &lt;/p&gt;
  &lt;h1&gt;2025-02-16 13:55&lt;/h1&gt;
  &lt;p&gt;
    I found documentation
    &lt;a href="https://firebase.google.com/docs/hosting/quickstart"&gt;"Get started
      with Firebase Hosting"&lt;/a&gt;. Step 1 is to install the Firebase CLI tools.
    Then I logged in an tested the tooling, ala "firebase login" command.
  &lt;/p&gt;
  &lt;p&gt;
    Inside my git repository, where pelican is actively running, I ran
    "firebase init hosting". I chose an existing project, pointed at
    pelican&amp;#39;s output directory, and left everything else at the defaults.
  &lt;/p&gt;
  &lt;p&gt;
    At this point, if I run "firebase deploy --only hosting", I might have a
    working site? However, I don&amp;#39;s want to deploy over the existing site
    until I have verified that this will all work. There should be a way to
    deploy to a staging/testing location.
  &lt;/p&gt;
  &lt;p&gt;
    Reading the docs, it suggested running "firebase hosting:channel:deploy
    preview". This returned a url with the website hosted. Hooray! However,
    it also fails to render any css. Good thing I didn&amp;#39;t push to prod.
    Opening up the dev console, it appears to be as simple as the fact that
    the css was loaded over http instead of https.
  &lt;/p&gt;
  &lt;p&gt;
    I popped open "pelicanconf.py" and changed the SITE_URL to https. Then
    I noticed the the local development copy of my site was loading the css off
    of the web instead of a local copy of the css. This is wrong.
  &lt;/p&gt;
  &lt;p&gt;
    Uncommenting "RELATIVE_URLS" in pelicanconf.py fixed this up. I will also
    need to be careful to publish with the publishconfi.py file when actually
    pushing to firebase.
  &lt;/p&gt;
  &lt;p&gt;
    One more call to "pelican content -s publishconf.py" followed by another
    call to "firebase hosting:channel:deploy preview" and my site looks ok!
    However...
  &lt;/p&gt;
  &lt;p&gt;
    When I click over to the word-o-matic, the page loads and is functional,
    but if I click any of the "presets", I get a 404. This could just be a
    quirk of the preview domain.
  &lt;/p&gt;
  &lt;p&gt;
    But I did some more digging and discovered url
    &lt;a href="https://firebase.google.com/docs/hosting/full-config#rewrites"&gt;
      rewrites&lt;/a&gt;. I don&amp;#39;t know why I do not have this firebase.json
    file already checked into my git repository, but I am going to now!
    I added the following to my firebase.json:
  &lt;/p&gt;
  &lt;code&gt;
    "rewrites":[ {
      "source": "/word-o-matic/*/",
      "destination": "/word-o-matic/index.html"
    } ]
  &lt;/code&gt;
  &lt;p&gt;
    Partial success. The page now loads, but the json containing the preset
    content returns a 404. Terrifyingly, I can&amp;#39; find those json files
    anywhere in my repo. Where are they?
  &lt;/p&gt;
  &lt;p&gt;
    I downloaded all the json files and added them to the repostiory. Another
    push to firebase and... partial success? For some reason, two of the json
    files are not working. "jabberwork.json" is returning the html for the
    word-o-matic page, and "prescription-drugs.json" is returning a 404.
  &lt;/p&gt;
  &lt;p&gt;
    Even stranger, I fired up firebase&amp;#39;s local emulator and everything works
    fine locally. I deployed a second time to firebase without changing anything
    and... success!
  &lt;/p&gt;
  &lt;p&gt;
    The last, and most suspicious thing is that the current site says it
    contains almost 20 thousand files, while the site I just previewed contains
    only 370 files. I suspect this is because I used to allow folks to upload
    and save custom content in the word-o-matic, and I maintained that old
    content even after I disabled that functionality. I have no straightforward
    way of recovering that content at the moment, but it may simply be time to
    say goodbye to it. It is possible that that content continues to reside on
    the hard disk of another computer that is not currently hooked up, but that
    is a problem for another day.
  &lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dave Mankoff</dc:creator><pubDate>Tue, 05 Dec 2023 10:21:00 -0500</pubDate><guid isPermaLink="false">tag:ohthehugemanatee.net,2023-12-05:/2023/12/adding-content-to-this-site/</guid><category>misc</category><category>uplload</category></item><item><title>Butterfly</title><link>https://ohthehugemanatee.net/2022/05/butterfly/</link><description>
  &lt;p&gt;
    Yesterday, I watched my two young children and their friend stalk a yellow
    butterfly across a field of grass. They perfectly sneaked, revealed themselves,
    and gave chase again to the insect as it was carried haphazardly by the wind.
  &lt;/p&gt;
  &lt;p&gt;
    I watched the triplicate from some distance off, wishing I could bottle this
    moment to not just replay, but relive. This perfect moment that the children
    were experiencing without thought or introspection; without the need to assign
    value to it or compare with memory. They saw a butterfly and they gave pursuit.
  &lt;/p&gt;
  &lt;p&gt;
    And I watched, wishing I could give them more.
  &lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dave Mankoff</dc:creator><pubDate>Mon, 09 May 2022 17:58:00 -0400</pubDate><guid isPermaLink="false">tag:ohthehugemanatee.net,2022-05-09:/2022/05/butterfly/</guid><category>misc</category><category>Children</category><category>Kids</category></item><item><title>How to Scare People for 10,000 Years</title><link>https://ohthehugemanatee.net/2018/04/how-to-scare-people-for-10000-years/</link><description>
&lt;p&gt;
    In 1993, Sandia National Labs published a document that contained the
    following words:
  &lt;/p&gt;
&lt;blockquote&gt;&lt;pre&gt;
The danger is still present, in your time, as
it was in ours.

The danger is to the body, and it can kill.

The form of the danger is an emanation
of energy.&lt;/pre&gt;&lt;/blockquote&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dave Mankoff</dc:creator><pubDate>Sat, 07 Apr 2018 10:47:00 -0400</pubDate><guid isPermaLink="false">tag:ohthehugemanatee.net,2018-04-07:/2018/04/how-to-scare-people-for-10000-years/</guid><category>misc</category><category>misc</category></item><item><title>The Second Amendment</title><link>https://ohthehugemanatee.net/2017/10/the-second-amendment/</link><description>
    &lt;p&gt;
      Agency will always lie with the prime actors in any violent event. I continue support
      providing the mental and societal support systems needed to help would-be criminals find the
      help they need.
    &lt;/p&gt;
    &lt;p&gt;
      However, in the absence of any political, practical, moral, or ethical system for eradicating
      violent tendencies, we also must look to mitigate the ease and impact of such acts.
      &lt;a href="http://www.cnn.com/2017/10/02/us/las-vegas-shooting-live/index.html" title="" las vegas shooting: live updates&amp;quot;&amp;quot;&gt;Stephen Paddock killed or maimed over 450
      people&lt;/a&gt; at last count. To suggest that we ignore the implements with which this act took
      place is willful denial.
    &lt;/p&gt;
    &lt;p&gt;
      Guns are instruments of deprivation. They act to deprive life, liberty, and freedom from those
      they are turned against. They are the antithesis of American ideals and of fundamental human
      rights. This can not stand.
    &lt;/p&gt;
    &lt;p&gt;
      Guns make irrevocable, unchallenged decisions for their wielder. As an aggressor, a shooter
      kills the innocent. As a defender, a shooter's hasty, error-prone decisions are made
      permanent.
    &lt;/p&gt;
    &lt;p&gt;
      They are a threat to myself, my children, my family, and everyone that I love and care about.
      There is no defense against a fired bullet. No amount of hope and prayer will bring them back
      to me as I hold their body in my arms.
    &lt;/p&gt;
    &lt;p&gt;
      And, NO, I will not count their lives as the cost of liberty. Death is not freedom.
    &lt;/p&gt;
    &lt;p&gt;
      End the Second Amendment. End gun ownership.
    &lt;/p&gt;
    &lt;p&gt;
      (&lt;i&gt;Adapted from a
      &lt;a href="https://fb.com/dave.mankoff/posts/10100735202759746?notif_id=1506954620297438"&gt;public 
      social media post&lt;/a&gt; that I made.&lt;/i&gt;)
    &lt;/p&gt;
  </description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dave Mankoff</dc:creator><pubDate>Mon, 02 Oct 2017 10:41:00 -0400</pubDate><guid isPermaLink="false">tag:ohthehugemanatee.net,2017-10-02:/2017/10/the-second-amendment/</guid><category>freedom</category><category>guns</category><category>rights</category><category>freedom</category></item><item><title>Life RPG</title><link>https://ohthehugemanatee.net/2017/09/life-rpg/</link><description>
    &lt;p&gt;
      I've been playing with a new app on my phone recently,
      &lt;a href="https://play.google.com/store/apps/details?id=com.jayvant.liferpgmissions" title="Life RPG"&gt;Life RPG&lt;/a&gt;,
      It let's you create tasks (what they call missions) that you need or want to accomplish in
      your real life, such as doing the dishes, reading a book, practicing the sousaphone, etc.
      and assign to them virtual points based on their "difficulty", "urgency", and "fear". As
      you complete the tasks, you earn the points which are counted towards a virtual leveling system,
    &lt;/p&gt;
    &lt;p&gt;
      In addition, "skills" can be assigned to the tasks, so that you can see yourself progressing
      in various skills in your real life, a la The Sims. You can practice cooking, learn to draw,
      or study Sanskrit and see your progress in each of the areas recorded down with some concrete,
      if artificial value,
    &lt;/p&gt;
    &lt;p&gt;
      Tasks can also be assigned a duration (e.g. go to the gym for one hour), a frequency
      (e.g. do your laundry once a week), and a due date (e.g. file your taxes by April).
    &lt;/p&gt;
    &lt;p&gt;
      Perhaps the most interesting feature, however, are the separate reward points that you
      can tack onto each mission. They appear as little gems in the app. Make going to the gym
      worth 1 gem, Make finishing a long book 10 gems,
    &lt;/p&gt;
    &lt;p&gt;
      You can then take these virtual gems and redeem them for rewards that you create in the app.
      5 gems might mean you get some ice cream. (5 trips the gym equals ice cream, yay!) Rewards
      can also be limited in supply. Got some new gadget or toy you want to buy? Give it a high
      reward point cost and save up for it!
    &lt;/p&gt;
    &lt;p&gt;
      I just started using this app and am slowly filling in missions and rewards and finding the
      right balance in everything. I am generally ignoring the leveling and skill portions of the
      app. It is the reward points that I find intriguing. I like that it introduces an artificial
      restraint and economy on my splurges. I no longer go and simply &lt;i&gt;indulge&lt;/i&gt; my impulses
      but instead mete them out more gradually. And if I want to save up for an something expensive,
      (I've been eyeing a table saw), I give it a high reward point cost and must excercise
      restraint over a longer period of time before I can justify it.'
    &lt;/p&gt;
    &lt;p&gt;
      In the end, it doesn't appear to be a perfect solution for what I'm looking for, it has
      many superfluous features, but I am hoping it puts me on a good habit building path.
      Perhaps something better out there already exists, If so, let me know!'
    &lt;/p&gt;
  </description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dave Mankoff</dc:creator><pubDate>Wed, 27 Sep 2017 21:00:00 -0400</pubDate><guid isPermaLink="false">tag:ohthehugemanatee.net,2017-09-27:/2017/09/life-rpg/</guid><category>app</category><category>todo</category><category>app</category><category>organization</category></item><item><title>Parachute Use Lacks Proper Double Blind Study</title><link>https://ohthehugemanatee.net/2016/12/parachute-use-lacks-proper-double-blind-study/</link><description>
    &lt;p&gt;
      &lt;img src="https://ohthehugemanatee.net/images/2016/parachute-skydiving-parachuting-jumping-38447.jpeg" alt="Bombs away!" width="100%" /&gt;
    &lt;/p&gt;
    &lt;p&gt;
      It turns out that, as of 2003,
      &lt;a href="http://www.bmj.com/content/327/7429/1459" title="Parachute use to prevent death and major trauma related to gravitational challenge: systematic review of randomised controlled trials"&gt;
      no proper double blind study of parachute use has been conducted&lt;/a&gt;. That
      is to say that science doesn't technically have the most firm evidence that
      parachutes work.
    &lt;/p&gt;
    &lt;p&gt;
      This observation is, of course, made in jest.
    &lt;/p&gt;
    &lt;blockquote&gt;Advocates of evidence based medicine have criticised the
    adoption of interventions evaluated by using only observational data. We
    think that everyone might benefit if the most radical protagonists of
    evidence based medicine organised and participated in a double blind,
    randomised, placebo controlled, crossover trial of the parachute.&lt;/blockquote&gt;
    &lt;p&gt;
      One of the people in the photo above is going to have a bad day. I think I
      shall cite this study more often.
    &lt;/p&gt;
  </description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dave Mankoff</dc:creator><pubDate>Wed, 28 Dec 2016 12:50:00 -0500</pubDate><guid isPermaLink="false">tag:ohthehugemanatee.net,2016-12-28:/2016/12/parachute-use-lacks-proper-double-blind-study/</guid><category>science</category><category>parachute</category><category>science</category><category>study</category><category>parody</category></item><item><title>2016 In Review</title><link>https://ohthehugemanatee.net/2016/12/2016-in-review/</link><description>
  &lt;p&gt;
    I said "Fuck 2016" for the first time last night and immediately regretted it.
    All the springs had popped out of a lock I was re-keying, and minuscule drive
    pins were lost to the floor. Earlier I'd been down in my basement making my
    hands coarse and dry working with fiberglass insulation. I was tired,
    uncomfortable, and frustrated; and there I was blaming a calendar.
   &lt;/p&gt;
  &lt;p&gt;
    2016 doesn't suck. 2016 is what we made of it, and 2017 isn't going to be
    magically better simply because the tick of a clock rolls over to the next
    year.
  &lt;/p&gt;
  &lt;p&gt;
    In 2017, celebrities are going to die. Politicians are going to make short
    sighted, selfish decisions. Humans will do _vile_ things to one another in
    the name of their god, their patriotism, and their culture.
  &lt;/p&gt;
  &lt;p&gt;
    So you know what I did? I got down on my hands and knees and found the
    damned pins. I researched how to reassemble a mechanism that was not
    designed to be disassembled. I got out tape, toothpicks, and tweezers, and I
    fixed the fucking lock.
  &lt;/p&gt;
  &lt;p&gt;
    If you want 2017 to be awesome, then make it awesome. If there's a problem,
    fix it. Mourn the bad but don't let it get ahead of you.
  &lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dave Mankoff</dc:creator><pubDate>Wed, 21 Dec 2016 10:47:00 -0500</pubDate><guid isPermaLink="false">tag:ohthehugemanatee.net,2016-12-21:/2016/12/2016-in-review/</guid><category>misc</category><category>2016</category><category>year in review</category></item><item><title>Space Ghost Coast to Coast, 20 Years On</title><link>https://ohthehugemanatee.net/2016/12/space-ghost-coast-to-coast-20-years-on/</link><description>
    &lt;p&gt;
      &lt;img src="https://ohthehugemanatee.net/images/space_ghost.jpeg" alt="Space Ghost Coast to Coast" width="100%" /&gt;
    &lt;/p&gt;
    &lt;blockquote&gt;Twenty years ago [...] Space Ghost Coast to Coast [...] would
      completely reshape Cartoon Network in its image, spawning the entirety
      of Adult Swim and inspiring a new generation of surreal humorists.&lt;/blockquote&gt;
    &lt;p&gt;
      &lt;a href="http://www.blastr.com/2014-6-19/transmissions-ghost-planet-definitive-history-space-ghost-coast-coast" title="Transmissions From the Ghost Planet: A definitive history of Space Ghost Coast to Coast"&gt;
      Transmissions From the Ghost Planet: A definitive history of Space Ghost Coast to Coast&lt;/a&gt;.
    &lt;/p&gt;
  </description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dave Mankoff</dc:creator><pubDate>Thu, 15 Dec 2016 10:12:00 -0500</pubDate><guid isPermaLink="false">tag:ohthehugemanatee.net,2016-12-15:/2016/12/space-ghost-coast-to-coast-20-years-on/</guid><category>tv</category><category>cartoons</category><category>space ghost</category><category>television</category></item><item><title>Picture of a Dead Man</title><link>https://ohthehugemanatee.net/2016/05/picture-of-a-dead-man/</link><description>
    &lt;p&gt;
      There is a picture of a dead man on my wall. He was not dead when the
      picture was taken. He was sitting near me as we both smiled happily,
      awkwardly, in ways that only teenagers can.
    &lt;/p&gt;
    &lt;p&gt;
      I am not a teenager anymore. Age has grown through and over my body, though
      I am not old. Not yet.
    &lt;/p&gt;
    &lt;p&gt;
      As the living become the dead, I feel the weight of their memory as a scar
      upon my past where once there was levity. Two of my classmates have passed
      in as many days; three in as many months; more when I count the years.
    &lt;/p&gt;
    &lt;p&gt;
      The picture on the wall contains many friends. The rest of us are quite
      alive and my buoyancy remains, but the weight does not get lighter. Rather,
      I must find new strength to carry the weight, to lift it off the earth so
      that it does not drag.
    &lt;/p&gt;
    &lt;p&gt;
      This may be what metaphorically makes you stronger, but, for today, the new
      burdens leave me tired.
    &lt;/p&gt;
    &lt;p&gt;
      Rest in peace, Matthew and Jake.
    &lt;/p&gt;
  </description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dave Mankoff</dc:creator><pubDate>Sun, 29 May 2016 21:15:00 -0400</pubDate><guid isPermaLink="false">tag:ohthehugemanatee.net,2016-05-29:/2016/05/picture-of-a-dead-man/</guid><category>misc</category><category>death</category><category>friends</category></item><item><title>Golly What a Day</title><link>https://ohthehugemanatee.net/2015/02/golly-what-a-day/</link><description>
  &lt;iframe width="560" height="315" src="https://www.youtube.com/embed/QLhYSw67pdg?si=NjET24LncVmeWH3I" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen&gt;&lt;/iframe&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dave Mankoff</dc:creator><pubDate>Wed, 25 Feb 2015 12:56:00 -0500</pubDate><guid isPermaLink="false">tag:ohthehugemanatee.net,2015-02-25:/2015/02/golly-what-a-day/</guid><category>misc</category><category>videos</category><category>songs</category><category>misc</category></item><item><title>I Stopped a Fight Today</title><link>https://ohthehugemanatee.net/2015/02/i-stopped-a-fight-today/</link><description>
&lt;p&gt;
    I stopped a fight today. I was on my way from work, at the
    &lt;a href="http://www.mbta.com/schedules_and_maps/subway/lines/stations/?stopId=11471&amp;amp;lat=42.355453&amp;amp;lng=-71.060465" title="Downtown Crossing"&gt;Downtown Crossing T stop&lt;/a&gt;, getting on the
    orange line.
  &lt;/p&gt;
&lt;p&gt;
    It was crowded and the train in the station was too full for the entirety of
    the would-be passengers to get on. I was following behind a woman who had a
    suitcase in tow. She appeared to be in a frustrated hurry, as she was 
    making her way haphazardly through the crowd.
  &lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dave Mankoff</dc:creator><pubDate>Fri, 06 Feb 2015 19:46:00 -0500</pubDate><guid isPermaLink="false">tag:ohthehugemanatee.net,2015-02-06:/2015/02/i-stopped-a-fight-today/</guid><category>misc</category><category>misc</category></item><item><title>Comprise</title><link>https://ohthehugemanatee.net/2015/02/comprise/</link><description>
  &lt;p&gt;
    I learned
    &lt;a href="https://en.wikipedia.org/wiki/User:Giraffedata/comprised_of"&gt;a new
    fact&lt;/a&gt; today. In place of the phrase "is comprised of", one should
    generally use the phrase "is composed of". Thus, the following is
    grammatically incorrect:
  &lt;/p&gt;
  &lt;blockquote&gt;
    The United States of America is comprised of 50 states.
  &lt;/blockquote&gt;
  &lt;p&gt;
    When people use "is comprised of", they usually mean more plainly
    "comprises". This would be more grammatical and in line with the meaning of
    "comprise" &amp;mdash; "includes":
  &lt;/p&gt;
  &lt;blockquote&gt;
    The United States of America comprises 50 states.
  &lt;/blockquote&gt;
  &lt;p&gt;
    There is actually a relatively simple rule to distinguish this: "The whole
    comprises the parts; the parts compose the whole."
  &lt;/p&gt;
  &lt;p&gt;
    However, the word "comprise" actually goes a step further. To use the word
    "comprise" emphasizes that the statement is &lt;em&gt;all inclusive&lt;/em&gt; thus the
    following would be the most correct:
  &lt;/p&gt;
  &lt;blockquote&gt;
    The United States of America comprises 50 states, a federal district, and 
    multiple territories.
  &lt;/blockquote&gt;
  &lt;p&gt;
    Hat tip to Andrew McMillen for the
    &lt;a href="https://medium.com/backchannel/meet-the-ultimate-wikignome-10508842caad"&gt;
      article&lt;/a&gt; which put me on to this rule.
  &lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dave Mankoff</dc:creator><pubDate>Tue, 03 Feb 2015 12:01:00 -0500</pubDate><guid isPermaLink="false">tag:ohthehugemanatee.net,2015-02-03:/2015/02/comprise/</guid><category>misc</category><category>grammar</category><category>wikipedia</category></item><item><title>Hookback</title><link>https://ohthehugemanatee.net/2015/01/hookback/</link><description>
  &lt;p&gt;
    I released a new piece of software the other day, 
    &lt;a href="https://github.com/mankyd/hookback" title="Hookback"&gt;Hookback&lt;/a&gt;.
    It's purpose it to receive and handle webhook callback's from GitHub. I've
    seen several other projets that aim to do this, but they often seem 
    inflexible or difficult to set up. Hookback aims to be dead simple.
  &lt;/p&gt;
  &lt;p&gt;
    You tell it what events to listen for on what repositories, and then you
    give it a command to run for those events. That's it. It can run those
    commands synchronousely and respond back to GitHub with the output, or it
    can run them in the background, so that long running commands to block the
    request.
  &lt;/p&gt;
  &lt;p&gt;
    As an example, I am now using Hookback to power this site. This site is
    &lt;a href="https://github.com/mankyd/othm" title="Oh The Huge Manatee"&gt;
      published on GitHub&lt;/a&gt;, and when I commit and push new content to the
    repository, GitHub notifies this server. The server then runs the commands
    necessary to recompile and publish the new content on the site. It makes it
    very easy to get new content posted.
  &lt;/p&gt;
  &lt;p&gt;
    It's my first real project written in
    &lt;a href="http://golang.org/" title="Go"&gt;Go&lt;/a&gt; and I am really enjoying it.
    It took awhile to find a groove with the syntax, but it's a real pleasure to
    use now. I am already scheming for what's next.
  &lt;/p&gt;
  &lt;p&gt;
    Feel free to let me know if you have any questions or features requests
    for Hookback. I aim to keep it simple, but that's not to say there isn't
    room for improvement.
  &lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dave Mankoff</dc:creator><pubDate>Sat, 24 Jan 2015 20:01:00 -0500</pubDate><guid isPermaLink="false">tag:ohthehugemanatee.net,2015-01-24:/2015/01/hookback/</guid><category>programming</category><category>github</category><category>programming</category><category>golang</category></item><item><title>The Internship &amp; Google</title><link>https://ohthehugemanatee.net/2013/06/the-internship-google/</link><description>
  &lt;p&gt;
    I just returned from a company outing to see "The Internship". I had set my
    expectations kind of low, but was pleasantly surprised. It's not 
    &lt;i&gt;great&lt;/i&gt; per se but is cute. Working for the company portrayed in the 
    movie, they give a pretty good recreation of the campus and the company 
    backdrop. But I take issue with the one thing that they get very, 
    &lt;i&gt;very&lt;/i&gt; wrong about Google: the people.
  &lt;/p&gt;
  &lt;p&gt;
    In the movie, work hours are long, the people are straight-up mean, and the
    corporate culture is cut throat. The interns are told that their Summer 
    program is a little more than a competition, a "mental Hunger Games" as 
    they call it. 95% of them will not be given jobs. Unfortunately, (in the
    movie) this turns out to be exactly the case - the protagonists and their
    team end up employed but at the expense of the hundred or so other bright
    and capable interns.
  &lt;/p&gt;
  &lt;p&gt;
    The full-time employees are don't fair much better in the script writer's
    hands. The two shown most frequently are rude, over-worked, and generally
    mean-spirited people. The term "googley" is bandied about, but those that 
    use it are laughed at and derided.
  &lt;/p&gt;
  &lt;p&gt;
    This runs exactly contrary to everything that I've experienced in my time
    at Google. Google is full of incredible people, kind people, and thoughtful
    people. I had never worked at a place before this where each person that I
    meet is universally generous and outgoing. While there are some jokes about
    the word "googley", no one would deny that it is a positive attribute and
    something that they would like ascribed to themselves.
  &lt;/p&gt;
  &lt;p&gt;
    Are my coworkers at Google smart? Yes, but they aren't braggarts. Do they
    work hard? Yes, but not a the expense of their own well being. Are
    expectations here high? Yes, but they're not unreasonable. Google
    accomplishes great things not by virtue of fostering a hostile environment.
    Google accomplishes great things by employing great people and encouraging
    them to succeed.
  &lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dave Mankoff</dc:creator><pubDate>Fri, 07 Jun 2013 16:48:00 -0400</pubDate><guid isPermaLink="false">tag:ohthehugemanatee.net,2013-06-07:/2013/06/the-internship-google/</guid><category>google</category><category>google</category><category>movies</category></item><item><title>Teach Girls To Be More Like Boys? You're Making It Worse.</title><link>https://ohthehugemanatee.net/2013/04/teach-girls-to-be-more-like-boys-youre-making-it-worse/</link><description>
  &lt;p&gt;
    An 
    &lt;a href="http://www.cnn.com/2013/04/30/opinion/simmons-girls-leadership/index.html" title="Teach Girls To Be More Like Boys"&gt;
      article on CNN&lt;/a&gt; today gets gender bias issues rather ironically wrong.
    My wife and I were talking about this topic the other day. She would take
    issue with the title of this editorial, I believe. Not because the goal is
    wrong, but rather because the framing presented at the very outset is
    inherently gender biased. I would tend to agree with her.
  &lt;/p&gt;
  &lt;p&gt;
    My own suggestion, in our earlier conversation, was that, rather than 
    teaching "girls to be more like boys" our efforts might be better focused
    on making masculine traits less male. That is to say, as long as we
    characterize positive external traits (confidence, assertiveness, etc) as
    being masculine traits, they will continue to be dominated by males.
  &lt;p&gt;
    If we're going to encourage young women to take on these traits, we need to
    make them gender-neutral, universally &lt;i&gt;acceptable&lt;/i&gt; traits. I am not
    suggesting that we rename them or some other superficial, token gesture. I
    am simply pointing out that, when we want a woman to succeed, we can't 
    simply say to her "be more like a man". We need to say "be strong; be 
    confident", without the pretenses of taking on masculine qualities.
  &lt;/p&gt;
  &lt;p&gt;
    In the interest of full disclosure, I should add that I am a graduate of
    the high school mentioned in the article.
  &lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dave Mankoff</dc:creator><pubDate>Tue, 30 Apr 2013 13:32:00 -0400</pubDate><guid isPermaLink="false">tag:ohthehugemanatee.net,2013-04-30:/2013/04/teach-girls-to-be-more-like-boys-youre-making-it-worse/</guid><category>gender</category><category>gender</category></item><item><title>Tomato's Final Form</title><link>https://ohthehugemanatee.net/2013/02/tomatos-final-form/</link><description>
  &lt;p&gt;
    In my article the other day about the
    &lt;a href="https://ohthehugemanatee.net/2013/02/canned-tomatoes/"&gt;states of matter of
      canned tomatoes&lt;/a&gt;, I forgot to mention one disgustingly horrible form
    of canned tomatoes that one used to be able to find:
    &lt;a href="https://www.google.com/search?q=tomato+aspic&amp;amp;tbm=isch"&gt;Tomato
      Aspic&lt;/a&gt;. Thankfully, in canned form, tomato aspic is largely
    unavailable these days I hope that it remains that way. (Full disclosure:
    my great grandmother forced me to eat tomato aspic with just about every
    meal when I visited her. I had never though jello could make me gag so
    quickly.)
  &lt;/p&gt;
  &lt;p&gt;
    For those not in the know,
    &lt;a href="http://en.wikipedia.org/wiki/Aspic"&gt;aspic&lt;/a&gt; is a form of savory 
    gelatin. Think of it as salty jello with a hint of sour. It is vile stuff.
    The Wikipedia page on aspic prominently features a gelatin with both chicken
    and hardboiled eggs suspended within it. It was commonly used as a method to
    preserve food.
  &lt;/p&gt;
  &lt;p&gt;
    Tomato aspic takes the worst part of savory jello and combines it with raw 
    tomato purée. It was a bad idea when someone thought it up and it remains
    a bad idea to this day. Just take a look at this loaf of congeled tomato
    sauce:
  &lt;/p&gt;
  &lt;p class="media"&gt;
    &lt;img src="https://ohthehugemanatee.net/images/2013/02/tomato-roll.jpg" /&gt;
  &lt;/p&gt;
  &lt;p&gt;
    Thankfully, the days of ambiguous matter-state tomato were largely left
    behind at the end of the 1950's. For those looking for some vintage tomato
    recipes, however, here's a delightful layered tomato aspic conconction
    courtesy of Wrigley's Spearmint Chewing Gum. Ingredients include onion,
    celery, cucumber, cottage cheese, green pepper, and of course, tomato sauce
    and gelatin. I am not sure why a chewing gum company used this as an 
    advertisement but perhaps it was because of the &lt;i&gt;awful&lt;/i&gt; breath that 
    you'd be left with after biting into this abomination:
  &lt;/p&gt;
  &lt;p class="media"&gt;
    &lt;img src="https://ohthehugemanatee.net/images/2013/02/tomato-recipe.jpg" /&gt;
  &lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dave Mankoff</dc:creator><pubDate>Wed, 27 Feb 2013 12:11:00 -0500</pubDate><guid isPermaLink="false">tag:ohthehugemanatee.net,2013-02-27:/2013/02/tomatos-final-form/</guid><category>food</category><category>food</category></item><item><title>Canned Tomatoes</title><link>https://ohthehugemanatee.net/2013/02/canned-tomatoes/</link><description>
  &lt;p&gt;
    There are a lot of canned tomato products. I mean, seriously, it's a little
    silly. Last night, while grocery shopping with my wife, I was asked to
    retrieve a cans of diced tomatoes, tomato purée, and tomato sauce. While 
    searching through the mulitudes of sizes and flavors, I absent mindedly
    swapped purée for paste and grabbed the wrong can.
  &lt;/p&gt;
  &lt;p&gt;
    What took me back as I was searching was just how little I understood about
    canned tomato products and why they exist in such variety. So I decided to
    do some investigation: what types of canned tomatoes can one find in a 
    typical American grocery store and what are they used for.
  &lt;/p&gt;
  &lt;h3&gt;Whole Tomatoes&lt;/h3&gt;
  &lt;img src="https://ohthehugemanatee.net/images/2013/02/whole_tomatoes.jpg" style="float: left; margin: 0 20px 20px 0; width: 160px;" /&gt;
  &lt;p&gt;
    Starting from the largest and working our way down, we have whole tomatoes, 
    both peeled and unpeeled. Peeled tomatoes are the most common variant and
    are made by first
    &lt;a href="http://www.foodinjars.com/2009/09/canning-whole-peeled-tomatoes/"&gt;
      briefly boiling them&lt;/a&gt; to make the skin looser, removing the skin, and
    then placing them into a jar or can. While not particularly appetizing by 
    themselves, they're easily turned into other "states" of tomato. Some 
    sources that I have found suggest that canned, whole tomatoes are of a 
    higher quality than other, more processed varieties, with the manufacturers
    sending dud tomatoes off to be chopped up.
  &lt;/p&gt;
  &lt;h3&gt;Stewed Tomatoes&lt;/h3&gt;
  &lt;img src="https://ohthehugemanatee.net/images/2013/02/stewed_tomatoes.jpg" style="float: right; margin: 0 0 20px 20px; width: 160px;" /&gt;
  &lt;p&gt;
    A variant of whole tomatoes, stewed tomatoes have been cooked &amp;mdash; boiled
    longer than a typical whole tomato. This releases the flavor and makes them
    more suitable for adding to many recipes. Of course, it's easy enough to 
    cook whole tomatoes, especially if the dish you'll be adding them to will
    be cooking further anyways. It is common to find stewed tomatoes with added
    ingredients and seasoning.
  &lt;/p&gt;
  &lt;h3&gt;Diced Tomatoes&lt;/h3&gt;
  &lt;img src="https://ohthehugemanatee.net/images/2013/02/diced_tomatoes.jpg" style="float: left; margin: 0 20px 20px 0; width: 160px;" /&gt;
  &lt;p&gt;
    Diced (or chopped) tomatoes save some of the labor involved with working
    with whole tomatoes. Fairly self explanatory, they work well in salsas and
    sauces where you want full pieces of tomato. On the grocery store shelf, I
    found plain old diced and petite diced, as well as a myriad of flavor
    additives such as garlic, pepper, and oregano. 
    &lt;a href="http://www.hunts.com/products/tomatoes/diced-tomatoes"&gt;Hunt's 
      website&lt;/a&gt; lists no less than &lt;em&gt;14&lt;/em&gt; different varieties. Yes, you
    read than correctly, one-four - fourteen.
  &lt;h3&gt;Crushed Tomatoes&lt;/h3&gt; 
  &lt;img src="https://ohthehugemanatee.net/images/2013/02/crushed_tomatoes.jpg" style="float: right; margin: 0 0 20px 20px; width: 160px;" /&gt;
  &lt;p&gt;
    Take your canned tomatoes and mash them up. Boom, crushed tomatoes!
    Typically, crushed tomatoes will be run through a strainer to remove seeds
    and other large chunks. They're great for sauces and chilis where you're
    looking and some of the texture of tomatoes without the chunks.
  &lt;/p&gt;
  &lt;h3&gt;Tomato Purée&lt;/h3&gt;
  &lt;img src="https://ohthehugemanatee.net/images/2013/02/tomato_puree.jpg" style="float: left; margin: 0 20px 20px 0; width: 160px;" /&gt;
  &lt;p&gt;
    Crushed tomatoes still too chunky for you? Try purée. Take the same, whole
    tomatoes but blend them instead of just crushing them. You'll still need to
    strain them to get the seeds and other large chunks out. This is what foods
    like pizza sauce and ketchup start as.
  &lt;/p&gt;
  &lt;h3&gt;Tomato Sauce&lt;/h3&gt;
  &lt;img src="https://ohthehugemanatee.net/images/2013/02/tomato_sauce.jpg" style="float: right; margin: 0 0 20px 20px; width: 160px;" /&gt;
  &lt;p&gt;
    So far as I can tell, tomato sauce is to tomato purée as stewed tomatoes are
    to whole tomatoes. It's been both liquified and then cooked. It will often
    have seasonings added to it as well. This is different than your typical
    "pasta" sauces, mind you, which almost certainly have added seasonings and
    non-tomato ingredients and may include chunks of tomatoes.
  &lt;/p&gt;
  &lt;h3&gt;Tomato Paste&lt;/h3&gt;
  &lt;img src="https://ohthehugemanatee.net/images/2013/02/tomato_paste.jpg" style="float: left; margin: 0 20px 20px 0; width: 160px;" /&gt;
  &lt;p&gt;
    Tomato paste is the last major variation that canned tomatoes come in (to my
    knowledge). You take the tomato purée or sauce from the prior categories and
    then you cook it more. And then you cook it more. And then some more.
    Tomato paste is effectively highly reduced tomato sauce that has had most of
    its liquid cooked off. This is used when you want to add tomato flavor to a
    dish without adding extra liquid to a dish. It can actually help to thicken
    a dish to a modest degree.
  &lt;/p&gt;
  &lt;div style="clear: both;"&gt;
    &lt;p&gt;
      If you've made it this far, you should be pretty amazed at the various
      phases of matter that tomatoes can exist in. I mean, holy crap, that's a 
      lot of tomato. I don't even like tomato all that much and I am impressed. 
      If you start throwing in all the flavors, extra ingredients, and 
      low-sodium varieties, the multitude of options is staggering.
    &lt;/p&gt;
  &lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dave Mankoff</dc:creator><pubDate>Mon, 25 Feb 2013 18:58:00 -0500</pubDate><guid isPermaLink="false">tag:ohthehugemanatee.net,2013-02-25:/2013/02/canned-tomatoes/</guid><category>food</category><category>food</category></item><item><title>A Calendar of Tales</title><link>https://ohthehugemanatee.net/2013/02/a-calendar-of-tales/</link><description>
  &lt;p&gt;
    I love &lt;a href="http://www.neilgaiman.com/"&gt;Neil Gaiman's&lt;/a&gt; work. So when
    I disovered a new collection of his short stories online, I became ecstatic.
    &lt;a href="http://keepmoving.blackberry.com/desktop/en/us/ambassador/neil-gaiman.html"&gt;
      A Calendar of Tales&lt;/a&gt; is a collection of twelver short stories that he
    has written based on twitter responses to a series of questions that he
    posted online. I only wish that I had discovered it sooner.
  &lt;/p&gt;
  &lt;p&gt;
    What particularly draws me to his style of writing is that he exemplifies
    the practice of "show, don't tell" when he writes. He throws you into the 
    first story just as quickly as the character he is introducing has been
    thrown in, ("disoriented", "unfocused"). Yet by the end of the tale,  you
    understand what's happening and what's unfolding without ever being told.
    It's absolutely brilliant storytelling.
  &lt;/p&gt;
  &lt;p&gt;
     A direct link to
    &lt;a href="https://ohthehugemanatee.net/uploads/2013/02/a_calendar_of_tales.pdf"&gt;A Calendar
      of Tales&lt;/a&gt;.
  &lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dave Mankoff</dc:creator><pubDate>Fri, 22 Feb 2013 12:11:00 -0500</pubDate><guid isPermaLink="false">tag:ohthehugemanatee.net,2013-02-22:/2013/02/a-calendar-of-tales/</guid><category>writing</category><category>art</category><category>stories</category><category>writing</category></item><item><title>Why Ubuntu Has Abandoned You, and Why That's Ok</title><link>https://ohthehugemanatee.net/2013/02/why-ubuntu-has-abandoned-you-and-why-thats-ok/</link><description>
&lt;p&gt;
    Ever since &lt;a href="http://www.canonical.com/"&gt;Canonical&lt;/a&gt; released 
    &lt;a href="http://unity.ubuntu.com/"&gt;Unity&lt;/a&gt; in 2011 as the default desktop
    environment for their operating system
    &lt;a href="http://www.ubuntu.com/"&gt;Ubuntu&lt;/a&gt; , there have been angry rumblings
    from the Linux community over the degradation of desktop experience. Then, in
    what many took as further provocation, Canonical introduced 
    &lt;a href="http://en.wikipedia.org/wiki/Unity_(user_interface)#12.10_Amazon_controversy"&gt;
      Amazon.com "Lens" integration&lt;/a&gt;, allowing users of Unity to search Amazon
    directly from their desktop environment by default. This has been widely 
    reviled by the community that once exalted Ubuntu as a shining example of 
    Linux's growing maturity and adoption. Why has Canonical chosen a product path
    that seems to be progressively upsetting more and more of their core user base?
    A newly released video from yesterday should being to make this abundantly
    clear: 
  &lt;/p&gt;
&lt;p class="media"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="" frameborder="0" height="315" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/h384z7Ph0gU?si=5EHnyGX4kD661IBW" title="YouTube video player" width="560"&gt;&lt;/iframe&gt;

&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dave Mankoff</dc:creator><pubDate>Wed, 20 Feb 2013 08:14:00 -0500</pubDate><guid isPermaLink="false">tag:ohthehugemanatee.net,2013-02-20:/2013/02/why-ubuntu-has-abandoned-you-and-why-thats-ok/</guid><category>linux</category><category>phone</category><category>tablet</category><category>smartphone</category><category>os</category><category>linux</category><category>ubuntu</category></item><item><title>htmlmin</title><link>https://ohthehugemanatee.net/2013/02/htmlmin/</link><description>
  &lt;p&gt;
    I've written an
    &lt;a href="http://pypi.python.org/pypi/htmlmin" title="htmlmin"&gt;HTML
      minification library&lt;/a&gt; that's ready for release. &lt;code&gt;pip 
      install htmlmin&lt;/code&gt; should get you going.
  &lt;/p&gt;
  &lt;p&gt;
    This site is statically generated via &lt;a href="http://getpelican.com"&gt;
      pelican&lt;/a&gt; and I noticed that the content generated by it was not as 
    compact as it could be. I started looking into existing HTML minification
    solutions and was left disappointed. I found one,
    &lt;a href="http://pypi.python.org/pypi/django-htmlmin"&gt;django-htmlmin&lt;/a&gt;
    that left me disappointed - it relies on 
    &lt;a href="http://www.crummy.com/software/BeautifulSoup/"&gt;Beautiful Soup&lt;/a&gt;,
    &lt;a href="https://www.djangoproject.com/"&gt;Django&lt;/a&gt;, and other libraries,
    which in turn have lots of other, non-HTML dependencies such as MySQL.
    Furthermore, it isn't really that featureful or well designed, as I looked
    through the code.
  &lt;/p&gt;
  &lt;p&gt;
    htmlmin has no dependencies other than Python's builtin HTMLParser. It has
    features that allow you to fine tune how the HTML gets minified and allows 
    you to easily mark up your HTML inline to demarcate non-minifieable areas.
    It follows the &lt;a href="http://www.w3.org/TR/html51/"&gt;HTML 5&lt;/a&gt; 
    specification closely to account for non-closed tags.
  &lt;/p&gt;
  &lt;p&gt;
    There's still a few more features that I want to add. Specifically, I want
    to add a feature that allows removal of opening and closing tags where
    allowed by the HTML5 specification. I also want it to recognize 
    &lt;code&gt;whitespace: pre&lt;/code&gt; inside of inline style tags. Those will come in
    the next version of the software as I design tests for them.
  &lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Dave Mankoff</dc:creator><pubDate>Mon, 18 Feb 2013 09:29:00 -0500</pubDate><guid isPermaLink="false">tag:ohthehugemanatee.net,2013-02-18:/2013/02/htmlmin/</guid><category>programming</category><category>htmlmin</category><category>python</category><category>programming</category></item></channel></rss>