<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[roshan's website]]></title><description><![CDATA[I'm Roshan and this is my website. You can subscribe if you really want to get posts in your inbox.]]></description><link>https://roshansadanani.com/</link><image><url>https://roshansadanani.com/favicon.png</url><title>roshan&apos;s website</title><link>https://roshansadanani.com/</link></image><generator>Ghost 5.20</generator><lastBuildDate>Sat, 04 Apr 2026 05:02:25 GMT</lastBuildDate><atom:link href="https://roshansadanani.com/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[2021 content consumption, and some reflections]]></title><description><![CDATA[<p>For years, I&apos;ve used all sorts of quantified self + tracking apps: <a href="https://www.swarmapp.com/">Swarm</a> [0], <a href="https://trakt.tv/">Trakt</a>, <a href="https://last.fm/">last.fm</a>, etc. I&apos;ve never really <em>done</em> anything with these data besides the occasional revisit, but when thinking about ways to reflect on 2021 I thought it might be fun to think</p>]]></description><link>https://roshansadanani.com/2021-data-and-reflections/</link><guid isPermaLink="false">61cc24872992f00a09d44df7</guid><category><![CDATA[quantified-self]]></category><dc:creator><![CDATA[roshan]]></dc:creator><pubDate>Wed, 05 Jan 2022 16:00:00 GMT</pubDate><content:encoded><![CDATA[<p>For years, I&apos;ve used all sorts of quantified self + tracking apps: <a href="https://www.swarmapp.com/">Swarm</a> [0], <a href="https://trakt.tv/">Trakt</a>, <a href="https://last.fm/">last.fm</a>, etc. I&apos;ve never really <em>done</em> anything with these data besides the occasional revisit, but when thinking about ways to reflect on 2021 I thought it might be fun to think about my year in content consumption.</p><p>So &#x2013; let&apos;s get to it!</p><h1 id="highlights">Highlights</h1><ul><li>I read <a href="https://www.goodreads.com/user/year_in_books/2021/3406351">9 books</a> this year; well short of my usual goal of 24. </li><li>I highlighted ~20 web articles, and read many more that didn&apos;t make it into <a href="https://readwise.io">Readwise</a>. </li><li>Speaking of Readwise, my collection has grown to include 38 books, 40 articles, and 59 tweet threads. Most of those are things I enjoy revisiting as part of regular reviews which to me is good signal that I&apos;m saving and reading good content. </li><li>This was a big year for me in TV + movies &#x2013;&#xA0;I watched 126 hours of movies, and 277 hours of TV. </li><li>I played a bunch of video games this year; I don&apos;t keep dedicated stats on gaming but sharing some reflections below.</li><li>I listened to a ton of music: 45,881 minutes (= 764 hours = 31 days) across 2,852 different artists according to my Spotify Wrapped + last.fm data [1] .</li><li>While not content, I managed to take 5 flight-enabled trips this year, and added Costa Rica + Dominican Republic to my list of visited countries.</li></ul><h1 id="reflections">Reflections</h1><h2 id="books">Books</h2><p><strong>Fiction: </strong>Brandon Sanderson continues to be one of my favorite authors &#x2013;&#xA0;<a href="https://www.goodreads.com/book/show/17250966-rhythm-of-war">Rhythm of War </a>was my favorite book of 2021, with <a href="https://www.goodreads.com/book/show/54906250-project-hail-mary">Project Hail Mary</a> coming in at a close second.</p><p><strong>Non-Fiction:</strong> I really enjoyed <a href="https://www.goodreads.com/book/show/55361205-a-promised-land">A Promised Land</a> and <a href="https://www.goodreads.com/book/show/52950915-die-with-zero">Die With Zero</a>. I found myself repeatedly sharing concepts from the latter with friends this year.</p><h2 id="articles">Articles</h2><p>Perhaps unsurprisingly, a lot of the content I read + highlighted this year was about crypto. I noticed myself spending more time on Twitter than in the past, and some of that included saving some great threads </p><p>I&apos;ll come back and update this post with some favorite highlights from the year, but also thinking about a way to continuously share my top highlights from Readwise. More coming soon!</p><h2 id="movies-and-tv">Movies and TV</h2><p><strong>Movies:</strong> Baby Driver, Layer Cake, The Little Things, and Spider-Man: No Way Home were all highlights. I also rewatched a bunch of the Daniel Craig Bond movies, Edge of Tomorrow, the Bourne series, and new Star Trek movies.</p><p>I watched less Bollywood than usual, but rewatched Befikre, Yeh Jawaani Hai Deewani, and Zindagi Na Milegi Dobara and they all held up. </p><p>Interestingly, I only watched two movies more than once this year: Befikre, and The Matrix Resurrections. </p><p><strong>Shows</strong>: I rewatched all of New Girl around the middle of the year and loved it &#x2013; still one of my favorite sitcoms. I discovered Party Down this year and loved that too. Clarkson&apos;s Farm was more fun than I expected it to be, as were Loki, and Invincible. I also liked the latest seasons of You, Mythic Quest, See, and Ted Lasso.</p><p>I started but didn&apos;t finish the new Cowboy Bebop (meh), Shadow and Bone (meh), Atlanta (want to come back to this one), and Stumptown. </p><h2 id="games">Games</h2><p>At first I thought I ended the year without playing many games, but in retrospect the list ends up being a nicely long one:</p><ul><li>I kicked off the year with <a href="https://www.cyberpunk.net/us/en/">Cyberpunk 2077</a>. Bugs notwithstanding the game played really smoothly on Stadia and the story + world were great.</li><li>Despite my best attempts I can&apos;t get enough of <a href="https://factorio.com/">Factorio</a>, and revisited this off and on over the year.</li><li>I spent a decent amount of time playing <a href="https://www.valheimgame.com/">Valheim</a> with some friends when it at the peak of its popularity. While fun, we lost steam after the first few bosses.</li><li>Played a small amount of <a href="https://www.xbox.com/en-US/games/the-ascent">The Ascent</a> with a friend and hoping to revisit soon.</li><li>A friend introduced me to <a href="https://www.deeprockgalactic.com/">Deep Rock Galactic</a> and it&apos;s been a fun co-operative game.</li><li>I dabbled (&lt;20h) with <a href="https://www.crusaderkings.com/en">Crusader Kings 3</a> and <a href="https://www.ubisoft.com/en-us/game/assassins-creed/valhalla">Assassin&apos;s Creed Valhalla</a>, but haven&apos;t felt the urge to spend more time on either. </li><li>Started playing <a href="https://www.ea.com/games/it-takes-two">It Takes Two</a> over the winter holiday break; it&apos;s very good.</li></ul><p>I also continued playing tabletop RPGs with a group of friends that&apos;s met mostly-weekly for a few years now (we&apos;re lucky!). This year we switched from a long stretch of <a href="https://dnd.wizards.com/">D&amp;D 5E</a> to <a href="https://www.evilhat.com/home/blades-in-the-dark/">Blades in the Dark</a>. </p><h2 id="music">Music</h2><p>The Spotify screenshot in [1] tells a good story of my music experiences this year, but a few notes:</p><p><strong>Western:</strong> I listened to a lot of The Midnight, Clean Bandit, Childish Gambino, and The Weeknd. </p><p><strong>Eastern: </strong>I continue to <strong>love</strong> the amount and quality of indie (non-soundtrack) music coming out of South Asia. Over 2021 my daily listening swung strongly toward Desi music; just guessing, I probably average 70% Desi : 30% Western these days. That said, Bollywood soundtracks generally disappointed me this year, but I spent less time going through new releases than usual. <a href="https://en.wikipedia.org/wiki/Shershaah#Soundtrack">Shershaah</a> was a notable exception. &#xA0;</p><h2 id="places">Places</h2><p>My travel highlights this year included attending several friends&apos; weddings, spending a week in Costa Rica, and otherwise staying close to home.</p><h1 id="recap">Recap</h1><p>Thinking a bit about major trends and things to tweak in 2022:</p><ul><li>I noticed myself substituting watched content for read content; creating a more consistent reading habit is important to me and hoping to get closer to my 24-book goal this year by watching fewer things. </li><li>I developed a bit more comfort abandoning books that didn&apos;t hold my attention &#x2013; I hope to continue doing that; there are so many good books out there that I&apos;ll never read them all.</li><li>I&apos;ve realized the type of gaming I enjoy the most is with friends. I usually leave long single-player gaming sessions feeling like I could have done something &quot;better&quot; with the time, even if I enjoy playing in the moment. It might make sense to track hours of games played as a stat in 2022. </li></ul><hr><p>[0] I can count on one hand the number of people I know who still use Foursquare / Swarm....</p><p>[1] My last.fm year in review: <a href="https://www.last.fm/user/blattus/listening-report/year">https://www.last.fm/user/blattus/listening-report/year</a>; and here&apos;s my Spotify Wrapped screenshot</p><figure class="kg-card kg-image-card"><img src="https://roshansadanani.com/content/images/2021/12/IMG_4758.JPG" class="kg-image" alt loading="lazy" width="1080" height="1920" srcset="https://roshansadanani.com/content/images/size/w600/2021/12/IMG_4758.JPG 600w, https://roshansadanani.com/content/images/size/w1000/2021/12/IMG_4758.JPG 1000w, https://roshansadanani.com/content/images/2021/12/IMG_4758.JPG 1080w" sizes="(min-width: 720px) 720px"></figure><p>[2] This tweet from 2019 still holds true:</p><figure class="kg-card kg-embed-card"><blockquote class="twitter-tweet"><p lang="en" dir="ltr">Gully Boy wins this award handily, but pretty sure Kalank is my second favorite Bollywood soundtrack of 2019 (so far)</p>&#x2014; Roshan Sadanani (@blattus) <a href="https://twitter.com/blattus/status/1175591588329734144?ref_src=twsrc%5Etfw">September 22, 2019</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
</figure>]]></content:encoded></item><item><title><![CDATA[Mini-review: 14" MacBook Pro]]></title><description><![CDATA[<p>I&apos;ve been using a 14&quot; MacBook Pro (the entry-level base model) as my primary computing device for the past week or so. Some thoughts on the experience so far:</p><ul><li>I upgraded from a <a href="https://support.apple.com/kb/sp757?locale=en_US">2017 12&quot; MacBook</a> and the differences are noticeable &#x2013;&#xA0;I miss the</li></ul>]]></description><link>https://roshansadanani.com/mini-review-14-macbook-pro/</link><guid isPermaLink="false">61a2bbe562302d19e1d53be4</guid><category><![CDATA[reviews]]></category><dc:creator><![CDATA[roshan]]></dc:creator><pubDate>Sun, 28 Nov 2021 19:04:40 GMT</pubDate><content:encoded><![CDATA[<p>I&apos;ve been using a 14&quot; MacBook Pro (the entry-level base model) as my primary computing device for the past week or so. Some thoughts on the experience so far:</p><ul><li>I upgraded from a <a href="https://support.apple.com/kb/sp757?locale=en_US">2017 12&quot; MacBook</a> and the differences are noticeable &#x2013;&#xA0;I miss the portability of the 12&quot;, but going from a low-powered Intel processor to the M1 Pro is like night and day.</li><li>I had an M1 Mac Mini that I traded in but it didn&apos;t get as much use as expected with its desktop form factor. I think I&apos;ve validated that a powerful laptop that can be docked when I need it to be is the sweet spot for me. Using the M1 Mini for a few months also gave me enough confidence that the base model 14&quot; would be fine for my needs. </li><li>The boxy shape is fine. I didn&apos;t really need the additional HDMI / SD ports but they&apos;re nice to have. MagSafe charging is a nice plus but I have enough USB-C charging cables that it&apos;s not a dealbreaker either way. </li><li>I like the additional key travel on the keyboard but it&apos;s taking some getting used to. Full-sized function keys mean that the trackpad height is reduced, but quickly got used to that as well. TouchID is nice, if only because it saves me from lots of typing to unlock 1Password multiple times per day.</li><li>The display is excellent as expected based on reviews and HDR content looks great. The <em>speakers</em> though are really quite amazing and the hardware component I&apos;m most (pleasantly) surprised by. </li><li>Many of my commonly-used apps (Roam, Notion, Slack) are much faster, and more usable as a result &#x2013; to the point where I wonder if eng teams at those companies won&apos;t realize how much older devices are excluded if they switch to M1 for internal development and testing.</li><li>The battery life is amazingly good. I&apos;ve had to <em>try</em> to deplete the battery in a full day&apos;s use and despite my best efforts I can&apos;t. </li></ul>]]></content:encoded></item><item><title><![CDATA[Tales from Voyager – the archive]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>Back in 2015 before the explosion of Substack, I felt inspired to create an email newsletter for some close friends that I named &quot;Tales from Voyager&quot; (TFV).</p>
<p>What started as an ambitious project to send a weekly newsletter resulted in 4ish total emails that I sent from October</p>]]></description><link>https://roshansadanani.com/tales-from-voyager-the-archive/</link><guid isPermaLink="false">61a1daa262302d19e1d53a0f</guid><category><![CDATA[tales-from-voyager]]></category><dc:creator><![CDATA[roshan]]></dc:creator><pubDate>Sat, 27 Nov 2021 08:05:08 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>Back in 2015 before the explosion of Substack, I felt inspired to create an email newsletter for some close friends that I named &quot;Tales from Voyager&quot; (TFV).</p>
<p>What started as an ambitious project to send a weekly newsletter resulted in 4ish total emails that I sent from October 2015 to March 2016. 25-year-old me managed to build an audience of 22 close friends who subscribed, and sometimes even read + replied.</p>
<p>The newsletter was powered by <a href="https://tinyletter.com/">Tinyletter</a> which to this day is a great little free newsletter service. I felt compelled to save those emails and share them here for posterity. Content is unedited from the original (aside from fixing some links and formatting), so take that as you will.</p>
<p>To keep timelines on this blog in sync, I&apos;ve backdated the post date for each email to the original date of publication.</p>
<p>If you&apos;re interested, you can <a href="https://roshansadanani.com/tag/tales-from-voyager/">browse the collection</a>.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Automating Apartment Hunting in San Francisco]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>I&apos;ve lived in San Francisco for a little over 3 years and have &quot;recently&quot; been looking for my own apartment. The process is more difficult than it should be -- in addition to high rent prices, apartments move <em>extremely</em> quickly: people bring application packets + credit checks</p>]]></description><link>https://roshansadanani.com/automating-apartment-hunting-in-san-francisco/</link><guid isPermaLink="false">61a194f062302d19e1d5398a</guid><dc:creator><![CDATA[roshan]]></dc:creator><pubDate>Sun, 09 Jun 2019 01:16:00 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>I&apos;ve lived in San Francisco for a little over 3 years and have &quot;recently&quot; been looking for my own apartment. The process is more difficult than it should be -- in addition to high rent prices, apartments move <em>extremely</em> quickly: people bring application packets + credit checks to showings, offer multiple months of rent up front, and in some cases offer to pay more than the listed rental price.</p>
<p>I&apos;ve looked through apartment listings for the past few months, which typically includes browsing listings on Craigslist and sometimes Padmapper, Hotpads, and Zillow [0]. During this search I&apos;ve had the added luxury of not needing to move quickly. I live in a great apartment and neighborhood with some awesome roommates on a month-to-month lease. Moving has been about finding my own place, and I&apos;ve hoped that having the flexiblity of time will make it easier to find a deal...whatever that means today in San Francisco.</p>
<p>However navigating Craigslist quickly got onerous. I tried copying + pasting listings into a google sheet and flagging some for follow-up but found myself needing to dedicate time to searching for apartments, deciding which were worth pursuing, and reaching out to make an introduction.</p>
<p>I recently discovered <a href="https://github.com/juliomalegria/python-craigslist">python-craigslist</a> and figured that if I could programmatically access Craigslist data I could at least provide myself with a nice, passive way to view apartment listings, and at best accelerate my search and beat the tens of people who apply for each unit (all while gettting to work on a fun python project!)</p>
<p>A lot of credit goes to <a href="https://www.dataquest.io/blog/apartment-finding-slackbot/">this post on dataquest.io</a> which helped me think through the steps to get something like this up and running.</p>
<h2 id="requirements">Requirements</h2>
<p>A few constraints and assumptions on how I wanted to tackle this project:</p>
<ul>
<li>I would focus on using Craigslist as the source of listing data</li>
<li>I want to live in some specific neighborhoods in San Francisco so I limited the search to apartments in those locations</li>
<li>I&apos;d really like some way to view the results at my desk or on mobile. I&apos;ve used Discord as a notification engine for some apps in the past, and thought it would be fun to use it for this too [1]</li>
</ul>
<h2 id="building-things">Building Things</h2>
<p>I decided I&apos;d prefer to design own approach and write my own code (versus copying + pasting from the above links) so this could be a educational experience for me. For context, I&apos;ve been working on learning Python and have found that the best motivation to keep going is making things I&apos;ll really use.</p>
<p>To start, I  outlined the following rough steps:</p>
<ol>
<li>Get data from Craigslist</li>
<li>Get an image showing where the listing is on a map</li>
<li>Post the result to a Discord channel</li>
</ol>
<h2 id="apartment-listings">Apartment listings</h2>
<p>The <code>python-craigslist</code> module is really great and does all of the work here. It&apos;s well-documented and, while I wish it included some additional details for an individual listing like laundry specifics, I&apos;m happy with the result. Getting data from the API is straightforward:</p>
<pre><code class="language-python">housing = CraigslistHousing(site=&apos;sfbay&apos;, area=&apos;sfc&apos;, category=&apos;apa&apos;,
	filters={&apos;posted_today&apos; : True, &apos;min_price&apos;: 2000, 
	&apos;max_price&apos;: 3600, &apos;min_bedrooms&apos;: 1})

