<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Twitter on Major Hayden</title><link>https://major.io/tags/twitter/</link><description>Recent content in Twitter on Major Hayden</description><generator>Hugo</generator><language>en</language><managingEditor>major@mhtx.net (Major Hayden)</managingEditor><webMaster>major@mhtx.net (Major Hayden)</webMaster><copyright>All content licensed &lt;a href="https://creativecommons.org/licenses/by-sa/4.0/"&gt;CC BY-SA 4.0&lt;/a&gt;</copyright><lastBuildDate>Wed, 05 Aug 2026 12:23:48 -0500</lastBuildDate><atom:link href="https://major.io/tags/twitter/index.xml" rel="self" type="application/rss+xml"/><item><title>Adventures with the mastodon herd</title><link>https://major.io/p/adventures-with-the-mastodon-herd/</link><pubDate>Fri, 11 Nov 2022 00:00:00 +0000</pubDate><author>major@mhtx.net (Major Hayden)</author><guid>https://major.io/p/adventures-with-the-mastodon-herd/</guid><description>&lt;p&gt;All of the recent changes at Twitter inspired me to take a second look at &lt;a href="https://en.wikipedia.org/wiki/Mastodon_(software)"&gt;mastodon&lt;/a&gt;.
In short, mastodon is a federated social network that feels a bit like someone took Twitter and split it up into a vast network of independent servers.&lt;/p&gt;
&lt;h1 id="why-mastodon"&gt;Why mastodon?&lt;/h1&gt;
&lt;p&gt;It feels a lot like Twitter, but better.&lt;/p&gt;
&lt;p&gt;You can search for people, follow them, and publish messages (called &lt;em&gt;toots&lt;/em&gt;).
They can also follow you and see the messages you publish.&lt;/p&gt;
&lt;p&gt;The big difference is that you don&amp;rsquo;t join a central server with mastodon.
There&amp;rsquo;s a massive network of servers to choose from and you can create accounts on one or more of those servers to get started.
You can even run your own!&lt;/p&gt;
&lt;p&gt;Mastodon reminds me of email for many reasons:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;There&amp;rsquo;s no central server. You join a server (from the &lt;a href="https://joinmastodon.org/servers"&gt;massive, growing list&lt;/a&gt;) and
start publishing messages.&lt;/li&gt;
&lt;li&gt;Everything is on an eventual consistency model. If a mastodon server goes offline for
a bit or has network issues, messages and other data will synchronize when it&amp;rsquo;s back
online.&lt;/li&gt;
&lt;li&gt;You can follow people on your server or on other servers. You choose who to mute or
block and you can create lists that help you group certain contacts.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;After joining the &lt;a href="https://fosstodon.org/"&gt;fosstodon.org&lt;/a&gt; server, I noticed that it was really easy to begin following people and get messages.
I reconnected with people that I had not heard from in a very long time!&lt;/p&gt;
&lt;h1 id="migrating-from-twitter"&gt;Migrating from Twitter&lt;/h1&gt;
&lt;p&gt;One of my first questions after joining mastodon was: &amp;ldquo;How do I find the people I follow on Twitter?&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Many Twitter users are adding their mastodon accounts to their bio to make them easier to find on mastodon.
For example, I added my mastodon account, &lt;a href="https://fosstodon.org/@major"&gt;@major@fosstodon.org&lt;/a&gt;, to my &lt;a href="https://twitter.com/majorhayden"&gt;twitter bio&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;&lt;img src="twitter_bio.png" alt="twitter_bio.png" title="Twitter bio showing off my mastodon link"&gt;&lt;/p&gt;
&lt;p&gt;Adding this to your bio makes it easier for people to find you via some helpful tools.
I used &lt;a href="https://pruvisto.org/debirdify/"&gt;debirdify&lt;/a&gt; to look through my Twitter account for mastodon handles of the people I follow.
Within seconds, it provided links to about 15 mastodon accounts and offered me a CSV that I could directly import into my mastodon server. 🎉
&lt;em&gt;(Mastodon servers have some awesome import and export capabilities.)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve also heard good things about &lt;a href="https://fedifinder.glitch.me/"&gt;Fedifinder&lt;/a&gt; and &lt;a href="https://twitodon.com/"&gt;Twitodon&lt;/a&gt; for helping you find Twitter friends on mastodon.
There&amp;rsquo;s a &lt;a href="https://www.wired.com/story/how-to-find-twitter-friends-on-mastodon/"&gt;helpful article on Wired&lt;/a&gt; with more suggestions.&lt;/p&gt;
&lt;h1 id="apps"&gt;Apps&lt;/h1&gt;
&lt;p&gt;I&amp;rsquo;m neck-deep in the Android ecosystem, so most of my suggestions here are for Android devices.
I tried the &lt;a href="https://play.google.com/store/apps/details?id=org.joinmastodon.android&amp;amp;gl=US"&gt;main mastodon app&lt;/a&gt; first.
It looks great, updates quickly, and is very easy to use.
However, inserting GIFs into toots became really frustrating (although I hear that&amp;rsquo;s being fixed).&lt;/p&gt;
&lt;p&gt;I moved to &lt;a href="https://tusky.app/"&gt;Tusky&lt;/a&gt; and it&amp;rsquo;s my go-to mastodon app.
You can add multiple accounts, posting media is incredibly easy, and it has tons of configuration knobs everywhere.&lt;/p&gt;
&lt;p&gt;There are various desktop applications for mastodon, but the web interface is good enough for me!
The default web interface looks a lot like Twitter with a big timeline running down the middle and section links on the right.&lt;/p&gt;
&lt;p&gt;However, I use Tweetdeck with Twitter and I wanted something similar on mastodon.
Go into the settings for the web application, and choose &lt;em&gt;Appearance&lt;/em&gt;.
Click &lt;em&gt;Enable advanced web interface&lt;/em&gt;, save the changes, and click &lt;em&gt;Back to Mastodon&lt;/em&gt;.
Enjoy your Tweetdeck-like multi-column interface! ✨&lt;/p&gt;
&lt;h1 id="run-your-own-instance"&gt;Run your own instance&lt;/h1&gt;
&lt;p&gt;The federated nature of mastodon means you can run your own single user instance if you want!
Buy a domain you like (or use a subdomain off an existing domain) and deploy!&lt;/p&gt;
&lt;p&gt;The upstream repository has a &lt;a href="https://github.com/mastodon/mastodon/tree/main/chart"&gt;helm chart&lt;/a&gt; which works well with kubernetes.
Also, there&amp;rsquo;s a &lt;a href="https://github.com/mastodon/mastodon/blob/main/docker-compose.yml"&gt;docker-compose&lt;/a&gt; file which works well for smaller deployments.&lt;/p&gt;
&lt;p&gt;I went the docker-compose route on a small cloud instance at Hetzner, but I modified the upstream &lt;code&gt;docker-compose.yml&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;3&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;certs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;postgres&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;redis&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;mastodon&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;services&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;traefik&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;docker.io/library/traefik:latest&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;container_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;traefik&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;restart&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;unless-stopped&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;command&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# Tell Traefik to discover containers using the Docker API&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- --&lt;span class="l"&gt;providers.docker=true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- --&lt;span class="l"&gt;providers.docker.exposedbydefault=false&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# Enable the Trafik dashboard&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- --&lt;span class="l"&gt;api.dashboard=true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# Set up LetsEncrypt&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;#- --certificatesresolvers.letsencrypt.acme.caServer=https://acme-staging-v02.api.letsencrypt.org/directory&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- --&lt;span class="l"&gt;certificatesresolvers.letsencrypt.acme.dnschallenge=true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- --&lt;span class="l"&gt;certificatesresolvers.letsencrypt.acme.dnschallenge.provider=porkbun&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- --&lt;span class="l"&gt;certificatesresolvers.letsencrypt.acme.email=major@mhtx.net&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- --&lt;span class="l"&gt;certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# Set up an insecure listener that redirects all traffic to TLS&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- --&lt;span class="l"&gt;entrypoints.web.address=:80&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- --&lt;span class="l"&gt;entrypoints.web.http.redirections.entrypoint.to=websecure&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- --&lt;span class="l"&gt;entrypoints.web.http.redirections.entrypoint.scheme=https&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- --&lt;span class="l"&gt;entrypoints.websecure.address=:443&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# Set up the TLS configuration for our websecure listener&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- --&lt;span class="l"&gt;entrypoints.websecure.http.tls=true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- --&lt;span class="l"&gt;entrypoints.websecure.http.tls.certResolver=letsencrypt&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- --&lt;span class="l"&gt;entrypoints.websecure.http.tls.domains[0].main=toots.cloud&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- --&lt;span class="l"&gt;entrypoints.websecure.http.tls.domains[0].sans=*.toots.cloud&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;PORKBUN_SECRET_API_KEY=*****&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;PORKBUN_API_KEY=*****&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s1"&gt;&amp;#39;80:80&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s1"&gt;&amp;#39;443:443&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;/var/run/docker.sock:/var/run/docker.sock:ro&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;certs:/letsencrypt&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;labels&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s2"&gt;&amp;#34;traefik.enable=true&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s1"&gt;&amp;#39;traefik.http.routers.traefik.rule=Host(`traefik.toots.cloud`)&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s2"&gt;&amp;#34;traefik.http.routers.traefik.entrypoints=websecure&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s2"&gt;&amp;#34;traefik.http.routers.traefik.tls.certresolver=letsencrypt&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s2"&gt;&amp;#34;traefik.http.routers.traefik.service=api@internal&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s1"&gt;&amp;#39;traefik.http.routers.traefik.middlewares=strip&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s1"&gt;&amp;#39;traefik.http.middlewares.strip.stripprefix.prefixes=/traefik&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;postgres&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;container_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;postgres&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;restart&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;always&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;docker.io/library/postgres:14-alpine&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;shm_size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;256mb&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;env_file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;.env.production&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;healthcheck&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;test&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;CMD&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;pg_isready&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;-U&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;postgres&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;postgres:/var/lib/postgresql/data&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;./postgres-setup.sh:/docker-entrypoint-initdb.d/init-user-db.sh:Z&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s1"&gt;&amp;#39;POSTGRES_HOST_AUTH_METHOD=trust&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;redis&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;container_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;redis&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;restart&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;always&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;docker.io/library/redis:7-alpine&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;healthcheck&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;test&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;CMD&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;redis-cli&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;ping&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;redis:/data&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;web&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;container_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;web&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;docker.io/tootsuite/mastodon:v3.5.3&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;restart&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;always&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;env_file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;.env.production&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;command&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;bash -c &amp;#34;rm -f /mastodon/tmp/pids/server.pid; bundle exec rails s -p 3000&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;healthcheck&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# prettier-ignore&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;test&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;CMD-SHELL&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;wget -q --spider --proxy=off localhost:3000/health || exit 1&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s1"&gt;&amp;#39;3000&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;depends_on&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;postgres&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;redis&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;mastodon:/mastodon/public/system&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;labels&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s2"&gt;&amp;#34;traefik.enable=true&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s2"&gt;&amp;#34;traefik.http.routers.web.rule=Host(`toots.cloud`)&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s2"&gt;&amp;#34;traefik.http.routers.web.entrypoints=websecure&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s2"&gt;&amp;#34;traefik.http.routers.web.tls.certresolver=letsencrypt&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;streaming&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;container_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;streaming&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;docker.io/tootsuite/mastodon:v3.5.3&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;restart&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;always&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;env_file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;.env.production&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;command&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;node ./streaming&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;healthcheck&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# prettier-ignore&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;test&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;CMD-SHELL&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;wget -q --spider --proxy=off localhost:4000/api/v1/streaming/health || exit 1&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s1"&gt;&amp;#39;4000&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;depends_on&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;postgres&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;redis&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;sidekiq&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;container_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;sidekiq&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;docker.io/tootsuite/mastodon:v3.5.3&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;restart&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;always&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;env_file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;.env.production&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;command&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;bundle exec sidekiq&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;depends_on&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;postgres&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;redis&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;mastodon:/mastodon/public/system&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;healthcheck&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;test&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;CMD-SHELL&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;ps aux | grep &amp;#39;[s]idekiq\ 6&amp;#39; || false&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Here are the main changes I made:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Specified the exact URL/tag for each container&lt;/li&gt;
&lt;li&gt;Added traefik to handle TLS&lt;/li&gt;
&lt;li&gt;Used named volumes instead of filesystem directories (made SELinux much happier)&lt;/li&gt;
&lt;li&gt;Added a provisioning script for postgres&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The provisioning script for postgres allows me to bring up postgres without needing to run any extra commands:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;set&lt;/span&gt; -e
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;psql -v &lt;span class="nv"&gt;ON_ERROR_STOP&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt; --username postgres &lt;span class="s"&gt;&amp;lt;&amp;lt;-EOSQL
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;	CREATE USER mastodon WITH PASSWORD &amp;#39;super-secret-password&amp;#39; CREATEDB;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOSQL&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Once you have all of this in place, run the usual &lt;code&gt;docker-compose up -d&lt;/code&gt; and wait for everything to start.
Then you can run through the initial mastodon setup:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-console" data-lang="console"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gp"&gt;$&lt;/span&gt; docker-compose run --rm web bundle &lt;span class="nb"&gt;exec&lt;/span&gt; rake mastodon:setup
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You will need to answer lots of questions, including your domain name, postgres/redis details, email configuration, and object storage configuration.
I use &lt;a href="https://www.mailgun.com/"&gt;Mailgun&lt;/a&gt; for mastodon&amp;rsquo;s email since it makes the setup much easier and has a very low cost.
For object storage, I went with a public &lt;a href="https://www.backblaze.com/b2/cloud-storage.html"&gt;Backblaze B2&lt;/a&gt; bucket since it&amp;rsquo;s Amazon S3 compatible but very inexpensive&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;p&gt;When the setup finishes, it will dump an environments file to the screen.
&lt;strong&gt;Be sure to save that file.&lt;/strong&gt;
This will allow you to start up all of the containers again with the same configuration later.
A copy of the environments file will be kept inside the container storage as well.&lt;/p&gt;
&lt;h1 id="self-hosted-instance-takeaways"&gt;Self-hosted instance takeaways&lt;/h1&gt;
&lt;p&gt;I&amp;rsquo;ve been running my own mastodon instance for a few days and I&amp;rsquo;m not sure if I will keep it.
Sure, I love having an instance on a hilarious domain like &lt;em&gt;toots.cloud&lt;/em&gt; and having full control over my mastodon experience.&lt;/p&gt;
&lt;p&gt;But it&amp;rsquo;s one more thing to manage, patch, and back up.&lt;/p&gt;
&lt;p&gt;The fosstodon.org community has been excellent so far and I&amp;rsquo;m contributing to their costs each month via their &lt;a href="https://www.patreon.com/fosstodon/posts"&gt;Patreon page&lt;/a&gt;.
Every mastodon instance is going through growing pains recently due to really high demand.&lt;/p&gt;
&lt;p&gt;The last count from the &lt;a href="https://bitcoinhackers.org/@mastodonusercount"&gt;Mastodon Users bot&lt;/a&gt; shows massive interest:&lt;/p&gt;
&lt;p&gt;&lt;img src="mastodon_users.png" alt="mastodon_users.png" title="🤖 Mastodon user count bot"&gt;&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re on a server that isn&amp;rsquo;t performing well: &lt;strong&gt;be patient&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Ask for ways that you can help technically or financially.
One of the biggest reminders that I get from mastodon is that every server is a &lt;em&gt;community&lt;/em&gt;.
The community must come together to make each server successful as a part of the big fediverse.&lt;/p&gt;
&lt;div class="footnotes" role="doc-endnotes"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;Be sure to note the endpoint for your Backblaze bucket when you create it.
You will need to specify that endpoint when you set up mastodon.
As an example, my endpoint is &lt;code&gt;https://s3.us-west-001.backblazeb2.com&lt;/code&gt; and my region is &lt;code&gt;us-west-001&lt;/code&gt;.&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description></item><item><title>My Twitter reset</title><link>https://major.io/p/my-twitter-reset/</link><pubDate>Fri, 17 Dec 2021 00:00:00 +0000</pubDate><author>major@mhtx.net (Major Hayden)</author><guid>https://major.io/p/my-twitter-reset/</guid><description>&lt;p&gt;&lt;em&gt;Photo credit: &lt;a href="https://unsplash.com/photos/w5LSIqzI6tw"&gt;Marek Piwnicki&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s start this post with a quote:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;We are dying from overthinking. We are slowly killing ourselves by thinking
about everything.&amp;rdquo; &amp;ndash; Anthony Hopkins&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That&amp;rsquo;s an accurate summary of my life on Twitter over the past few years. I
lost the enjoyment from connecting with other people and suddenly found myself
&lt;em&gt;doom scrolling&lt;/em&gt; &amp;ndash; looking over my Twitter feed with glossy eyes, seeing only
negativity and feeling less connected to other people.&lt;/p&gt;
&lt;p&gt;Then I thought: &amp;ldquo;Why am I using &lt;strong&gt;social&lt;/strong&gt; media if it makes me feel less
social and less connected?&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Is it Twitter? Is there something wrong with the platform? Is it the same
problem that people see with Facebook?&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Is it me?&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="the-problem"&gt;The problem&lt;/h2&gt;
&lt;p&gt;Social media companies thrive on eyeballs. More eyeballs looking at the
platform for longer periods means higher ad revenue. Sure, cute and fuzzy cats
or funny family videos certainly capture attention, but there&amp;rsquo;s nothing like
the attention you gain through spreading fear, anger, and contempt.&lt;/p&gt;
&lt;p&gt;Many argue that platforms like Twitter, Facebook, Instagram, and Tiktok have
algorithms that show you content that cause you to spend more time on the site.
Much of the content out there is negative and that certainly drives traffic.&lt;/p&gt;
&lt;p&gt;However, the humans using the platform an interacting with each other are also
responsible. Lies and misleading information spread like wildfire, especially
if they disparage a group or a belief that is divisive. By the time the truth
comes out, the lie has done irreparable damage.&lt;/p&gt;
&lt;p&gt;In Tyler Merritt&amp;rsquo;s book, &lt;em&gt;I Take My Coffee Black&lt;/em&gt;, he talks about divisiveness
that appeared in his church and community. He writes that distance breeds
contempt and distrust, but proximity brings understanding. You see this
constantly on social media where people wage war over politics but then they do
their best to keep quiet about it when they meet in person.&lt;/p&gt;
&lt;h2 id="my-problem-with-twitter"&gt;My problem with Twitter&lt;/h2&gt;
&lt;p&gt;I started with Twitter in 2008 and my account is just over 10,000 followers.
Sure, that&amp;rsquo;s a tiny fraction compared to many other accounts, but to me, that&amp;rsquo;s
a tremendous amount. I&amp;rsquo;m truly humbled at the amount of people who are
interested in what I say and share. Thank you.&lt;/p&gt;
&lt;p&gt;On the other hand, when it came time to follow people, I felt like it was
important to follow anyone who followed me. If you&amp;rsquo;re going to take time to
listen to what I have to say, then I should do the same. Right?&lt;/p&gt;
&lt;p&gt;At first, this worked out well. Over time, I followed some people who shared
things that I was upset about. That lead me to follow other people who
reinforced my beliefs, biases, and choices. I&amp;rsquo;d run into opinions that differed
from mine and I wouldn&amp;rsquo;t follow those people or extend the reach of what they
shared. My set of beliefs were continually reinforced.&lt;/p&gt;
&lt;p&gt;Through all this time, I had really close friends who would ask: &amp;ldquo;Hey, did you
see that blog post I wrote? I put it on Twitter.&amp;rdquo; My response would usually be
&amp;ldquo;Oh, well, I follow a lot of people and it&amp;rsquo;s hard to keep up with all of that.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;That was a cop-out. The problem was staring me straight in the face.&lt;/p&gt;
&lt;p&gt;I stopped using social media to connect with people. I was in a downward spiral
of negativity that I had brought upon myself.&lt;/p&gt;
&lt;h2 id="new-goals"&gt;New goals&lt;/h2&gt;
&lt;p&gt;Last weekend, I put up a final tweet saying I was done with Twitter for a while
and provided some other contact information for anyone who wanted to reach out.
I deleted Twitter from my devices, signed out on my computers, and enjoyed my
weekend.&lt;/p&gt;
&lt;p&gt;That was the key. &lt;strong&gt;I enjoyed my weekend.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Then I thought, &lt;em&gt;&amp;ldquo;How can I enjoy next week and next weekend, too?&amp;rdquo;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;So I set up some goals for myself with social media:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Reduce my list of people I follow to people who I truly care about. Someone
should earn that spot not from simply following me, but by sharing things
that add value to the world.&lt;/li&gt;
&lt;li&gt;If anyone I follow violates the first rule, consider removing them or
temporarily moving them to a list.&lt;/li&gt;
&lt;li&gt;Find a way to filter out retweets so I can see what people are saying, not
what they&amp;rsquo;re passing along.&lt;/li&gt;
&lt;li&gt;Keep everything else (news, financial information, etc) compartmentalized
into lists that I can review when I need that information.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="the-reset"&gt;The reset&lt;/h2&gt;
&lt;p&gt;After my weekend off Twitter, I realized I had over 57,000 tweets (many of
which violated my own first rule above) and I was following thousands of people
on Twitter. Many of those people I followed were people I cared nothing about
(celebrities, angry people, divisive political figures).&lt;/p&gt;
&lt;p&gt;This required some drastic action.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;I &lt;a href="https://help.twitter.com/en/managing-your-account/how-to-download-your-twitter-archive"&gt;downloaded all of my Twitter data&lt;/a&gt; in a big zip file.&lt;/li&gt;
&lt;li&gt;I used the &lt;a href="https://www.tweepy.org/"&gt;tweepy&lt;/a&gt; Python module to delete every tweet, every favorite,
every direct message, and every retweet. Every person I followed was
removed. Yes. All of it.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Deleting 57,000 tweets took several hours but the remaining bits were removed
in less than an hour. The tweepy package made the process painless and it was
easy to just leave running in a terminal while I worked on other things.&lt;/p&gt;
&lt;h2 id="going-forward"&gt;Going forward&lt;/h2&gt;
&lt;p&gt;My social media goals (see above) drive my current decisions on Twitter. If I
followed you before, but I don&amp;rsquo;t follow you now: please don&amp;rsquo;t take it
personally. I&amp;rsquo;m gradually bringing people back into my feed and I&amp;rsquo;m looking at
Twitter less often.&lt;/p&gt;
&lt;p&gt;It might take me a little while to find you again. That&amp;rsquo;s okay. 🤗&lt;/p&gt;
&lt;p&gt;In addition, I plan to share more real, interesting, original content and avoid
the favorite and retweet buttons unless I find something incredibly valuable. I
plan to avoid negativity but I will share things that make us question the
norms that surround us.&lt;/p&gt;
&lt;p&gt;After all, questioning the status quo so much of what makes us human. We know
there&amp;rsquo;s something better out there and we want to achieve it. We can&amp;rsquo;t do it by
tearing each other down, but we can surely do it by building meaningful
connections between all of us.&lt;/p&gt;</description></item><item><title>Tweetdeck’s Chrome notifications stopped working</title><link>https://major.io/p/tweetdecks-chrome-notifications-stopped-working/</link><pubDate>Fri, 08 May 2015 13:55:55 +0000</pubDate><author>major@mhtx.net (Major Hayden)</author><guid>https://major.io/p/tweetdecks-chrome-notifications-stopped-working/</guid><description>&lt;p&gt;&lt;a href="https://major.io/wp-content/uploads/2015/05/Tweetdeck-Logo.png"&gt;&lt;img src="https://major.io/wp-content/uploads/2015/05/Tweetdeck-Logo.png" alt="Tweetdeck logo" width="256" height="256" class="alignright size-full wp-image-5552" srcset="https://major.io/wp-content/uploads/2015/05/Tweetdeck-Logo.png 256w, https://major.io/wp-content/uploads/2015/05/Tweetdeck-Logo-150x150.png 150w" sizes="(max-width: 256px) 100vw, 256px" /&gt;&lt;/a&gt;With the last few weeks, I noticed that Tweetdeck&amp;rsquo;s notifications weren&amp;rsquo;t showing up in Chrome any longer. I double-checked all of the Tweetdeck settings and notifications were indeed enabled. However, I found that Tweetdeck wasn&amp;rsquo;t allowed to send notifications when I checked in my Chrome settings.&lt;/p&gt;
&lt;h3 id="check-your-settings"&gt;Check your settings&lt;/h3&gt;
&lt;p&gt;To check these for yourself, hop into &lt;a href="chrome://settings/content"&gt;Chrome&amp;rsquo;s content settings&lt;/a&gt;. Scroll down to &lt;strong&gt;Notifications&lt;/strong&gt; and click &lt;strong&gt;Manage Exceptions&lt;/strong&gt;. In my case, &lt;em&gt;&lt;a href="https://tweetdeck.twitter.com"&gt;https://tweetdeck.twitter.com&lt;/a&gt;&lt;/em&gt; was missing from the list entirely.&lt;/p&gt;
&lt;p&gt;From here, you have two options: enable notifications for all sites (not ideal) or add an exception.&lt;/p&gt;
&lt;h3 id="the-big-hammer-approach"&gt;The big hammer approach&lt;/h3&gt;
&lt;p&gt;To enable notifications for all sites (good for testing, not ideal in the long term), click &lt;strong&gt;Allow all sites to show notifications&lt;/strong&gt; in the &lt;strong&gt;Notifications&lt;/strong&gt; session.&lt;/p&gt;
&lt;h3 id="the-right-way"&gt;The right way&lt;/h3&gt;
&lt;p&gt;To enable notifications just for Tweetdeck, you may be able to add a new exception right there in the Chrome settings interface. Many users are reporting that newer versions of Chrome don&amp;rsquo;t allow for that. In that case, your fix involves editing your Chrome configuration on the command line.&lt;/p&gt;
&lt;p&gt;Chrome preferences are in different locations depending on your OS:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Windows: C:\Users&amp;lt;username&amp;gt;\AppData\Local\Google\Chrome\User Data\&lt;/li&gt;
&lt;li&gt;Mac: ~/Library/Application Support/Google/Chrome/&lt;/li&gt;
&lt;li&gt;Linux: ~/.config/google-chrome/&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;BEFORE EDITING ANYTHING,&lt;/strong&gt; be sure you&amp;rsquo;ve quit Chrome and ensured that nothing Chrome-related is running in the background. Seriously. Don&amp;rsquo;t skip this step.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m on Linux, so I&amp;rsquo;ll open up &lt;code&gt;.config/google-chrome/Default/Preferences&lt;/code&gt; in vim and make some edits. You&amp;rsquo;re looking for some lines that look like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;https://tweetdeck.twitter.com:443,https://tweetdeck.twitter.com:443&amp;#34;&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;last_used&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;notifications&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;1431092689.014171&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Replace those lines with this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;https://tweetdeck.twitter.com,*&amp;#34;&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;last_used&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;notifications&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;1414673538.301078&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;notifications&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;https://tweetdeck.twitter.com:443,https://tweetdeck.twitter.com:443&amp;#34;&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;last_used&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;notifications&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;1431094902.014302&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Save the file and start up Chrome once more. Head on over to &lt;a href="https://tweetdeck.twitter.com/"&gt;Tweetdeck&lt;/a&gt; and you should now see the familiar Chrome toast notifications for Twitter updates!&lt;/p&gt;</description></item><item><title>Lenovo ThinkPad T430s review</title><link>https://major.io/p/lenovo-thinkpad-t430s-review/</link><pubDate>Sun, 21 Oct 2012 21:15:44 +0000</pubDate><author>major@mhtx.net (Major Hayden)</author><guid>https://major.io/p/lenovo-thinkpad-t430s-review/</guid><description>&lt;p&gt;This post covers the second half of my &lt;a href="https://major.io/2012/10/12/going-back-to-linux-as-a-desktop/"&gt;experience moving back to a Linux desktop&lt;/a&gt; but I figured it was a good opportunity to focus on the &lt;a href="http://www.lenovo.com/products/us/laptop/thinkpad/t-series/t430s/"&gt;ThinkPad T430s&lt;/a&gt; itself as well as the Lenovo ordering experience. If you follow me on Twitter, you know about my service experience. I&amp;rsquo;ll save that for the end of this post.&lt;/p&gt;
&lt;p&gt;This post is a little on the long side, so here&amp;rsquo;s a TL;DR for you if you&amp;rsquo;re in a big hurry:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Good:&lt;/strong&gt; build quality, port quantity/location, input devices, battery life, quiet operation&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bad:&lt;/strong&gt; LCD display is very washed out and has a blue tint, poor sales support from Lenovo&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Suggestions:&lt;/strong&gt; Don&amp;rsquo;t buy via Lenovo, try GovConnection and get faster delivery with better service&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;The Laptop&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If you asked me for a one-sentence description of the T430s, I&amp;rsquo;d have to say it&amp;rsquo;s a well-built, lightweight laptop with a good keyboard and a less than mediocre screen.&lt;/p&gt;
&lt;p&gt;The island-style keyboard was very easy for me to use coming from a MacBook Pro with chiclet keys. The spacing between the keys and the size of the keys themselves were good. I kept pushing the Function key when I meant to push Control, but that can be quickly swapped in the BIOS to make things easier.&lt;/p&gt;
&lt;p&gt;Even coming from the MacBook&amp;rsquo;s amazing trackpad, the &lt;strong&gt;trackpad on the ThinkPad was superb&lt;/strong&gt;. It tracked gestures and taps extremely well without much configuration in Linux or Windows. It&amp;rsquo;s light years ahead of the Samsung Series 9&amp;rsquo;s trackpad and it&amp;rsquo;s marginally better than the latest Dell laptops. The &amp;ldquo;nipple&amp;rdquo; controller wedged in the keyboard was easy to use and the extra set of mouse buttons below the keyboard (but above the trackpad) were convenient.&lt;/p&gt;
&lt;p&gt;I really like having the hardware WiFi on/off switch on the front right side of the laptop for situations where I want to ensure my laptop doesn&amp;rsquo;t start searching for access points before I can be sure it&amp;rsquo;s connecting to the right one. The USB ports were well placed and the &amp;ldquo;always on&amp;rdquo; port on the back is handy for charging phones and tablets when the laptop is powered off (you can disable that in the BIOS if you prefer). The fingerprint reader hasn&amp;rsquo;t been tested since there aren&amp;rsquo;t any open source drivers available for it in Linux.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s apparent that &lt;strong&gt;build quality is above average&lt;/strong&gt; with this laptop. It&amp;rsquo;s certainly not terribly attractive (when compared to a Mac), but for a solid business laptop, it&amp;rsquo;s ahead of the curve. The screen hinges are tight and they don&amp;rsquo;t flex even when typing on a wobbly surface. This really helps when you&amp;rsquo;re using the webcam with the laptop resting on your legs. The ThinkLight above the webcam is a little quirky (this is my first ThinkPad) but it is really useful in lowlight situations.&lt;/p&gt;
&lt;p&gt;Now, about that screen. I ordered my laptop with the 1600×900 HD+ screen (best one available). &lt;strong&gt;The color representation is downright terrible.&lt;/strong&gt; Almost everything is washed out with a blue tint. If you open a web page with a mostly white background, the text is readable but it hurts my eyes to read it. You can almost see gaps between the pixels on the screen at regular intervals and it gets really distracting when you&amp;rsquo;re editing photos. Even after applying different monitor profiles in Linux and Windows, I&amp;rsquo;ve found the screen to be frustrating to use. The panel on mine is a Samsung panel and I&amp;rsquo;d expect a better performing screen from them.&lt;/p&gt;
&lt;p&gt;Outside of the screen itself, the &lt;strong&gt;video performance of the Intel HD4000 is impressive&lt;/strong&gt;. Onboard GPU&amp;rsquo;s have really come a long way. I hooked up a second monitor via the DisplayPort and found that the graphics performance was still extremely good. You can play games like Civilization V on this laptop with onboard graphics pretty easily.&lt;/p&gt;
&lt;p&gt;All in all, I really do like the ThinkPad. If the screen doesn&amp;rsquo;t bother you, the remainder of this laptop is very convenient and powerful. However, for my use, I need something that performs well for business work as well as creative work. &lt;strong&gt;I&amp;rsquo;ve yet to find something better than the MacBooks for this kind of workload.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Service&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I generally try to start out with something positive when I try to review something, but the only positive thing I can say about Lenovo&amp;rsquo;s ordering experience is that it&amp;rsquo;s consistent. &lt;strong&gt;Consistently bad.&lt;/strong&gt; Here&amp;rsquo;s a timeline of my first order:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Sep 3 - Ordered laptop. Sales page said laptop would ship around Sep 12.&lt;/li&gt;
&lt;li&gt;Sep 4 - Order confirmed. Ship date pushed to Sep 27.&lt;/li&gt;
&lt;li&gt;Sep 8 - Order status showed &amp;ldquo;Released to Manufacturing&amp;rdquo;.&lt;/li&gt;
&lt;li&gt;Sep 10 - Order status page showed laptop shipped Sep 9 and would be delivered Sep 16.&lt;/li&gt;
&lt;li&gt;Sep 12 - Received an email saying a part had delayed my shipment.&lt;/li&gt;
&lt;li&gt;Sep 17 - Order status page shows laptop shipped Sep 14 and would be delivered Sep 21. I emailed Lenovo for more detail.&lt;/li&gt;
&lt;li&gt;Sep 18 - Lenovo representative replies saying the graphics card was the constrained part. Due to ship in 3-4 weeks or less. I emailed back asking about canceling the order. My email was never acknowledged.&lt;/li&gt;
&lt;li&gt;Sep 19 - I emailed Lenovo stating that I wanted my order cancelled immediately. My email was never acknowledged. I received an automated email stating that my order was delayed and would ship within 30 days. I called Lenovo&amp;rsquo;s support line to cancel and waited on hold for almost two hours. Gave up.&lt;/li&gt;
&lt;li&gt;Sep 20 - I called Lenovo again and my call was answered after 90 minutes on hold. The representative tried to talk me out of canceling several times and then finally canceled it. My cancellation was only a &amp;ldquo;request&amp;rdquo;, not a guarantee. I was referred to sales and they wanted me to order a different laptop - I declined.&lt;/li&gt;
&lt;li&gt;Sep 21 - My order was confirmed cancelled.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The salesperson suggested ordering a different laptop without the NVIDIA Optimus graphics card, so I did that on September 21. The order page showed a ship date of September 27, so I was quite pleased. As soon as I paid for the order, the ship date immediately slid out to October 16. Needless to say, I felt like I&amp;rsquo;d been bait-and-switched once again.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s important to note that through both orders, Lenovo&amp;rsquo;s public-facing order status page worked while the internal order status page accessed via my account page showed timeouts. The internal order status page hasn&amp;rsquo;t worked before, during or after shipping at all after multiple attempts. I&amp;rsquo;ve notified them more than once about it so they could make repairs.&lt;/p&gt;
&lt;p&gt;Someone on Twitter suggested trying &lt;a href="http://govconnection.com"&gt;GovConnection&lt;/a&gt; to order a ThinkPad since they keep models in stock with fast shipping. I ordered one on a Sunday and it shipped on a Monday. The back panel behind the screen was badly damaged and they cross-shipped me a replacement the next day. Their service has been superb and they provided timely updates for my order.&lt;/p&gt;
&lt;p&gt;In the end, Lenovo did actually ship my second laptop (without the NVIDIA Optimus card) and it did arrive slightly ahead of schedule. I&amp;rsquo;ll be sending it back to them since I already received a ThinkPad from GovConnection.&lt;/p&gt;
&lt;p&gt;Some of you might be saying that I should expect some delays when a laptop is built to order. I&amp;rsquo;m generally fine with that and I&amp;rsquo;ve had minor delays from Dell and Apple in the past with previous orders. The big difference is that the other companies warned me about the delays prior to purchase and also warned me about the parts I added that might cause delays to my order. That bit of forward thinking allowed me to decide whether a certain part was important to me or if I was able to wait for the product to arrive. When it comes down to communication, Lenovo has a lot to learn.&lt;/p&gt;</description></item><item><title>Keep tabs on OpenStack development with OpenStack Watch on Twitter</title><link>https://major.io/p/keep-tabs-on-openstack-development-with-openstack-watch-on-twitter/</link><pubDate>Fri, 08 Jun 2012 12:19:26 +0000</pubDate><author>major@mhtx.net (Major Hayden)</author><guid>https://major.io/p/keep-tabs-on-openstack-development-with-openstack-watch-on-twitter/</guid><description>&lt;p&gt;It&amp;rsquo;s no secret that I&amp;rsquo;m a fan of &lt;a href="http://twitter.com/"&gt;Twitter&lt;/a&gt; and &lt;a href="http://openstack.org/"&gt;OpenStack&lt;/a&gt;. I found myself needing a better way to follow the rapid pace of OpenStack development and I figured that a Twitter bot would be a pretty good method for staying up to date.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;d like to invite you to check out &lt;a href="http://twitter.com/openstackwatch"&gt;@openstackwatch&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;First things first, it&amp;rsquo;s a completely unofficial project that I worked on during my spare time and it&amp;rsquo;s not affiliated with OpenStack in any way. If it breaks, it&amp;rsquo;s most likely my fault.&lt;/p&gt;
&lt;p&gt;The bot watches for ticket status changes in &lt;a href="http://review.openstack.org/"&gt;OpenStack&amp;rsquo;s Gerrit server&lt;/a&gt; and makes a tweet about the change within a few minutes. Every tweet contains the commit&amp;rsquo;s project, owner, status, and a brief summary of the change. In addition, you&amp;rsquo;ll get a link directly to the review page on the Gerrit server. Here&amp;rsquo;s an example:&lt;/p&gt;
&lt;div id="attachment_3452" style="width: 457px" class="wp-caption aligncenter"&gt;
 &lt;a href="https://major.io/wp-content/uploads/2012/06/openstackwatchtweet.jpg"&gt;&lt;img src="https://major.io/wp-content/uploads/2012/06/openstackwatchtweet.jpg" alt="" title="openstackwatchtweet" width="447" height="154" class="size-full wp-image-3452" srcset="https://major.io/wp-content/uploads/2012/06/openstackwatchtweet.jpg 447w, https://major.io/wp-content/uploads/2012/06/openstackwatchtweet-300x103.jpg 300w" sizes="(max-width: 447px) 100vw, 447px" /&gt;&lt;/a&gt;
 &lt;p class="wp-caption-text"&gt;
 Hey! It's Dan!
 &lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;If you&amp;rsquo;re not a fan of Twitter, there&amp;rsquo;s a link to the RSS feed in the bio section, or you can just add this URL to your RSS feed reader:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://api.twitter.com/1/statuses/user_timeline.rss?screen_name=openstackwatch"&gt;http://api.twitter.com/1/statuses/user_timeline.rss?screen_name=openstackwatch&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you can come up with any ideas for improvements, please &lt;a href="http://twitter.com/rackerhacker"&gt;let me know&lt;/a&gt;!&lt;/p&gt;</description></item><item><title>Do professional certifications belong in your e-mail signature?</title><link>https://major.io/p/do-professional-certifications-belong-in-your-e-mail-signature/</link><pubDate>Sat, 16 Oct 2010 15:53:25 +0000</pubDate><author>major@mhtx.net (Major Hayden)</author><guid>https://major.io/p/do-professional-certifications-belong-in-your-e-mail-signature/</guid><description>&lt;p&gt;After a discussion amongst coworkers about professional certifications in e-mail signatures yesterday, I decided to throw the question out to &lt;a href="http://twitter.com/rackerhacker/"&gt;Twitter&lt;/a&gt; to gather some feedback:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href="http://twitter.com/rackerhacker"&gt;rackerhacker&lt;/a&gt;: Quick Twitter poll for the nerds: How many certification abbreviations do you put in your e-mail signature? [&lt;a href="http://twitter.com/RackerHacker/status/27448088177"&gt;Permalink&lt;/a&gt;]&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The question must have struck a nerve with folks as I had over 50 replies in less than 10-15 minutes. I expected to hear a lot of people say &amp;ldquo;zero&amp;rdquo;, and there were quite a few responses that didn&amp;rsquo;t surprise me:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href="http://twitter.com/minter"&gt;minter&lt;/a&gt;: @RackerHacker Zero&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href="http://twitter.com/stwange"&gt;stwange&lt;/a&gt;: @RackerHacker none it&amp;rsquo;s pretentious&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href="http://twitter.com/nickboldt"&gt;nickboldt&lt;/a&gt;: @RackerHacker Zero. My cert-fu is weak.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href="http://twitter.com/scassiba/status/27448504377"&gt;scassiba&lt;/a&gt;: @RackerHacker none, I don&amp;rsquo;t feel it&amp;rsquo;s necessary to fluff up an email signature with certifications&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href="http://twitter.com/errr_"&gt;errr_&lt;/a&gt;: @RackerHacker 0&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href="http://twitter.com/chrstphrbrwn"&gt;chrstphrbrwn&lt;/a&gt;: @RackerHacker Zero. I don&amp;rsquo;t use an email signature.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href="http://twitter.com/DamianZaremba"&gt;DamianZaremba&lt;/a&gt;: @RackerHacker none, makes you look a bit stuck up imo&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href="http://twitter.com/saiweb"&gt;saiweb&lt;/a&gt;: @RackerHacker 0&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href="http://twitter.com/jirahcox"&gt;jirahcox&lt;/a&gt;: @RackerHacker 0. Job title only if absolutely necessary.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href="http://twitter.com/jtimberman"&gt;jtimberman&lt;/a&gt;: @RackerHacker None mine are almost all expired anyway :)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href="http://twitter.com/ckeck"&gt;ckeck&lt;/a&gt;: @RackerHacker zero&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href="http://twitter.com/billblum"&gt;billblum&lt;/a&gt;: @RackerHacker None.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href="http://twitter.com/puppetmasterd"&gt;puppetmasterd&lt;/a&gt;: @RackerHacker zero, or preferably fewer&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href="http://twitter.com/ripienaar"&gt;ripienaar&lt;/a&gt;: @RackerHacker zero, they dont add value. Much rather link me to your github account so I can make up my own mind :)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href="http://twitter.com/redbluemagenta"&gt;redbluemagenta&lt;/a&gt;: @RackerHacker None. People can see for themselves through other avenues (blog, github, references) if you&amp;rsquo;re any good.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href="http://twitter.com/ubuntusoren"&gt;ubuntusoren&lt;/a&gt;: @RackerHacker none&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;There were a few people who disagreed:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href="http://twitter.com/bwwhite"&gt;bwwhite&lt;/a&gt;: @RackerHacker Just one because that&amp;rsquo;s all I have :) But I think 2 should be the limit. Pick the 2 most relevant to your current role&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href="http://twitter.com/jwgoerlich"&gt;jwgoerlich&lt;/a&gt;: Generally 2. Depends on the email topic.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href="http://twitter.com/whitenheimer"&gt;whitenheimer&lt;/a&gt;: @RackerHacker just one, some of them aren&amp;rsquo;t worth putting&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href="http://twitter.com/russjohnson"&gt;russjohnson&lt;/a&gt;: @RackerHacker Currently none but have done upto 4&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href="http://twitter.com/rbp1987"&gt;rbp1987&lt;/a&gt;: @RackerHacker I only put the most relevant or the highest level of cert that i have. Why what do you do at the moment?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href="http://twitter.com/hotshotsphoto"&gt;hotshotsphoto&lt;/a&gt;: @RackerHacker MCP, MCP+I, CNA MCSE ITIL Practitioner….but only when I&amp;rsquo;m working in the IT field&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;There were quite a few that were strongly worded or humorous:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href="http://twitter.com/rjamestaylor"&gt;rjamestaylor&lt;/a&gt;: @RackerHacker I hate them - R Taylor, SCJP, MCP, RHCP, BSci, SAG&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href="http://twitter.com/mshuler"&gt;mshuler&lt;/a&gt;: .@RackerHacker I regard email signatures similar to SUVs - the size is relevant to the compensation factor&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href="http://twitter.com/iota"&gt;iota&lt;/a&gt;: @RackerHacker zero; as number of reported certifications increase, respect for sender decreases - my law #1514&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href="http://twitter.com/raykrueger"&gt;raykrueger&lt;/a&gt;: @RackerHacker &lt;a href="http://theoatmeal.com/comics/email"&gt;http://theoatmeal.com/comics/email&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href="http://twitter.com/hjv"&gt;hjv&lt;/a&gt;: @RackerHacker I&amp;rsquo;m Ebay A+++ Certified.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href="http://twitter.com/unixdaemon"&gt;unixdaemon&lt;/a&gt;: @puppetmasterd @RackerHacker I&amp;rsquo;d love to see &amp;ldquo;Failed my MCP due to realising 10 minutes in that it would taint my soul. Forever.&amp;rdquo; on a CV.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href="http://twitter.com/swimsaftereatin"&gt;swimsaftereatin&lt;/a&gt;: @mshuler @RackerHacker And ASCII art is to the signature as a huge purple spoiler is to a pickup truck.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href="http://twitter.com/anoopbhat"&gt;anoopbhat&lt;/a&gt;: @RackerHacker none. unless there is a cert whose acronym is BADASS.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href="http://twitter.com/sarahvdv"&gt;sarahvdv&lt;/a&gt;: @RackerHacker None because I only have one and it&amp;rsquo;s almost embarrassing to put &amp;ldquo;CompTIA Network+ Certified&amp;rdquo; in my signature.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href="http://twitter.com/0x44"&gt;0x44&lt;/a&gt;: @RackerHacker Zero. Certifications are nerd short-hand for &amp;ldquo;Don&amp;rsquo;t hire me.&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I&amp;rsquo;m certainly not against certifications - they&amp;rsquo;re a good way for vendors to ensure that there are trained professionals that meet a certain set of minimum knowledge levels about their product. When you hire someone with a particular certification, you should be able to assume that they have this minimum knowledge level (for most certifications).&lt;/p&gt;