for result in housing.get_results(sort_by=&apos;newest&apos;, geotagged=True):
	print(result)
</code></pre>
<p>Unsurprisingly, each result is JSON:</p>
<pre><code>{&apos;id&apos;: &apos;1234567890&apos;, &apos;repost_of&apos;: None, &apos;name&apos;: &apos;omg it&apos;s an apartment!, &apos;url&apos;: &apos;https://sfbay.craigslist.org/sfc/apa/d/omg-its-an-apartment/1234567890.html&apos;, &apos;datetime&apos;: &apos;2019-01-01 00:00&apos;, &apos;price&apos;: &apos;$2200&apos;, &apos;where&apos;: &apos;San Francisco, CA&apos;, &apos;has_image&apos;: True, &apos;has_map&apos;: True, &apos;geotag&apos;: (37.3, -121.9), &apos;bedrooms&apos;: &apos;1&apos;, &apos;area&apos;: &apos;mission&apos;}
</code></pre>
<p>I didn&apos;t like some of the names from the response so I made a <code>listings</code> dictionary to rename some fields and to post-process some of the data:</p>
<pre><code class="language-python">listing = {}
listing[&apos;craigslist_id&apos;] = result[&apos;id&apos;]
listing[&apos;craigslist_url&apos;] = result[&apos;url&apos;]
listing[&apos;posted_on&apos;] = result[&apos;datetime&apos;]
listing[&apos;description&apos;] = result[&apos;name&apos;]
# price always has a leading &apos;$&apos; so strip the leading character
listing[&apos;price&apos;] = int(result[&apos;price&apos;][1:])	
# the neighborhood data is sometimes null
listing[&apos;neighborhood&apos;] = str.lower(result[&apos;where&apos;]) if result[&apos;where&apos;] else &apos;&apos; 
listing[&apos;num_bedrooms&apos;] = result[&apos;bedrooms&apos;]
listing[&apos;sqft&apos;] = result[&apos;area&apos;]
listing[&apos;latitude&apos;] = result[&apos;geotag&apos;][0]
listing[&apos;longitude&apos;] = result[&apos;geotag&apos;][1]
</code></pre>
<p>Notably, the listing data includes location data (lat/long) if the person who created the listing provided it. This is great! I usually browse listings using a map view and like seeing where an apartment is. At first I decided I could just click through to the listing URL to see a map along with the listing details, but thought there had to be a way to automate this too.</p>
<h2 id="mapping-the-listings">Mapping the listings</h2>
<p>I came across the <a href="https://www.mapbox.com">Mapbox</a> API documentation a few weeks ago and filed it away in my ever increasing list of &quot;products I&apos;d like to play with someday&quot;. The timing was serendipitous as I realized I could use the location data from each apartment listing + Mapbox to generate a map, which makes it <em>much</em> easier to see where an apartment is at a glance. Unfortunately the Craigslist map data isn&apos;t perfect or is sometimes missing, but this still seemed better than having to click on individual links [2].</p>
<p>Mapbox has a <a href="https://github.com/mapbox/mapbox-sdk-py">python package</a> that makes this straightforward to implement. After browsing the API docs a bit I noticed I could have just constructed a URL with the appropriate parameters and been done with it, but I ended up using the python package because of how easy it was to set up (and how as a result I didn&apos;t have to deal with URL character + formatting issues)</p>
<pre><code class="language-python">import config
from mapbox import Static

def get_map(latitude,longitude):
	service = Static(access_token=config.MAPBOX_ACCESS_TOKEN)

	point_on_map = {
		&apos;type&apos; : &apos;Feature&apos;,
		&apos;properties&apos; : {&apos;name&apos; : &apos;point&apos;},
		&apos;geometry&apos; : {
			&apos;type&apos; : &apos;Point&apos;,
			&apos;coordinates&apos; : [-122.4267, 37.7689]
		}
	}

	response = service.image(&apos;mapbox.streets&apos;, retina=True, 
		features=point_on_map, 
		lon=-122.4267, lat=37.7689, z=15)
	
	return response.url
</code></pre>
<p>This code does a few things:</p>
<ul>
<li>Initialize <code>mapbox</code> with my API key (I&apos;m storing secrets in <code>config.py</code> to keep those separate from the code)</li>
<li>Define a point on the map with a style and some coordinates</li>
<li>Make the request to Mapbox specifying: the map type, that I want a high-quality &quot;retina&quot; image, the previously-defined point to place on the map, and some coordinates to bound the map</li>
</ul>
<p>For example, here&apos;s a map of San Francisco generated using a longitude of <code>-122.4267</code>, latitude of <code>37.7689</code>, and zoom of <code>z=12</code>. After playing around with the zoom value I settled on <code>z=15</code> for individual listings.</p>
<p><img src="https://roshansadanani.com/content/images/2021/11/sf-example.png" alt="sf-example" loading="lazy"></p>
<p><code>response.url</code> is an image, and after testing this with a few listings everything looked good! The next step was to pipe the listing data to Discord to receive alerts.</p>
<h2 id="posting-to-discord">Posting to Discord</h2>
<p>Discord makes it super easy to set up alerts using <a href="https://support.discordapp.com/hc/en-us/articles/228383668-Intro-to-Webhooks">webhooks</a> and I was surprised at how customizable an individual notification can be. I found this <a href="https://birdie0.github.io/discord-webhooks-guide/">Discord webhooks guide</a> invaluable when designing the formatting for the notification.</p>
<p>Once I set up a webhook endpoint, I used <a href="https://www.getpostman.com/">Postman</a> to start testing and customizing colors, text formatting, etc. I usually default to <code>cURL</code> or <code>requests</code> for API testing but the ease of edit --&gt; make request made this a great use case for Postman.</p>
<p>In the end I settled on the following raw JSON for the webhook endpoint:</p>
<pre><code class="language-json">{
	&quot;embeds&quot; : [{
		&quot;title&quot; : &quot;${{price}} | {{description}}&quot;,
		&quot;url&quot; : &quot;{{craigslist_url}}&quot;,
		&quot;fields&quot; : [
			{
				&quot;name&quot; : &quot;Bedrooms&quot;,
				&quot;value&quot; : &quot;{{num_bedrooms}}&quot;,
				&quot;inline&quot; : true
			},
			{
				&quot;name&quot; : &quot;Square Feet&quot;,
				&quot;value&quot; : &quot;{{num_sqft}}&quot;,
				&quot;inline&quot; : true
			}
		],
		&quot;thumbnail&quot; : {
			&quot;url&quot; : &quot;{{map_url}}&quot;
		},
		&quot;footer&quot; : {
			&quot;text&quot; : &quot;posted {{datetime}} | {{neighborhood}}&quot;,
			&quot;icon_url&quot; : &quot;https://i.imgur.com/r8jnedb.png&quot;
		},
		&quot;color&quot; : 14431557
	}]
}
</code></pre>
<p>And the result:</p>
<p><img src="https://roshansadanani.com/content/images/2021/11/discord-notification-example.png" alt="discord-notification-example" loading="lazy"></p>
<p>On colors -- I thought it would be fun to change the color of the Discord notification to add an additional visual indicator when glancing through the list. I went with green/yellow/red for &quot;good&quot;/&quot;stretch&quot;/&quot;&#x1F4B8;&#x1F62D;&quot; depending on where a given listing falls within my desired price range. I thought about further restricting the min and max prices when getting listing data but wanted to give myself a chance to see apartments <em>outside</em> of my budget, just in case there&apos;s a dream apartment out there that I&apos;d regret passing over. I added the specific values to <code>settings.py</code>, and used <a href="https://www.spycolor.com">SpyColor</a> to convert hex color values to the decimal values required by Discord&apos;s API.</p>
<pre><code class="language-python"># settings.py
green_max = 3000
yellow_max = 3300

# main.py
if listing[&apos;price&apos;] &lt;= settings.green_max:
	color = 2664261  # green
elif listing[&apos;price&apos;] &gt; settings.green_max and listing[&apos;price&apos;] &lt;= settings.yellow_max:
	color = 16761095 # yellow
elif listing[&apos;price&apos;] &gt; settings.yellow_max:
	color = 14431557 # red
</code></pre>
<p>(Yes those price ranges are a bit ridiculous, but it is San Francisco after all)</p>
<p>After checking for which color to use, sending the notification is as easy as using <code>requests.post()</code> with the webhook URL and notification data JSON.</p>
<h2 id="duplicate-detection-decision-making-and-logging">Duplicate detection, decision making, and logging</h2>
<p>To avoid duplicates I decided to save each retrieved listing to a database with the Craigslist listing ID as a key. I used <code>sqlite</code> with the built-in <code>sqlite3</code> python module and created a <code>databases.py</code> helper script that has functions for inserting, retrieving, and updating records. When I retrieve listings I first check the listing ID against the database to see if there&apos;s a duplicate. If there is, the listing is skipped (with the assumption that it was previously processed).</p>
<p>Next, while I&apos;m <em>interested</em> in seeing apartments from across the city I do have some neighborhoods that I&apos;d rather not move to for commute or other reasons. I built a rudimentary filter by specifying a <code>neighborhood_blacklist</code> in a new <code>settings.py</code> file [3].</p>
<p>This allowed me to be a bit more selective with my notifications and came with an extra benefit -- it became quickly apparent that filtering based on neighborhood is far from perfect since the details are provided by the person who created the listing. These data are often inaccurate (or flat out wrong). To hedge against this I decided on the following approach:</p>
<ul>
<li>Store each listing</li>
<li>If the listing provided neighborhood is in the blacklist, don&apos;t notify me to avoid the noise</li>
<li>Otherwise, notify and also update the listing record in the database to indicate that a message was sent</li>
<li>Periodically manually review the &quot;un-notified&quot; listings to see if my filtering is too aggressive and adjust to taste</li>
</ul>
<p>The blacklisting logic looks like this:</p>
<pre><code class="language-python"># settings.py
neighborhood_blacklist = [&apos;inner richmond&apos;, &apos;outer richmond&apos;, &apos;richmond&apos;, 
				&apos;seacliff&apos;, &apos;tenderloin&apos;, &apos;inner sunset&apos;, 
				&apos;outer sunset&apos;, &apos;sunset&apos;, &apos;bayview&apos;, &apos;parkside&apos;]

# main.py
if any(x in listing[&apos;neighborhood&apos;] for x in settings.neighborhood_blacklist):
	notify = False
else:
	notify = True
</code></pre>
<h2 id="operationalizing">Operationalizing</h2>
<p>I ran the script a few times scoped to different price ranges and verified everything was working as expected. Just in case, I also added some light logging at this point to help with future debugging. The only thing remaining was to schedule the script to run automatically.</p>
<p>Separately from this project I&apos;ve been working on setting up a container / VM selfhosting environment on my own hardware. This project was a great candidate to host on my <a href="https://www.proxmox.com/en/">Proxmox</a> setup. There were a few ways to automate this but in the end I settled for hosting the code in an LXC container along with a cron job to run it periodically [4].</p>
<p>I&apos;ll spare the specifics of running this in my lab, but at a high level this included:</p>
<ul>
<li>spinning up a new container on my Proxmox host</li>
<li><code>git pull</code>-ing the source code onto the container</li>
<li>adding secrets to <code>config.py</code></li>
<li>ensuring any dependencies (python, requirements) were installed</li>
<li>setting up a cron job to run the main script hourly, e.g.,:</li>
</ul>
<pre><code class="language-bash"># crontab -e
1 * * * * python3 /path/to/oikos.py
</code></pre>
<p>I found <a href="https://crontab.guru/">crontab guru</a> to be a helpful resource in figuring out how to schedule cron jobs, especially for people like me who are somewhat new to this. I could have alternatively deployed this to a DigitalOcean box or Heroku but this ended up being just as easy (and free!)</p>
<p>And that&apos;s it! I now get hourly, cross-platform notifications for new apartment listings around San Francisco in my price range, with some nice maps and color-coding to make it easy to filter things visually. I&apos;ve also started tagging listings in Discord by reacting with an emoji if I want to follow up. This has already been a huge help in my search: it&apos;s easy to browse Discord for listings that I previously flagged for follow-up when I have some downtime. I don&apos;t have to deal with having 10s of browser tabs open when searching for apartments, and I&apos;ve started building a database of listing data that I can hopefully leverage to have a better understanding of housing market trends (and what a really is a &quot;deal&quot;).</p>
<p><img src="https://roshansadanani.com/content/images/2021/11/discord-notifications-with-reactions.png" alt="discord-notifications-with-reactions" loading="lazy"></p>
<h2 id="whats-next">What&apos;s next</h2>
<p>The code for this project is available on <a href="https://github.com/blattus/oikos">GitHub</a> in case you find it useful. Python 3.6+ is required. I&apos;d really appreciate any comments on the code and structure!</p>
<h3 id="follow-ups">Follow-ups</h3>
<ul>
<li>Some Craigslist listings can be fake (and it&apos;s easy to tell which when reading the listing details). It might be worth adding some logic to either (a) detect likely fake posts or (b) adding support for a &quot;blacklist&quot; feature in Discord that lets me mark a listing as fake.</li>
<li>Many of the concepts here are extensible. I mentioned that I&apos;ve used Discord for notifications before but in the past it&apos;s usually been with some software that has a &quot;Discord notification&quot; setting pre-defined. If anything I&apos;m even more bullish on using Discord for custom app + service notifications after learning more about the webhook customization options</li>
</ul>
<h2 id="notes">Notes</h2>
<p>[0] I can pretty confidently say after months of browsing apartment data that virtually all listings available on other services are posted to Craigslist. This made me feel pretty good about defaulting to this versus other providers / APIs.</p>
<p>[1] I evaluated a few different notification services prior to deciding on Discord and that process is likely worth its own discussion. In the end I chose Discord for two reasons: unlimited integrations (unlike Slack) and a highly customizable, very simple webhook API.</p>
<p>[2] While learning about Mapbox I wasn&apos;t quite able to decipher the specifics of their free tier but the numbers mentioned on <a href="https://www.mapbox.com/pricing/">https://www.mapbox.com/pricing/</a> seemed much higher than I would need for this project.</p>
<p>[3] I did this to ensure secrets remained isolated in <code>config.py</code> while also creating a single place to edit variables I might want to modify later. I&apos;m <em>not</em> sure if this is the best or recommended approach for settings + configuration management but it worked for me.</p>
<p>[4] A post on my homelab setup is coming soon!</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[TFV #4 – So about that whole "write every week" thing....]]></title><description><![CDATA[<p><em>Note: This is one of a small series of emails I sent as part of an email newsletter project in 2015-2016 called Tales from Voyager. <a href="https://roshansadanani.com/tales-from-voyager-the-archive/">Learn more</a>, or <a href="https://roshansadanani.com/tag/tales-from-voyager/">browse the full collection</a>. </em></p><hr><p>It&apos;s been a while, eh? Better late than never, I suppose.</p><p>----</p><p>About a year ago</p>]]></description><link>https://roshansadanani.com/tfv-4/</link><guid isPermaLink="false">61a1e38b62302d19e1d53b30</guid><category><![CDATA[tales-from-voyager]]></category><dc:creator><![CDATA[roshan]]></dc:creator><pubDate>Tue, 15 Mar 2016 06:30:00 GMT</pubDate><content:encoded><![CDATA[<p><em>Note: This is one of a small series of emails I sent as part of an email newsletter project in 2015-2016 called Tales from Voyager. <a href="https://roshansadanani.com/tales-from-voyager-the-archive/">Learn more</a>, or <a href="https://roshansadanani.com/tag/tales-from-voyager/">browse the full collection</a>. </em></p><hr><p>It&apos;s been a while, eh? Better late than never, I suppose.</p><p>----</p><p>About a year ago I was in Boston for a (gasp) <a href="http://east.paxsite.com/">gaming convention</a>. While there, I had the chance to catch up with a friend of mine who lives in the city, which involved taking the T back and forth a few times. I&apos;ve ridden the T before, but there&apos;s one memory from that trip that stands out the most, and it isn&apos;t related to the convention at all, but to public transportation. </p><p>The second morning I was there, I was waiting at the Harvard Square T stop for an inbound red line train when I heard some music from the other end of the station platform. Metropolitan public transit systems and busking are about as complimentary as peanut butter and jelly, so at first I didn&apos;t really pay attention; but, after a few minutes of &quot;background listening&quot;, something about the melody and the musician&apos;s obvious talent made me intrigued. </p><p><a href="https://www.youtube.com/watch?v=PPPOyULb2ss">This</a> is a video of the guy in question (not taken by me). Go ahead and click on it and let the music start before coming back to read the rest of this. &#xA0; </p><p>I&apos;ve heard buskers before in many cities around the world, but for whatever reason that music just took a hold of me. I started walking over to the other end of the platform where I heard the music coming from to offer a few bucks (in what for me is an unfortunately rare contribution to public art). But, just as I was gearing up to throw a couple of dollar bills into whatever instrument case or hat-like receptacle the musician had, the train showed up, and I dashed to get on board. </p><p>It was about a 20 minute ride to my next stop that morning, and for the entire duration of the trip I couldn&apos;t help but think about the musician who I just missed. The song he was playing was stuck in my head, and I realized I wanted, nay needed to know the name of this artist. I debated going back to the Harvard Square stop, but instead took to my smartphone, thinking that someone as talented as that person was either (a) <a href="https://www.youtube.com/watch?v=hnOPu0_YWhw">not a normal busker</a>, or (b) good enough to be recognized by others. &#xA0;</p><p>Amazingly enough, Twitter came through. I searched for a combination of &quot;guitar&quot; and &quot;boston T&quot; and &quot;boston subway&quot; and all kinds of related things, until I came across one name: Garv Bomjan. If that wasn&apos;t amazing enough, I quickly learned that he was on Spotify, and that one of the songs on his only album was the one I heard at the subway stop a few minutes before. Surprised but satisfied, I proceeded to enjoy the rest of my weekend, and once it wound to a close spent some time listening to whatever I could find by Bomjan. </p><p>After I got home from Boston a few days later, I spent some time reflecting about that moment and how utterly serendipitous it was. From being in the right place at the right time to hear that music, to successfully finding the artist&apos;s name via Twitter, to being able to find a real album he had recorded. Today&apos;s &quot;listen&quot; link is to the song I heard that morning, called &quot;It&apos;s Maya&quot;; I still listen to it all the time. It reminds me of travel, and the amazing accidental discoveries that come with it. <br><br>I believe Garv Bomjan still plays at the Harvard Square stop pretty regularly. If you&apos;re ever in the area with a few minutes to spare, he&apos;s worth checking out.</p><p>----<br><br><strong>Watch</strong><br>John Oliver has been on a tear lately, and I have lately felt a need to share his gospel (just in case it hasn&apos;t been shared enough). So, I present some of my favorite John Oliver main bits:<br><br><a href="https://www.youtube.com/watch?v=DnpO_RTSNmQ">John Oliver on Donald Trump</a><br><a href="https://www.youtube.com/watch?v=4Z4j2CrJRn4">John Oliver on DC Statehood</a> (woot!)<br><a href="https://www.youtube.com/watch?v=VdLf4fihP78">John Oliver on Fashion</a><br><a href="https://www.youtube.com/watch?v=br0NW9ufUUw">John Oliver on DST</a><br><br><strong>Read</strong><br>One Hundred Years of Solitude is one of my favorite books. I first read it in freshman year of high school when assigned an author at random for a book report project, and have re-read it many times since, in both academic and non-academic contexts. Vanity Fair recently did <a href="http://www.vanityfair.com/culture/2015/12/gabriel-garcia-marquez-one-hundred-years-of-solitude-history">a great piece</a> on the book and its author to commemorate its 50th anniversary that is worth a read itself.<br><br><strong>Listen</strong><br>As promised, &quot;It&apos;s Maya&quot; by Garv Bomjan (<a href="https://www.youtube.com/watch?v=LtqnAhBeKCg">YouTube</a> | <a href="https://open.spotify.com/track/7j33DK27m3mB5ZaXxREt9t">Spotify</a>). I know I mentioned this one song in particular, but the whole album is great - it has a really cool Eastern sound which I find unique given the use of layered guitars and a loop pedal for a lot of the music. <br><br><strong>Look</strong><br>Continuing on the theme of cool data visualizations - I have two space-related dataviz for you today:<br><br><a href="http://stuffin.space/">stuffin.space</a> - Besides winning the award for one of the coolest domain names ever, this is an amazing real-time 3-D map of objects orbiting Earth. It has some great pre-defined views using the &quot;groups&quot; button at the top-left of the page, such as being able to see all GPS satellites. You can also search for any space object by <a href="https://en.wikipedia.org/wiki/International_Designator">international designator</a> and determine where it is, e.g., the <a href="https://en.wikipedia.org/wiki/International_Space_Station">ISS</a> (1998-067A), random DirecTV satellites (2014-078B), or the <a href="https://en.wikipedia.org/wiki/Hubble_space_telescope">Hubble Space Telescope</a> (1990-037B).<br><br><a href="http://patriciogonzalezvivo.github.io/LineOfSight/?type=visible#4/38.72/-95.23">Line of Sight</a> - Similar to the above, but a 2-D view focused more on visible satellites over a particular point on Earth, so you can tell what that dot flying across the sky really is. <br><br>I have a few more cool visualizations lined up for future newsletters so if you like these stay tuned!<br><br>----<br><br>Until next time (which is hopefully sooner than the last time I said that), see you space cowboy.<br><br>-Roshan<br>@blattus</p>]]></content:encoded></item><item><title><![CDATA[TFV #3 – Write like the wind!]]></title><description><![CDATA[<p><em>Note: This is one of a small series of emails I sent as part of an email newsletter project in 2015-2016 called Tales from Voyager. <a href="https://roshansadanani.com/tales-from-voyager-the-archive/">Learn more</a>, or <a href="https://roshansadanani.com/tag/tales-from-voyager/">browse the full collection</a>. </em></p><hr><figure class="kg-card kg-image-card"><img src="https://roshansadanani.com/content/images/2021/11/image-6.png" class="kg-image" alt loading="lazy" width="640" height="426" srcset="https://roshansadanani.com/content/images/size/w600/2021/11/image-6.png 600w, https://roshansadanani.com/content/images/2021/11/image-6.png 640w"></figure><p>Most people who have met me (even acquaintances) are not surprised when I describe how much I like</p>]]></description><link>https://roshansadanani.com/tfv-3/</link><guid isPermaLink="false">61a1e24a62302d19e1d53aee</guid><category><![CDATA[tales-from-voyager]]></category><dc:creator><![CDATA[roshan]]></dc:creator><pubDate>Tue, 10 Nov 2015 04:13:00 GMT</pubDate><content:encoded><![CDATA[<p><em>Note: This is one of a small series of emails I sent as part of an email newsletter project in 2015-2016 called Tales from Voyager. <a href="https://roshansadanani.com/tales-from-voyager-the-archive/">Learn more</a>, or <a href="https://roshansadanani.com/tag/tales-from-voyager/">browse the full collection</a>. </em></p><hr><figure class="kg-card kg-image-card"><img src="https://roshansadanani.com/content/images/2021/11/image-6.png" class="kg-image" alt loading="lazy" width="640" height="426" srcset="https://roshansadanani.com/content/images/size/w600/2021/11/image-6.png 600w, https://roshansadanani.com/content/images/2021/11/image-6.png 640w"></figure><p>Most people who have met me (even acquaintances) are not surprised when I describe how much I like to preserve data for data&apos;s sake. Perhaps it&apos;s my pack-rat mentality, but I&apos;m one of a dwindling number of people I know who still checks in religiously on Foursquare, I track all of my music on last.fm, I track every beer I drink, I log every book I read, and I have intentionally typed up handwritten high school essays for fear of losing them 10 years from now.</p><p>But despite all of that data (which you and I both could argue I collect for no real reason), most people who know me relatively well are still surprised when they learn that the most valuable data of all is collected through a written journal. They&apos;re even more surprised when I explain that I&apos;ve maintained a journal regularly since 2006 - for the past 9 years (36%) of my life.</p><p>When it comes to the data, the reasons are sometimes practical. I&apos;ve found legitimate use from Foursquare, for instance, by viewing a calendar of my checkins when a friend can&apos;t remember the name of a place we visited together.</p><p>But I have come to realize that the real value in collecting data--and particularly in collecting the qualitative data that my journal has come to represent--is for reflection. </p><p>I first began my journal on a complete whim, in high school, as a simple low-tech Word document. I would title every post in bold (the word &quot;entry&quot; made the whole exercise seem overly childish and diary-like), and then write about whatever came to mind. As the years passed I wrote about everything: going to prom, that tough history paper I had to write, the surprisingly impossible IB math exam I was sure I failed, applying to college, making new friends, experiencing new (and old) relationships, getting my first job, and beyond. My journal quickly became my extended memory bank. </p><p>I sometimes deviated from the norm in an effort to preserve specific memories, as if to isolate the purity of a specific experience from the &quot;normal&quot; drudgery of the journal: when I spent two months in Tanzania on a volunteer project during a college summer, I started a new journal file so I could preserve those memories separately, and when I came back to the U.S.A. I switched back to the original file. I did the same when I went to Europe for the first time in 2013. </p><p>I told myself early on that I wouldn&apos;t set a schedule for my journaling habits - I was convinced that enforcing the habit would deter me from the effort and so instead I wrote whenever, and wherever, I felt like it. I have posts written in the middle of college classes when I should have been paying attention to a lecture, on flights across the country and around the world, and even some that I initially mashed out on a cell phone keyboard while nestled in a sleeping bag on someone&apos;s floor. I&apos;ve gone weeks and even months at a time without a new post, but the journal itself has persevered.<br><br>I also didn&apos;t set any limits for myself on structure, but over time I subconsciously adopted a common format across all of my posts: I would always title a post with the date and time, begin by writing about the most significant activities in my life since the last update (the &quot;recap&quot;), and then spend some time reflecting on those activities, or noodling on whatever had my mind occupied at the time. &#xA0;</p><p>Ironically it was my lack of desire to take the journaling experience &quot;seriously&quot; by creating habit and structure that has made it &#xA0;useful, and the most organic representation of myself over the past 9 years. As I wrote more and more, I started to realize that while in the middle of a difficult problem or when confused emotionally, writing things out helped me to think through whatever it was I was dealing with, big or small. A lot of my journal posts have me at some point saying &quot;I wanted to write through X,&quot; and concluding with how I felt more certain about a particular course of action. I also learned to learn about myself through my (very) informal journal posts, as I periodically browsed through old entries and bonded with &quot;past Roshan&quot; in ways that I never expected when I started writing back in high school. </p><p>To this day I still follow the same process I began using back in 2006, but not without some changes. My titles now include the location where the post is being written, often in a descriptive manner such as &quot;corner chair in the back of Tryst&quot;, or &quot;fight from STL - DCA&quot;. I&apos;ve switched to Evernote, instead of a Word document, which helps both organizationally and from a cross-platform standpoint. The topics are less &quot;teenage angst&quot; and more &quot;millenial life crisis&quot;. </p><p>But the intent and impact of my journal are the same - regardless of how I have changed over the years, my journal is still very much <em>mine</em>. I can write in slang, invent phrasing, and use obscure references to events. &quot;Future Roshan&quot; is my only audience, and so the entries are personal in a way precious few things are: seeing a souvenir from Prague evokes a memory associated with a time and place, but reading a journal entry written in a coffeeshop in Prague allows me to go deeper by reinterpreting the ideas and thoughts that <em>I myself</em> had at that time and in that place. </p><p>If nothing else, my journal has proven to me that for me, writing is a powerful tool. Now, when faced with a particularly sticky problem or the fear that I am losing sight of the things and people that have made me who I am, or the uncertainty of what will happen next, I write. </p><p>And usually, when the keyboard dust settles, I feel a sense of clarity. <br><br>----</p><p><br>If you haven&apos;t ever done any written reflection that was not motivated by a school assignment or application, I&apos;d highly recommend it. Don&apos;t worry about &quot;starting a journal&quot; or making a commitment to write, just try writing 500 words about your week (or a friend of yours, or something that&apos;s bothering you) after you finish reading this newsletter. I think you&apos;ll be surprised what you find. </p><p>----</p><p><strong>Watch</strong><br>Emirates Airlines recently made a super awesome commercial featuring a few guys who fly ACTUAL JETPACKS next to a plane. &apos;Nuff said. Click the picture below for the video</p><figure class="kg-card kg-image-card"><a href="https://www.youtube.com/watch?v=_VPvKl6ezyc"><img src="https://roshansadanani.com/content/images/2021/11/image-8.png" class="kg-image" alt loading="lazy" width="640" height="358" srcset="https://roshansadanani.com/content/images/size/w600/2021/11/image-8.png 600w, https://roshansadanani.com/content/images/2021/11/image-8.png 640w"></a></figure><p><strong>Read</strong><br>This week I have for you <a href="https://lareviewofbooks.org/essay/et-tu-too-kendrick-lamars-tpab-and-the-revival-of-black-postmodernism/">an article</a> which is titled &quot;<em>Et Tu, Too?: Kendrick Lamar&#x2019;s &#x201C;To Pimp a Butterfly&#x201D; and the Revival of Black Postmodernism</em>&quot;. . <br><br>It&apos;s a very dense, hopelessly verbose article about Kendrick Lamar&apos;s latest studio album. I would not call this well-written, but I would call it an attempt to apply philosophy to rap, and I can get behind the latter. Here&apos;s a small excerpt:</p><blockquote>&quot;Lamar&#x2019;s multivalent metaphors and penchant for morally ambiguous scenarios allow him to employ a postmodern relativity in teasing out the difficulty of his own desires, and moral codes, granted by success. A telling example is the song &#x201C;How Much a Dollar Cost,&#x201D; which, if you aren&#x2019;t paying close attention, you might miss is a parable about giving God, incarnate as an addict, money for crack.&quot;</blockquote><p>So yeah. Dense. But if that seemed interesting, click the link above for the full text.</p><p><strong>Listen</strong><br>I discovered Punch Brothers this week, which was a group that appropriately enough formed in 2006. Great music, and better late than never I suppose.<br><br><a href="https://www.youtube.com/watch?v=Ppn7eQSBdJQ">Julep</a> is one of my favorite songs in a long time. I have thought a lot about how best to describe how Chris Thile&apos;s lyrics in this song, and the best I can come up with is &quot;open-ended enjambment&quot; but I&apos;m sure a lit person would correct me or provide a better phrase. The words are beautifully structured such that ideas are spread across lines and stanzas (i.e., <a href="https://en.wikipedia.org/wiki/Enjambment">enjambment</a>), but in a way that requires the listener to fill in missing thoughts to link those pieces together. <br><br>And the instrumentation is also beautiful. Click the picture below for the song.</p><figure class="kg-card kg-image-card"><a href="https://www.youtube.com/watch?v=Ppn7eQSBdJQ"><img src="https://roshansadanani.com/content/images/2021/11/image-9.png" class="kg-image" alt loading="lazy" width="640" height="358" srcset="https://roshansadanani.com/content/images/size/w600/2021/11/image-9.png 600w, https://roshansadanani.com/content/images/2021/11/image-9.png 640w"></a></figure><p><strong>Look</strong><br>I found <a href="http://app.wlppr.co/">app.wlppr.co</a> on Product Hunt a little while ago and it&apos;s a really nifty website with some gorgeous mobile wallpaper images which are all actually satellite images of Earth. Worth a click if you like seeing pretty and/or fascinating things.</p><p>----<br><br>Until next time - see you space cowboy,<br>-Roshan<br></p>]]></content:encoded></item><item><title><![CDATA[TFV #2 – Is there an ISO standard for standards?]]></title><description><![CDATA[<p><em>Note: This is one of a small series of emails I sent as part of an email newsletter project in 2015-2016 called Tales from Voyager. <a href="https://roshansadanani.com/tales-from-voyager-the-archive/">Learn more</a>, or <a href="https://roshansadanani.com/tag/tales-from-voyager/">browse the full collection</a>. </em></p><hr><figure class="kg-card kg-image-card"><img src="https://roshansadanani.com/content/images/2021/11/image-3.png" class="kg-image" alt loading="lazy" width="640" height="426" srcset="https://roshansadanani.com/content/images/size/w600/2021/11/image-3.png 600w, https://roshansadanani.com/content/images/2021/11/image-3.png 640w"></figure><p>October 14 was a holiday I think no one on this subscription list knows about: International Standards Day.</p>]]></description><link>https://roshansadanani.com/tfv-2/</link><guid isPermaLink="false">61a1e19d62302d19e1d53acd</guid><category><![CDATA[tales-from-voyager]]></category><dc:creator><![CDATA[roshan]]></dc:creator><pubDate>Tue, 27 Oct 2015 03:07:00 GMT</pubDate><content:encoded><![CDATA[<p><em>Note: This is one of a small series of emails I sent as part of an email newsletter project in 2015-2016 called Tales from Voyager. <a href="https://roshansadanani.com/tales-from-voyager-the-archive/">Learn more</a>, or <a href="https://roshansadanani.com/tag/tales-from-voyager/">browse the full collection</a>. </em></p><hr><figure class="kg-card kg-image-card"><img src="https://roshansadanani.com/content/images/2021/11/image-3.png" class="kg-image" alt loading="lazy" width="640" height="426" srcset="https://roshansadanani.com/content/images/size/w600/2021/11/image-3.png 600w, https://roshansadanani.com/content/images/2021/11/image-3.png 640w"></figure><p>October 14 was a holiday I think no one on this subscription list knows about: International Standards Day. It honors the creation of voluntary standards of all kinds, ranging from those created by the <a href="http://www.iso.org/iso/home.html">International Organization for Standardization</a> (ISO) to the ones created by country-specific bodies such as the <a href="http://www.ansi.org/">American National Standards Institute</a> (ANSI), and everything in between. <br><br>It&apos;s also definitely not a Hallmark holiday. Unless you send an <a href="https://en.wikipedia.org/wiki/ISO/IEC_7810">ISO 7810</a> compliant holiday card. Hallmark needs to get in on that market. <br><br>These huge (inter)national bodies are tasked with ensuring that we have consistency, whether that&apos;s agreeing on <a href="http://www.bipm.org/en/bipm/mass/ipk/">what a kilogram is</a>, ensuring wood charcoal is <a href="http://webstore.ansi.org/RecordDetail.aspx?sku=ASTM+D1762-84%282013%29">indeed wood charcoal</a>, or making sure the floor mat in front of your office building <a href="http://www.iccsafe.org/wp-content/uploads/asc_a117/supporting_doc_3-3-1_ANSI_NFSI_B101_6-2012.pdf">is anti-slip enough</a>. <br><br>Obviously there are some benefits to this kind of agreement, like not having to convert to and from morgens in farming conversations (a morgen is the approximate amount of land tillable by one man behind an ox in the morning hours of a day, and was used in South Africa until the 1970s). As a side note, Wikipedia has a surprisingly exhaustive list of these types of measurements, both <a href="https://en.wikipedia.org/wiki/List_of_unusual_units_of_measurement">unusual</a> and <a href="https://en.wikipedia.org/wiki/List_of_humorous_units_of_measurement">humorous</a>. <br><br>However. despite the existence of these standards bodies, and the millions of dollars they spend every year, they are still voluntary. There are in some cases laws which require compliance, but the bodies themselves are rarely charged with enforcement. I think that&apos;s unfortunate, because one of the things standards do best is reduce ambiguity.</p><p>I want to talk specifically about <a href="https://en.wikipedia.org/wiki/ISO_8601">ISO 8601</a>.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://roshansadanani.com/content/images/2021/11/image-4.png" class="kg-image" alt loading="lazy" width="392" height="457"><figcaption><em><strong>From XKCD: https://xkcd.com/1179/</strong></em> <em><strong>(This comic was also the inspiration for today&apos;s intro topic)</strong></em></figcaption></figure><p>If you&apos;re like me, you run into the problem in this comic all the time - people who save files with dates in all kinds of weird formats. Knowing how many of you have day jobs involving computers, I bet most of you have experienced this at some point. <br><br>If you&apos;re also like me you&apos;re probably very annoyed by inconsistencies like this one (though I do believe the list of people passionate about consistency is significantly smaller). <br><br>If you seek a sense of consistency in your life, I encourage you to join me in an experiment: for the next few weeks I&apos;m going to be adopting ISO 8601 as much as possible in my personal and work lives. That means using 24-hour time on every device possible, writing dates properly (already got this one on lock), and perhaps even using proper UTC time designations.<br><br>Basically if you are trying to schedule anything with me over the next few weeks you may want to either wait, or read the <a href="https://en.wikipedia.org/wiki/ISO_8601">ISO 8601 Wikipedia article</a>. <br><br>I&apos;m not saying that all standards are good. I think like anything else prescriptive they fall into the trap of implying that there is only one &quot;right&quot; way to do something. But, I think the mission behind standardization is a pretty cool one, and one that maybe people don&apos;t know much about. </p><p>----</p><p><strong>Watch</strong><br>I would be remiss not to mention the <a href="http://digg.com/video/drake-hotline-bling-video">Hotline Bling music video</a> for anyone who has yet to witness Drake&apos;s dad-glorious dance moves. However, I think that&apos;s unfair to use for this week due to how quickly the video and its <a href="http://mic.com/articles/127181/drake-hotline-bling-video-brought-out-the-best-memes-and-gifs-on-the-internet">subsequent, glorious memes</a> made the internet rounds. &#xA0;<br><br>So - BONUS VIDEO UNLOCKED!<br><br>Kendrick Lamar is one of my favorite musicians; last week he performed with the National Symphony Orchestra in an epic live concert. Some of the videos from the performance have started to surface, and the live performance of &quot;These Walls&quot; is one of them. <br><br>Click the pic below for the video.</p><figure class="kg-card kg-image-card"><a href="https://www.youtube.com/watch?v=g-7n6gCyyF8"><img src="https://roshansadanani.com/content/images/2021/11/image-5.png" class="kg-image" alt loading="lazy" width="640" height="359" srcset="https://roshansadanani.com/content/images/size/w600/2021/11/image-5.png 600w, https://roshansadanani.com/content/images/2021/11/image-5.png 640w"></a></figure><p><strong>Read</strong><br><a href="https://en.wikipedia.org/wiki/Wil_Wheaton">Wil Wheaton</a> is an actor, famous dude on the internet, and geek. He wrote <a href="https://medium.com/@wilw/7-things-i-did-to-reboot-my-life-a4bab2d409e#.8wejgexsn">a post on Medium</a> this week about how he changed around some things in his life. I was not expecting it to be much, but I found it pretty insightful. It resonated with some of the changes I&apos;m trying to make in my own life, and is particularly topical as it relates to one of the reasons I started this newsletter. So meta.<br><br><strong>Listen</strong><br>I first discovered Blind Pilot in college, and occasionally rediscover them among all of the music I&apos;ve saved in Spotify over the years. This week was one of those rediscovery weeks. 3 Rounds and a Sound (<a href="https://play.spotify.com/track/0ROKraHEf4F02IyaudmAt6">Spotify</a> | <a href="https://www.youtube.com/watch?v=juvwlEO-x2o">YouTube</a>) conveys feelings of peace, wholeness, and longing that I don&apos;t often come across in music. It&apos;s also a love song, which depending your interpretation is either about a failed relationship or a successful one.<br><br>The Story I Heard (<a href="https://open.spotify.com/track/01nW6MdZU2KYjkYovWpjq6">Spotify</a> | <a href="https://www.youtube.com/watch?v=op8HNMhKJ4U">YouTube</a>) is also a favorite and is one of my favorite songs, period. I like to think it&apos;s about the transience of life, but am curious to hear what you think. <br><br><strong>Look</strong><br>This week&apos;s I do not have a gif but instead something arguably much cooler: <a href="http://tracker.geops.ch/?z=12&amp;s=1&amp;x=-8574862.4522&amp;y=4708530.5277&amp;l=transport">TRAVIC</a><br><br>TRAVIC is a visualization of transit data for major cities around the world (the above link should center the map on the DC metro region), and it is AMAZING. The map uses open API data to display the movement of metro trains and city buses in real-time, with options to do cool stuff like speed up time, or monitor the status of a given transit route. When I found this I stared at the little dots moving around for longer than I would care to admit - they&apos;re mesmerizing. <br><br>----<br><br>See you space cowboy,<br><br>-Roshan<br>@blattus</p>]]></content:encoded></item><item><title><![CDATA[TFV #1 – They see me rollin']]></title><description><![CDATA[<p><em>Note: This is one of a small series of emails I sent as part of an email newsletter project in 2015-2016 called Tales from Voyager. <a href="https://roshansadanani.com/tales-from-voyager-the-archive/">Learn more</a>, or <a href="https://roshansadanani.com/tag/tales-from-voyager/">browse the full collection</a>. </em></p><hr><figure class="kg-card kg-image-card"><img src="https://roshansadanani.com/content/images/2021/11/image-1.png" class="kg-image" alt loading="lazy" width="640" height="424" srcset="https://roshansadanani.com/content/images/size/w600/2021/11/image-1.png 600w, https://roshansadanani.com/content/images/2021/11/image-1.png 640w"></figure><p>First off, if you missed <a href="http://tinyletter.com/blattus/letters/tfv-0-the-journey-begins">Issue #0</a> be sure to check that out in the archive! Today&apos;</p>]]></description><link>https://roshansadanani.com/tfv-1/</link><guid isPermaLink="false">61a1dfed62302d19e1d53a7a</guid><category><![CDATA[tales-from-voyager]]></category><dc:creator><![CDATA[roshan]]></dc:creator><pubDate>Sun, 18 Oct 2015 23:26:00 GMT</pubDate><content:encoded><![CDATA[<p><em>Note: This is one of a small series of emails I sent as part of an email newsletter project in 2015-2016 called Tales from Voyager. <a href="https://roshansadanani.com/tales-from-voyager-the-archive/">Learn more</a>, or <a href="https://roshansadanani.com/tag/tales-from-voyager/">browse the full collection</a>. </em></p><hr><figure class="kg-card kg-image-card"><img src="https://roshansadanani.com/content/images/2021/11/image-1.png" class="kg-image" alt loading="lazy" width="640" height="424" srcset="https://roshansadanani.com/content/images/size/w600/2021/11/image-1.png 600w, https://roshansadanani.com/content/images/2021/11/image-1.png 640w"></figure><p>First off, if you missed <a href="http://tinyletter.com/blattus/letters/tfv-0-the-journey-begins">Issue #0</a> be sure to check that out in the archive! Today&apos;s is the first <em>real</em> issue using the format discussed.<br><br>----<br><br>Hi Friends,<br><br>First off wanted to say thanks for all of the support - several of you reached out to me personally with your excitement and that means a lot - hopefully this first issue lives up it! <br><br>Today&apos;s intro is a story about minivans and books that I was recently inspired to write while at a library. I&apos;ve gotten some questions about whether these newsletters are going to have themes - I&apos;m definitely considering that going forward, but today&apos;s is kind of all over the place, with some hilarious stuff, some serious stuff, and some very random stuff. As always, feel free to email or tweet me comments!</p><p>----</p><p>One of the best things my parents ever did was take me to the library whenever I wanted while growing up (which, in retrospect, was an excessive amount). I was never content with the small regional library half a mile from our house and would regularly insist that we take the trip to the larger, 2-story branch that took 20 minutes to get to, and had a much larger collection. I would leave mom downstairs and rush upstairs, to the fiction section, where I trolled through shelves and made what for 12 year old me were the life-and-death decisions of which books I would take home that trip. </p><p>It was a laborious process, sometimes taking hours. After all, if I picked something bad I&apos;d have to wait <em>days</em> to rectify my mistake. </p><p>12 year old me took his libraries seriously.</p><p>My mom wasn&apos;t much of a reader, but she would find something to flip through while she waited, often sitting in a childishly small chair while she oversaw my younger siblings. The only thing she ever complained about was the number of books I&apos;d want to take home. </p><p>On one of those trips we got into my first car accident, or well, the first one I remember being part of. Mom picked me and my brother and my sister up from school and we headed straight to the library at my behest, which was not an uncommon occurrence. Then, at a red light at the corner of two streets near home, we all jolted forward as someone behind us said an unceremoniously physical hello.</p><p>A few fire trucks and ambulances later, we found out our rearward neighbor was the victim of a car sandwich. The perpetrator was the driver of a red sports car and a possessor of limited attention (and a newly-totaled car) several vehicles behind.</p><p>He wasn&apos;t hurt, but several cars were, and ours wouldn&apos;t start. My mom, going to a library for the umpteenth time, driving a minivan with a floor that her feet barely reached, with three kids and a jostled stack of books in the back, got a friendly push from a group of firemen after putting the car in neutral. We were blocking the middle lane and slowly glided past the traffic light and to the right, into a friendly suburban gas station. </p><p>Shortly after that my dad arrived and began doing the Things You Do when human-induced vehicular damage takes place. We didn&apos;t get home until late.</p><p>I only remember two other things about that day: my brother chidingly saying it was my fault because I wanted to go to the far-away library, and me unabashedly asking my mother if we would still be able to go to go there after everything was over. </p><p>We didn&apos;t. Not that day anyway.That two-story library is still there. It&apos;s open hours have been shortened due to budget cuts and there&apos;s now a cafe that hosts a bored teenager and too-sugary drinks in a futile bid to create a &quot;coffeeshop atmosphere&quot;. Instead of VHS rentals and books on tape there&apos;s wifi and downloadable content.</p><p>But it still has the poorly-designed foyer that leaks noise from downstairs up to the &quot;quiet zone&quot; above, and where the fiction section still resides. It still has a gigantic dictionary in the reference section that sits perpetually open, casually displaying whatever word was looked up last as if in a defiant display of the previous user&apos;s ignorance. It still has shelves upon shelves of books, many of which will rarely be read. </p><p>And still, 12 years later, my parents still have and drive that van. What was once sparkly silver paint has dulled over the years and chipped in several places along the back. Alongside the chipped paint are several bumper sticker tan lines created through a mix of recurring sunlight and changing interests. One is shaped like a soccer ball.</p><p>That van moved me in, and out, of college. It did the same for my sister and will likely live through my brother&apos;s college years. I think the odometer is a few hundred miles off. It&apos;s seen spills, had its guts replaced, and has held far too many books to count. It&apos;s safely conveyed a family of 5 for hundreds of hours of road trips. </p><p>But before all that, it took me to the library.</p><p>----<br><br><strong>Watch</strong><br>So this week I discovered the world of competitive multicopter-flying. <a href="https://www.youtube.com/user/CharpuFPV">This guy</a> has some amazing videos on YouTube and below is one of my favorites. I won&apos;t lie - watching a few of these got me to pick up my own <a href="http://www.amazon.com/Hubsan-H107L-Channel-2-4GHz-Quadcopter/dp/B00IZC6C8E/ref=sr_1_1?ie=UTF8&amp;qid=1445198879&amp;sr=8-1&amp;keywords=hubsan+x4">mini-quadcopter</a> this week...maybe a future newsletter will have FPV videos of my own?</p><p>Click the pic below for the YouTube video.</p><figure class="kg-card kg-image-card"><a href="https://www.youtube.com/watch?v=1MBW8zoZUR4"><img src="https://roshansadanani.com/content/images/2021/11/image-2.png" class="kg-image" alt loading="lazy" width="640" height="360" srcset="https://roshansadanani.com/content/images/size/w600/2021/11/image-2.png 600w, https://roshansadanani.com/content/images/2021/11/image-2.png 640w"></a></figure><p><strong>Read</strong><br>If you are at all interested in foreign policy, economics, politics, and related world affairs, you should check out <a href="http://www.project-syndicate.org/">Project Syndicate</a>. From their about page, Project Syndicate is &quot;the only news service focused solely on producing and delivering high-quality commentaries to a global audience.&quot; <br><br>That does&apos;t really do it justice - the contributor list is a veritable who&apos;s who of people involved in those topics from around the world. Here are some of them: Jeffrey Sachs, Shinzo Abe, Desmond Tutu, Kofi Annan, Bill Gates, Jimmy Carter, Joseph Stiglitz, Richard Haass, and many others.<br><br>I&apos;ve been following the site off and on for a few years now, but I came across an article this week that I thought was worth sharing, <a href="http://www.project-syndicate.org/commentary/three-questions-for-us-foreign-policy-by-joseph-s--nye-2015-10">a short piece about the future direction of US foreign policy</a><br><br><strong>Listen</strong><br>I was a big fan of Zhu&apos;s album The Nightday, which featured some awesomely deep, almost sensual tracks. I recently (thanks Discover Weekly!) came across this track featuring both Zhu and AlunaGeorge (who is awesome in her own right) - Automatic <a href="https://open.spotify.com/track/1Wcw6FdJVhuAWI39mVAXfS">https://open.spotify.com/track/1Wcw6FdJVhuAWI39mVAXfS</a><br><br>I&apos;m a big fan of the subtle piano trill used against the more thudding three low notes that together drive the song with some uniquely Zhu sounds. <br><br><strong>Look</strong><br>As I said before, who doesn&apos;t love a gif? <a href="http://i.imgur.com/oDf9ERa.gifv">This week&apos;s gif</a> is presented without comment. Watch through the end.<br><br>Thanks for engaging. Until next time -- see you space cowboy,<br><br>-Roshan<br><a href="http://twitter.com/blattus">@blattus</a><br></p>]]></content:encoded></item><item><title><![CDATA[TFV #0 – The Journey Begins]]></title><description><![CDATA[<p><em>Note: This is one of a small series of emails I sent as part of an email newsletter project in 2015-2016 called Tales from Voyager. <a href="https://roshansadanani.com/tales-from-voyager-the-archive/">Learn more</a>, or <a href="https://roshansadanani.com/tag/tales-from-voyager/">browse the full collection</a>. </em></p><hr><figure class="kg-card kg-image-card"><img src="https://roshansadanani.com/content/images/2021/11/image.png" class="kg-image" alt loading="lazy" width="640" height="360" srcset="https://roshansadanani.com/content/images/size/w600/2021/11/image.png 600w, https://roshansadanani.com/content/images/2021/11/image.png 640w"></figure><p>Welcome to Issue #0 of Tales from Voyager! This newsletter is something I&apos;ve been working on</p>]]></description><link>https://roshansadanani.com/tfv-0/</link><guid isPermaLink="false">61a1de1f62302d19e1d53a45</guid><category><![CDATA[tales-from-voyager]]></category><dc:creator><![CDATA[roshan]]></dc:creator><pubDate>Sat, 10 Oct 2015 23:19:00 GMT</pubDate><content:encoded><![CDATA[<p><em>Note: This is one of a small series of emails I sent as part of an email newsletter project in 2015-2016 called Tales from Voyager. <a href="https://roshansadanani.com/tales-from-voyager-the-archive/">Learn more</a>, or <a href="https://roshansadanani.com/tag/tales-from-voyager/">browse the full collection</a>. </em></p><hr><figure class="kg-card kg-image-card"><img src="https://roshansadanani.com/content/images/2021/11/image.png" class="kg-image" alt loading="lazy" width="640" height="360" srcset="https://roshansadanani.com/content/images/size/w600/2021/11/image.png 600w, https://roshansadanani.com/content/images/2021/11/image.png 640w"></figure><p>Welcome to Issue #0 of Tales from Voyager! This newsletter is something I&apos;ve been working on for a while and that I&apos;m really excited to be sharing.<br><br>tl;dr: I&apos;m going to browse reddit and steal the best stuff and throw it in a newsletter every week. <br><br>Just kidding. Kind of.<br><br>I wanted to send out an &quot;Issue #0&quot; to clarify the format and intent of this project. But first - the story behind the name:<br><br>When growing up I always named my technology devices. I like to think that&apos;s because I didn&apos;t really have any pets to name, but it&apos;s really probably just because I&apos;m a nerd. </p><p>I didn&apos;t really have a theme to those names. Sometimes it was a character or a place in a book I was reading, other times it was a fun reference I liked. Starling, my 1TB Portable HD, is named after the traveling minstrel from Robin Hobb&apos;s Fitz books. CEREBRO was my laptop throughout college and is an obvious X-Men reference. My desktop PC is named Astraeus - not after the mythological character but after the space mission in SyFy&apos;s Eureka.<br><br>Okay so I lied about not having a theme - the theme was apparently MASSIVE NERD. </p><p>I bought a Surface Pro 3 in the fall of last year. At the time I was on a space kick so I named it Voyager (this time after a real-life space mission). Voyager I and Voyager II are amazing achievements - Voyager I has traveled <a href="http://voyager.jpl.nasa.gov/">further than any other human-made device in our history</a>. That&apos;s crazy, right?<br><br>Want to know what&apos;s even crazier? It still <a href="http://eyes.nasa.gov/dsn/dsn.html">phones home</a> and shares information with us on Earth.</p><p>When I set out to name this newsletter I immediately thought about those little crafts sending signals through space. I intend for this newsletter to serve as a sort of way for me to <a href="https://media.giphy.com/media/sDgz4DyjPTkzu/giphy.gif">phone home</a> my observations in my own way, fully realizing that the things I share will not be anywhere near as remarkable as the data received from Voyager. </p><p>Given that, Tales from Voyager seemed like an appropriate name. It feels right.<br><br>Now for the structure! My goal is to send out a newsletter a few times a month if I&apos;m being realistic, and every week if I&apos;m feeling ambitious. I&apos;ve spent some time thinking about how to structure it to be both a reflection of <em>me</em>, and also something easily digestible by others, and here&apos;s the format I&apos;ve come up with:</p><p><strong>1. Monologue / Opening</strong>- This could be anything from a piece of creative writing, to a short story, to a collection of quotes, to a series of photos, to a rant about technology. I&apos;m intentionally keeping this vague because I want to give myself some room to be expressive with this section. Opinions welcome!</p><p><strong>2. Watch This</strong>- A video of some kind that I watched recently and that I found worth sharing.</p><p><strong>3. Read This</strong>- An article or series of articles you should read, or maybe a book I recommend after recently completing.</p><p><strong>4. Listen to This</strong>- Some music I&apos;ve been digging.</p><p><strong>5. Look at This</strong>- A pretty picture or a funny gif, but most likely the latter because who doesn&apos;t like gifs?<br><br>TFV is something I&apos;ve wanted to create for a long time. It&apos;s also something that I realize will be immensely personal. My hope is that in sharing things I find interesting, I get others engaged either because they are interested in the same things, interested in my spin on them, or just interested in how/what I&apos;m thinking. To that end I&apos;d love if you commented either by replying to this directly, reaching out on <a href="http://twitter.com/blattus">Twitter</a>, or sending me an <a href="mailto:roshan.sadanani+tfv@gmail.com?subject=Hey%20I%20really%20love%20your%20newsletter%20but%20I%20was%20thinking....">email</a>. <br><br>See you space cowboy,<br>-Roshan<br><a href="http://twitter.com/blattus">@blattus</a></p>]]></content:encoded></item></channel></rss>