&lt;p&gt;However, a certification says absolutely nothing about how a job candidate has actually &lt;em&gt;applied these skills&lt;/em&gt; to their previous work. For example, consider a systems administrator with a CCNA. If you ask the job applicant something like &amp;ldquo;So, how much experience do you have working with Cisco&amp;rdquo; for a Cisco-heavy job position and they reply that they&amp;rsquo;ve set up a Cisco PIX a few times, but they mainly focus on Linux administration, then what is that certification worth to your company?&lt;/p&gt;
&lt;p&gt;As for e-mail signatures, I&amp;rsquo;d leave out the certifications. If you&amp;rsquo;re sending e-mails to coworkers that you already know, there shouldn&amp;rsquo;t any reason for you to &amp;ldquo;fluff&amp;rdquo; your signature with those abbreviations. They should already be familiar with your abilities and the addition of certifications to the e-mail doesn&amp;rsquo;t add anything valuable to the e-mail itself. If you&amp;rsquo;re sending e-mails to people you don&amp;rsquo;t know (especially for a job), it makes your e-mail look pretentious.&lt;/p&gt;</description></item><item><title>Idiot’s guide to OAuth logins for Twitter</title><link>https://major.io/p/idiots-guide-to-oauth-logins-for-twitter/</link><pubDate>Thu, 20 May 2010 01:26:07 +0000</pubDate><author>major@mhtx.net (Major Hayden)</author><guid>https://major.io/p/idiots-guide-to-oauth-logins-for-twitter/</guid><description>&lt;p&gt;It certainly shouldn&amp;rsquo;t be difficult, but I always have a tough time with &lt;a href="http://en.wikipedia.org/wiki/OAuth"&gt;OAuth&lt;/a&gt;. Twitter is &lt;a href="http://apiwiki.twitter.com/OAuth-FAQ#WhenareyougoingtoturnoffBasicAuth"&gt;dropping support for basic authentication&lt;/a&gt; on &lt;a href="http://countdowntooauth.com/"&gt;June 30th, 2010&lt;/a&gt;. I have some automated Twitter bots that need an upgrade, so I&amp;rsquo;ve been working on a quick solution to generate tokens for my scripts.&lt;/p&gt;
&lt;p&gt;I formulated a pretty simple script using &lt;a href="http://twitter.rubyforge.org/"&gt;John Nunemaker&amp;rsquo;s twitter gem&lt;/a&gt; that will get it done manually for any scripts you have that read from or update Twitter:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;#!/usr/bin/ruby
require &amp;#39;rubygems&amp;#39;
require &amp;#39;twitter&amp;#39;

# These credentials are specific to your *application* and not your *user*
# Get these credentials from Twitter directly: http://twitter.com/apps
application_token = &amp;#39;[this should be the shorter one]&amp;#39;
application_secret = &amp;#39;[this should be the longer one]&amp;#39;

oauth = Twitter::OAuth.new(application_token,application_secret)

request_token = oauth.request_token.token
request_secret = oauth.request_token.secret
puts &amp;#34;Request token =&amp;gt; #{request_token}&amp;#34;
puts &amp;#34;Request secret =&amp;gt; #{request_secret}&amp;#34;
puts &amp;#34;Authentication URL =&amp;gt; #{oauth.request_token.authorize_url}&amp;#34;

print &amp;#34;Provide the PIN that Twitter gave you here: &amp;#34;
pin = gets.chomp

oauth.authorize_from_request(request_token,request_secret,pin)
access_token = oauth.access_token.token
access_secret = oauth.access_token.secret
puts &amp;#34;Access token =&amp;gt; #{oauth.access_token.token}&amp;#34;
puts &amp;#34;Access secret =&amp;gt; #{oauth.access_token.secret}&amp;#34;

oauth.authorize_from_access(access_token, access_secret)
twitter = Twitter::Base.new(oauth)
puts twitter.friends_timeline(:count =&amp;gt; 1)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;When you run the script, it will give you a request token, request secret and a URL to visit. When you access the URL, you&amp;rsquo;ll be given a PIN. Type the PIN into the prompt and you&amp;rsquo;ll get your access token and secret. This is what you can use to continue authenticating with Twitter, so be sure to save the access token and secret.&lt;/p&gt;
&lt;p&gt;From then on, you should be able to login with a script like this:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;#!/usr/bin/ruby
require &amp;#39;rubygems&amp;#39;
require &amp;#39;twitter&amp;#39;

application_token = &amp;#39;[this should be the shorter one]&amp;#39;
application_secret = &amp;#39;[this should be the longer one]&amp;#39;

oauth = Twitter::OAuth.new(application_token,application_secret)

oauth.authorize_from_access(access_token, access_secret)
twitter = Twitter::Base.new(oauth)
puts twitter.friends_timeline(:count =&amp;gt; 1)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;I hope this helps!&lt;/p&gt;</description></item></channel></rss>