Mr. Max Mautner2023-08-26T02:37:28+00:00https://maxmautner.comMax MautnerVisit to Newport Beach2023-08-25T00:01:00+00:00https://maxmautner.com/2023/08/25/newport-beach<p>My wife & I visited Newport Beach for a friend’s wedding and got an interesting dose of Orange County.</p>
<p>We flew from San Francisco to Santa Ana airport over a pancake flat valley:</p>
<p><img src="/public/images/newportbeach/airplane.jpeg" alt="Airplane flight over Orange County" /></p>
<p>Upon arrival we realized we could take the OC Transit public bus service to the wedding’s rehearsal dinner:</p>
<p><img src="/public/images/newportbeach/ocbus2.jpeg" alt="OC Bus" />
<img src="/public/images/newportbeach/ocbus3.jpeg" alt="OC Bus" /></p>
<p>The next morning, the day of the wedding I woke up early for a very long run on the <a href="https://letsgooutside.org/explore/mountains-sea-trail/">Mountains to the Sea Trail</a>:</p>
<p><img src="/public/images/newportbeach/run1.jpeg" alt="Back Bay Science Center" />
<img src="/public/images/newportbeach/run2.jpeg" alt="View of the San Diego Creek" /></p>
<p>I tried out the Rayban Stories sunglasses, and taking some photos & video with them & also to listen to music while I ran:</p>
<p><img src="/public/images/newportbeach/run3.jpeg" alt="Max Mautner running" /></p>
<p>My wife & I then borrowed bikes from our hotel & rode along what we came to find out was the Pacific Coast Highway or PCH.</p>
<p>It was awful and noisy and we were happy to make it to “downtown” Newport Beach safely.</p>
<p>We made a stop for coffee at Starbucks on the side of the highway on our way:</p>
<p><img src="/public/images/newportbeach/bike1.jpeg" alt="Biking" />
<img src="/public/images/newportbeach/bike2.jpeg" alt="Biking" /></p>
<p>We had brunch with a group of other wedding attendees, and then biked along the beach front which was gorgeous and very bike-friendly:</p>
<p><img src="/public/images/newportbeach/pretty-flowers.jpeg" alt="Pretty flowers in Newport Beach" /></p>
<p>At the end of the bike path we hopped on a ferry taking us to Balboa Island, $1.75 per passenger.</p>
<p>It was cash only & we had to ask a very kind stranger to give us the money in exchange for digitally transferring her money (via Apple Pay).</p>
<p>It was a pretty chill 2-minute boat ride:</p>
<p><img src="/public/images/newportbeach/boat.jpeg" alt="Balboa Island ferry passengers with bikes" />
<img src="/public/images/newportbeach/boat2.jpeg" alt="Balboa Island ferry ride" /></p>
<p>Balboa Island is extremely patriotic, with lots of loud American icons proudly on display:</p>
<p><img src="/public/images/newportbeach/balboa.jpeg" alt="Balboa Island flags" />
<img src="/public/images/newportbeach/balboa2.jpeg" alt="Balboa Island Statue of Liberty" /></p>
<p>After walking the west side of the island we then rode our bikes back to our hotel, crossing back across the PCH where we saw some bike lanes (in name only):</p>
<p><img src="/public/images/newportbeach/pch.jpeg" alt="Fictitious bike lane" />
<img src="/public/images/newportbeach/pch2.jpeg" alt="Fictitious bike lane" />
<img src="/public/images/newportbeach/bikelane.jpeg" alt="Fictitious bike lane" /></p>
<p>We got some rest and relaxation before attending the wedding which was a blast:</p>
<p><img src="/public/images/newportbeach/wedding.jpeg" alt="Wedding party" />
<img src="/public/images/newportbeach/wedding2.jpeg" alt="Wedding party" />
<img src="/public/images/newportbeach/wedding3.jpeg" alt="Wedding party" /></p>
<p>Some photos of wedding guests:</p>
<p><img src="/public/images/newportbeach/max-and-jessie.jpeg" alt="Max and Jessie" />
<img src="/public/images/newportbeach/juan-and-amanda.jpeg" alt="Juan and Amanda" />
<img src="/public/images/newportbeach/will-and-ani.jpeg" alt="Will and Ani" /></p>
<p>I cannot confidently predict when I will next visit Orange County, but I see its appeal and I’m sure the weather is fantastic year-round.</p>
<p>Kudos to Newport Beach!</p>
Bike Summit 20232023-08-25T00:00:00+00:00https://maxmautner.com/2023/08/25/bike-summit<p>I attended <a href="https://bikesiliconvalley.org/">Silicon Valley Bicycle Coalition</a> (SVBC)’s <a href="https://bikesiliconvalley.org/events/summit">2023 Bike Summit</a>–a conference for folks interested and involved with bicycling in San Mateo and Santa Clara counties.</p>
<p>The event was sold out, with 350-400 people in attendance.</p>
<p>I attended as a San Mateo county resident & (minor!) donor to SVBC.</p>
<p>This is a timeline of the events:</p>
<ul>
<li>9am met with other conference attendess at the Mountain View Caltrain, and got a demo from Caltrain staff about <a href="https://www.bikelink.org/">BikeLink lockers</a>, and the plans for future expansion of bike storage at stations</li>
</ul>
<p><img src="/public/images/bike-summit/caltrain.jpeg" alt="Mountain View Caltrain" /></p>
<ul>
<li>Biked over together to the venue at Mountain View Community Center</li>
</ul>
<p><img src="/public/images/bike-summit/bike-bus.jpeg" alt="Bike bus to Mountain View Community Center" /></p>
<ul>
<li>Free bike valet in the parking lot:</li>
</ul>
<p><img src="/public/images/bike-summit/bike-valet.jpeg" alt="Complimentary bike valet in the parking lot" /></p>
<ul>
<li>9:30am Mayor of Mountain View gave introduction, SVBC Director welcomed everyone introduced keynote speaker</li>
<li>10-11am Keynote speaker, <a href="https://mtc.ca.gov/news/mtc-names-andrew-fremier-new-executive-director">Andrew Fremier</a> Exectuive Director of MTC (the regional transit planning in charge of bay area-wide intercity connectivity like bridges, <a href="https://mtc.ca.gov/operations/regional-trails-parks/san-francisco-bay-trail">bay trail</a>, highways, etc.) speaking about bike infrastructure and cross-bay connectivity on bike, panel discussion with San Mateo county supervisor <a href="https://www.davidcanepa.com/">David Canepa</a> & Santa Clara county supervisor Cindy Chavez. They talked about distributing county money back to cities for bike infrastructure projects, what the priority areas are and how to do it equitably. There was some discussion about stopping widening of freeways like 101 which makes it harder to connect communities on foot/bike to cross over them.</li>
</ul>
<p><img src="/public/images/bike-summit/panel.jpeg" alt="Cindy Chavez, Andrew Fremier, David Canepa" /></p>
<ul>
<li>11-12 a bike tour with Mountain View city staff of their infrastructure–some excellent stuff around the Google offices (protected bike lanes & protected intersections). Downtown MV has a pedestrianized Castro Street which is incredible.</li>
</ul>
<p><img src="/public/images/bike-summit/tour.jpeg" alt="Bike tour of Mountain View" />
<img src="/public/images/bike-summit/tour2.jpeg" alt="Bike tour of Mountain View" />
<img src="/public/images/bike-summit/tour3.jpeg" alt="Bike tour of Mountain View" /></p>
<ul>
<li>Lunchtime, met a non-profit researcher for <a href="https://outridebike.org/">Outride</a> who are funded by Specialized bikes to study how youth bike riding impacts educational development & behavioral moderation of adolescents</li>
<li>1-2pm attended a panel session about creating safe routes to school. Witnessed some spirited back and forth over “<a href="https://crosswalksla.org/">tactical urbanism</a>” and legal liability of cities, drivers, bicyclists, children & parents. I need to learn more about insurance/law to have a strong opinion on this one(!)</li>
</ul>
<p><img src="/public/images/bike-summit/srts.jpeg" alt="Safe Routes to School panel at Bike Summit 2023" /></p>
<ul>
<li>Bunch of lightning talks from local activists, SJ conservation corps that maintain the trails system, East Palo Alto & Half Moon Bay activites who teaches bike repairs skills to kids & adults, anti-highway widening activism</li>
<li>Awards for local activists:</li>
</ul>
<p><img src="/public/images/bike-summit/awards.jpeg" alt="Awards" /></p>
<ul>
<li>Wrap-up happy hour where I met the mayor of Los Gatos and had an at-length conversation about the politics of the city, certain vocal residents’ opposition to high-density housing, what bike culture exists in Los Gatos</li>
</ul>
<p><img src="/public/images/bike-summit/midpen.jpeg" alt="Bicycling advocates from San Mateo and Redwood City" /></p>
<p>It was awesome and inspiring–I do hope to attend next year.</p>
<p><img src="/public/images/bike-summit/svbc.jpeg" alt="Silicon Valley Bicycle Coalition" /></p>
Visit to San Diego2023-08-21T00:00:00+00:00https://maxmautner.com/2023/08/21/san-diego<p>My wife and I visited San Diego for two days, while I worked remotely from our hotel room during the day.</p>
<p>We took the Amtrak train from Irvine to San Diego.</p>
<iframe width="560" height="420" style="max-width: 100%;" frameborder="0" src="//www.youtube.com/embed/Fm2G7yBTvxg?color=white&theme=light"></iframe>
<p>The arrival location in downtown San Diego at the <a href="https://www.pacificsurfliner.com/destinations/san-diego-santa-fe-depot/">Santa Fe Depot</a> station was quite scenic:</p>
<p><img src="/public/images/sandiego/surfliner-small.jpeg" alt="Santa Fe Depot Amtrak train station" />
<img src="/public/images/sandiego/surfliner1.jpeg" alt="Amtrak Pacific Surfliner train car exterior" />
<img src="/public/images/sandiego/max-jessie.jpeg" alt="Me and wife riding Amtrak" /></p>
<p>One of the interesting sites from the train ride was the remnants of the <a href="https://en.wikipedia.org/wiki/San_Onofre_Nuclear_Generating_Station">San Onofre nuclear power plant</a>:</p>
<p><img src="/public/images/sandiego/sanonofre.jpeg" alt="San Onofre nuclear power plan" /></p>
<p>We walked from the station to our hotel at the Manchester Grand Hyatt:</p>
<p><img src="/public/images/sandiego/hotel1.jpeg" alt="Exterior of Manchester Grand Hyatt in San Diego" />
<img src="/public/images/sandiego/hotel2.jpeg" alt="Interior lobby of Manchester Grand Hyatt in San Diego" /></p>
<p>We went to dinner at Puesto, a Mexican chain restaurant next to our hotel which was great–I had chips, salsa, a quesadilla and watermelon juice:</p>
<p><img src="/public/images/sandiego/puesto.jpeg" alt="Puesto San Diego" /></p>
<p>After dinner we walk around the waterfront:</p>
<p><img src="/public/images/sandiego/seaport-village.jpeg" alt="Seaport Village, San Diego" /></p>
<p>And then the Gaslamp District which had a large stretch of pedestrianized blocks–which were quiet as it was a Monday night:</p>
<p><img src="/public/images/sandiego/gaslamp1.jpeg" alt="Gaslamp District" />
<img src="/public/images/sandiego/gaslamp2.jpeg" alt="Gaslamp District" /></p>
<p>There was some excellent lighting for night-time photography:</p>
<p><img src="/public/images/sandiego/tacos.jpeg" alt="Tacos" />
<img src="/public/images/sandiego/ghirardelli1.jpeg" alt="Ghirardelli San Diego" /></p>
<p>Downtown San Diego seems centered around its courts and law offices.</p>
<p>We saw an ancient-looking bus with Immigration & Customs Enforcement(ICE) signage outside the courthouse.</p>
<p>Premium real estate in downtown is used for car storage because the transit accessibility and frequency is mediocre:</p>
<p><img src="/public/images/sandiego/parking.jpeg" alt="Parking" /></p>
<p>It was interesting to see offices of the parking enforcement company that does parking enforcement contracting in our city of residence, LAZ Parking:</p>
<p><img src="/public/images/sandiego/laz.jpeg" alt="LAZ offices San Diego" /></p>
<p>There was entrepreneurial signage for a bike mechanic:</p>
<p><img src="/public/images/sandiego/bikemechanic.jpeg" alt="Bike Mechanic San Diego" /></p>
<p>Overall it was a great, short trip.</p>
<p>I loved the temperate whether and the walkability of the downtown was very good.</p>
<p>I can see the appeal!</p>
BART with Mike2023-08-10T00:00:01+00:00https://maxmautner.com/2023/08/10/bart-with-mike<p>My neighbor Mike is in his 60s, retired, & doesn’t have a whole lot to occupy his time.</p>
<p><img src="/public/images/mike/mike.jpeg" alt="My neighbor Mike, leaning forward with sunglasses" /></p>
<p>He is super deadpan, “shoots straight” and is a fountain of wisdom about issues of homeownership and local history.</p>
<p>I recently persuaded him to take the bus with me–something he had not done for decades–and we took it to his favorite restaurant, <a href="https://goo.gl/maps/iYNSkWCgU6DdJd5p9">Harry’s Hofbrau</a>:</p>
<p><img src="/public/images/mike/mike2.jpeg" alt="Mike and Max, in front of Harry's Hofbrau" /></p>
<p>It was such a successful trip we brought along 2 more neighbors for a subsequent trip:</p>
<p><img src="/public/images/mike/mike3.jpeg" alt="Mike, Max & 2 more neighbors waiting at a Samtrans bus stop" />
<img src="/public/images/mike/mike4.jpeg" alt="Mike, Max & 2 more neighbors dining at Harry's Hofbrau" /></p>
<p>This past week I brought Mike with me on a trip to San Francisco on Bay Area Rapid Transit (BART).</p>
<p>He loves to bike.</p>
<p>He bikes 15 miles every day to help occupy his retirement and stay healthy, so naturally we biked to our nearest BART station at Millbrae.</p>
<p>Here are some photos from the outing:</p>
<p><img src="/public/images/mike/bart1.jpeg" alt="Mike with his bicycle inspecting the new BART cars as they arrive at Millbrae station" />
<img src="/public/images/mike/bart2.jpeg" alt="Mike & Max biking on Market Street in San Francisco, wearing helmets" />
<img src="/public/images/mike/bart3.jpeg" alt="Mike eating clam chowder and garlic fries" />
<img src="/public/images/mike/bart4.jpeg" alt="Max eating clam chowder and garlic fries" />
<img src="/public/images/mike/bart5.jpeg" alt="Mike watching the ferry arrive in San Francisco" />
<img src="/public/images/mike/bart6.jpeg" alt="An out of service BART escalator, collecting trash" />
<img src="/public/images/mike/bart7.jpeg" alt="Two bikes on the Embarcadero BART platform" /></p>
<p>Generally, Mike was fascinated at how fast BART traveled.</p>
<p>He noted critically how the train stations’s locations are inconvenient and how train departures are infrequent.</p>
<p>Specifically, we rode by Daly City BART and noted that he was planning to go to a movie with his wife to the theater and that it was next to the station.</p>
<p>He could drive their car 10 minutes or bike 20 minutes to Millbrae BART, walk to the platform and wait for the train, ride the train for 14 minutes and walk 1 block from the movie theater.</p>
<p>Or they could drive to the theater directly in 22 minutes, park within a block or two where the fee to park is less than the fee for both him and his wife to pay for a BART ticket(!).</p>
<p>This math would perhaps look different if Mike was not retired and was needing to commute into downtown San Francisco or the east bay, but he is simply not that demographic.</p>
<p>I don’t expect that Mike will use BART again, but it was very illuminating to hear his raw experience and thought process about using BART from the peninsula.</p>
Rayban Stories2023-08-10T00:00:00+00:00https://maxmautner.com/2023/08/10/rayban-stories<p>My wife worked at Meta (formerly known as Facebook) and helped market the <a href="">Rayban Stories</a> which retail for ~$300 USD.</p>
<p>They are “smart glasses” which have two camera lenses built into the glasses’ frame:</p>
<p><img src="/public/images/rayban/rayban1.jpeg" alt="" /></p>
<p>A shutter button exists above the right temple for capturing photo (one long-press) or video (short press to begin capture, short press to end capture):</p>
<p><img src="/public/images/rayban/rayban2.jpeg" alt="" /></p>
<p>They use Bluetooth in order to pair with iPhone or Android smartphones.</p>
<p>There are speakers + microphone which allow you to hold hands-free phone calls or listen to music.</p>
<p>There are no “augmented reality” features where visuals are projected onto the glasses’ lenses.</p>
<p>They’re like spy glasses that James Bond might have worn in a film in the 1970s.</p>
<p>Amazon ripped off the idea and offered a clone (minus the camera) called “<a href="https://www.amazon.com/Frames-sunglasses-Pacific-polarized-sunglass/dp/B08ZT26ZCY">Echo Frames</a>” that’s now discontinued.</p>
<p>Here are some sample photos–the first photo being the JPEG image file straight out of the camera and the second being post-processed image I have edited using photo editing software (Adobe Lightroom) to try and improve their appearance:</p>
<table>
<thead>
<tr>
<th style="text-align: center">Original</th>
<th style="text-align: center">Edited</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: center"><img src="/public/images/rayban/bike1.jpeg" alt="" /></td>
<td style="text-align: center"><img src="/public/images/rayban/bike2.jpeg" alt="" /></td>
</tr>
<tr>
<td style="text-align: center"><img src="/public/images/rayban/usps1.jpeg" alt="" /></td>
<td style="text-align: center"><img src="/public/images/rayban/usps2.jpeg" alt="" /></td>
</tr>
<tr>
<td style="text-align: center"><img src="/public/images/rayban/lake1.jpeg" alt="" /></td>
<td style="text-align: center"><img src="/public/images/rayban/lake2.jpeg" alt="" /></td>
</tr>
</tbody>
</table>
<p>Their battery life is quite poor, and more obnoxiously the Bluetooth connection can take up to a minute to pair with your phone.</p>
<p>They are also unuseable if they are not paired with your phone.</p>
<p>They can capture up to 60 seconds of video, however it draings the battery faster and there is no defined storage capacity for photos + video clips.</p>
<p>Here are sample videos–note the terrible audio quality:</p>
<iframe width="560" height="420" style="max-width: 100%;" frameborder="0" src="//www.youtube.com/embed/uFjxIaRBc_U?color=white&theme=light"></iframe>
<iframe width="560" height="420" style="max-width: 100%;" frameborder="0" src="//www.youtube.com/embed/jANpU8hJ-Jk?color=white&theme=light"></iframe>
<iframe width="560" height="420" style="max-width: 100%;" frameborder="0" src="//www.youtube.com/embed/DRE4yFX-yjE?color=white&theme=light"></iframe>
<p>I would say their most utility is when riding a bicycle.</p>
<p>It allows you to take quick photos or video from your bike ride, and safely listen to music as you ride without inhibiting your ability to hear car traffic threats.</p>
<p>Overall, there is a lot of room for improvement.</p>
<p>Ultimately, the pairing behavior with smartphone needs massive improvement to its seamlessness before I would recommend it to friends or buy it as a gift.</p>
Folding bikes or no?2023-06-06T00:00:00+00:00https://maxmautner.com/2023/06/06/folding-bikes-or-no<p>The pros and cons of getting a folding bicycle.</p>
<ul id="markdown-toc">
<li><a href="#pros-" id="markdown-toc-pros-">Pros ✅</a> <ul>
<li><a href="#light-weight" id="markdown-toc-light-weight">Light weight</a></li>
<li><a href="#faster-acceleration" id="markdown-toc-faster-acceleration">Faster acceleration</a></li>
<li><a href="#easy-mountdismount" id="markdown-toc-easy-mountdismount">Easy Mount/Dismount</a></li>
<li><a href="#are-these-really-folding-bike-features" id="markdown-toc-are-these-really-folding-bike-features">Are these really <em>folding bike</em> features?</a></li>
<li><a href="#it-folds-duh" id="markdown-toc-it-folds-duh">It Folds (Duh)</a></li>
<li><a href="#security" id="markdown-toc-security">Security</a></li>
<li><a href="#handlebar-mounting" id="markdown-toc-handlebar-mounting">Handlebar mounting</a></li>
</ul>
</li>
<li><a href="#cons-" id="markdown-toc-cons-">Cons ❌</a> <ul>
<li><a href="#less-stable" id="markdown-toc-less-stable">Less stable</a></li>
<li><a href="#slower" id="markdown-toc-slower">Slower</a></li>
<li><a href="#aesthetics" id="markdown-toc-aesthetics">Aesthetics</a></li>
<li><a href="#customuncommon-components" id="markdown-toc-customuncommon-components">Custom/uncommon components?</a></li>
<li><a href="#less-durable-in-the-long-run" id="markdown-toc-less-durable-in-the-long-run">Less durable in the long run?</a></li>
</ul>
</li>
<li><a href="#folding-bike-brands" id="markdown-toc-folding-bike-brands">Folding Bike Brands</a></li>
<li><a href="#conclusion" id="markdown-toc-conclusion">Conclusion</a></li>
</ul>
<h2 id="pros-">Pros ✅</h2>
<h3 id="light-weight">Light weight</h3>
<p>It’s guaranteed to be light weight and carryable (usually about 10 kilograms or 20-25 pounds).</p>
<p>That excludes the weight savings from not having to carry a bike lock(!), allowing you to travel more lightly.</p>
<p><strong>Note</strong>: electric folding bikes are still incredibly heavy–expect them to weight 10-25lbs (5-10kg) more.</p>
<h3 id="faster-acceleration">Faster acceleration</h3>
<p>Because of smaller diameter wheels, folding bicycles are easier to accelerate from a deadstop.</p>
<p><img src="/public/images/one-handed-riding.jpeg" alt="Folding bike point-of-view photo" /></p>
<h3 id="easy-mountdismount">Easy Mount/Dismount</h3>
<p>Folding bikes generally have a step-through frame & a lower center of balance, which makes them fantastic to mount/dismount.</p>
<p><img src="/public/images/folding-bike-stopped.jpg" alt="Stopped on a folding bike" /></p>
<h3 id="are-these-really-folding-bike-features">Are these really <em>folding bike</em> features?</h3>
<p>These first three benefits are not unique to folding bikes, but there is an entire category of bicycle called “mini velo” which has some popularity in Asia. Read more here: <a href="https://twowheelsbetter.net/mini-velos/">Mini velos</a></p>
<p>Here are a couple of benefits that are specifically due to the folding behavior:</p>
<h3 id="it-folds-duh">It Folds (Duh)</h3>
<p>Since it can fold into a smaller shape, it can be carried and place in:</p>
<ul>
<li>Closets</li>
<li>At your office work desk</li>
<li>Car trunk</li>
<li>Bus, train, <a href="https://www.youtube.com/shorts/JgPnM8iKRnU">planes</a>(!)</li>
<li>Restaurants</li>
<li>Grocery stores</li>
</ul>
<p><img src="/public/images/folding-bike-trunk.jpeg" alt="Folding bike & backpack in the trunk of a Tesla Model 3" /></p>
<p>If you have fear of social shame for bringing your bike into specific places (e.g. grocery store) recognize that:</p>
<ol>
<li>a folding bike may be smaller than a shopping cart and</li>
<li>you are giving the store money</li>
</ol>
<p>If they want your money or your participation then they will not force you to leave the establishment–especially if you take the time to fold your bike:</p>
<p><img src="/public/images/folded-bike.jpeg" alt="Folded bike" /></p>
<h3 id="security">Security</h3>
<p>Folding bikes are harder to steal–as you can carry them with you, even inside of buildings where you ordinarily would be forced to lock your bike outside.</p>
<p>This is the most clear benefit–whether you live in an apartment building or work at an office with no secure bike storage.</p>
<p>This has a secondary benefit, which is that you no longer have to carry a heavy lock and remember/carry its key.</p>
<h3 id="handlebar-mounting">Handlebar mounting</h3>
<p>It’s easy to mount a bag or backpack on the front handlebars, since it has a long front stem with small wheels:</p>
<p><img src="/public/images/handlebar-mount.jpeg" alt="Handlebar mount on folding bike" /></p>
<h2 id="cons-">Cons ❌</h2>
<h3 id="less-stable">Less stable</h3>
<p>With smaller diameter wheels you will feel less balanced on the bike.</p>
<p>For example it is harder to pedal with one hand on the handlebar.</p>
<p>This requires a bit more focus as you travel, and it’s certainly not recommended to whip out your phone mid-ride to take photo/video (where you might on other bikes).</p>
<p><img src="/public/images/adam-folding-bike.jpeg" alt="Adam on folding bike" /></p>
<h3 id="slower">Slower</h3>
<p>At higher speeds you may travel slower than non-folding bikes-–though this isn’t necessarily true.</p>
<p>This is most exhibited when you might be going up a steep hill, and need to step up out of your seat to pedal (in order to keep momentum).</p>
<p>This type of athletic exertion is harder to do on a folding bike frame, as it does not have as much structural integrity as a road bike (for example).</p>
<p>I personally haven’t found this to be much of an issue as I use my folding bike(s) for transit and not racing or going up big hills.</p>
<p>Lots of videos on YouTube illustrate the tradeoffs of wheel size and aerodynamics:</p>
<ul>
<li><a href="https://www.youtube.com/watch?v=yiUjG2Klrpk">Testing My Folding Bike with Roads Bike. They a super fast.</a></li>
<li><a href="https://www.youtube.com/watch?v=CCAwg9OMa84">Can A Folding Bike Climb? Superbike Vs Brompton Challenge!</a></li>
<li><a href="https://www.youtube.com/watch?v=F98oQ7Xo5mI">How fast is a Brompton?</a></li>
</ul>
<h3 id="aesthetics">Aesthetics</h3>
<p>Folding bikes do not look like a conventional bike.</p>
<p>If you want to ooze confidence to onlookers while riding your bike, it may be harder to do so on a folding bike.</p>
<p>But you won’t know if you don’t try!</p>
<p>I feel pretty cool on mine:</p>
<p><img src="/public/images/beautiful-folding-bike.jpeg" alt="Beautiful folding bike in front of downtown San Francisco" /></p>
<h3 id="customuncommon-components">Custom/uncommon components?</h3>
<p>This is not unique to folding bikes, but you can encounter this issue with finding readily available (and cheap prices for) replacement components with manufacturers like Brompton</p>
<p>A couple of components that will be different:</p>
<ul>
<li>Tubes – maybe 12”, 20”, 22”, it entirely depends on your folding bike model</li>
<li>Tires – same thing</li>
</ul>
<h3 id="less-durable-in-the-long-run">Less durable in the long run?</h3>
<p>Smaller wheels wear down faster.</p>
<p>You will need to replace your tires more frequently than a conventionally sized bicycle.</p>
<p>The frame also feels less structurally sound than a full-size bicycle.</p>
<p>I don’t know what lifetime a folding bike has (I haven’t rode one into the ground yet), but longevity is something of which to be mindful.</p>
<h2 id="folding-bike-brands">Folding Bike Brands</h2>
<p>Here is an abbreviated list of companies that manufacture folding bicycles:</p>
<ul>
<li><a href="https://zizzo.bike/">Zizzo</a></li>
<li><a href="https://usa.dahon.com/">Dahon</a></li>
<li><a href="https://us.brompton.com/">Brompton</a></li>
<li><a href="https://www.ternbicycles.com/us/bikes">Tern</a></li>
<li><a href="https://bikefriday.com/">Bike Friday</a></li>
<li><a href="https://retrospec.com/products/judd-folding-bike-single-speed">Retrospec</a></li>
<li><a href="https://www.strida.com/">Strida</a></li>
<li><a href="https://www.kwigglebike.com/en_US">Kwiggle</a></li>
<li>Schwinn</li>
<li>Electric bikes (E-bikes)
<ul>
<li><a href="https://www.radpowerbikes.com/">Rad Power Bikes</a></li>
<li><a href="https://www.aventon.com/">Aventon</a></li>
<li><a href="https://lectricebikes.com/">Lectric</a></li>
</ul>
</li>
</ul>
<h2 id="conclusion">Conclusion</h2>
<p>I enjoy my folding bike–it definitely fits a small feature gap that other “conventional bicycles” cannot support.</p>
<p>If you live in tight housing or you work at an office with insufficient or unsafe locations for locking a bike, folding your bike and carrying it inside is your best bet for preventing theft.</p>
Car Country2023-05-23T00:00:00+00:00https://maxmautner.com/2023/05/23/car-country<p>I had an opportunity to read <a href="https://cwwells.net/carcountry">this history book</a> about the USA’s car-centric transit design, from 1850’s to the present.</p>
<p>Chronologically, transit in America began with walking and horses.</p>
<p><img src="/public/images/grant-horse.jpg" alt="Ulysses Grant with horse" /></p>
<p>Trains, bicycles, electric streetcars and then the automobile followed.</p>
<p>But the original focus on the public road grew from economic & public health needs.</p>
<p>Roads as public spaces were treated as a <a href="https://en.wikipedia.org/wiki/Tragedy_of_the_commons">tragedy of the commons</a>.</p>
<p>Residents, visitors and businesses of the streets dumped their food scraps, raw human water waste, and horse droppings where the commerce and transit needs were the greatest:</p>
<p><img src="/public/images/colorized-street.jpeg" alt="New York City, 19th century" />)</p>
<p><img src="/public/images/typical-city-street.jpeg" alt="Typical American city street" />)</p>
<p>Cleaning up the roads was not a government responsibility–and was simply not tackled because of early political corruption in cities.</p>
<p>The author explains the demand and development of a professional sanitation and engineering approach, as public health harms reached objectionable levels and electric streetcars massively increased cities’ day-time density of foot traffic.</p>
<p>The author paints a sharp contrast between these urban problems of the road with problems facing roads in rural communities.</p>
<p>In the rurual communities, farms largely used roads to move their produce and livestock to train stations.</p>
<p>Similar to urban communities, rural road maintenance was not a full-time profession, making it too inefficient and expensive to maintain.</p>
<p>In fact road maintenance costs were entirely a local concern.</p>
<p>Farmer families would volunteer to maintain the roads in lieue of paying poll taxes towards outsourcing the labor of road maintainence.</p>
<p>Road investment (or lack thereof) was a local control issue:</p>
<blockquote>
<p>“The liberty of localities to perform their own functions in road building and road working is in danger,” one advocate of local control warned in 1804, “and if people do not exercise this liberty it will be wrested from them.”
…
If farmers cared about local control because of republican principles and the long-established tradition of home rule, they also cared because the sort of hard-surfaced, all-weather roads that good-roads reformers advocated were quite expensive. The high costs of road improvements prompted farmers to meet good-roads entreaties with three significant objections, all of which related to traditional methods of financing rural roads. <strong>First was a problem of equity</strong>: The financing for rural road improvements typically came entirely from local government revenue, especially property taxes levied on the owners of abutting property. Urban cyclists and other nonlocal travelers would derive clear benefit from hard-surfaced roads, but farmers alone were expected to foot the bill. <strong>Second was the problem of cash payments</strong>: Most good -roads proposals would not only increase the size of road taxes but they would also eliminate the traditional option of paying them in labor rather than cash. For cash-starved agricultural commu-nities, the combination of cash payments and higher taxes represented an untenable double burden. <strong>Third, many farmers regarded with skepticism good-roads claims that hard-surfaced roads represented a one-time investment</strong>–many enthusiasts referred to them as “permanent” roads–that would eventually pay itself back in reduced transportation costs.</p>
</blockquote>
<p>Fast-forwarding, the rise of the automobile and the poor quality of existing roads made road development a prerequisite to the mass adoption of the automobile.</p>
<p>This was well-noted by automobile entrepreneurs like Henry Ford, who identified the need to shift the American population from urban to suburban community design for maximal car adoption:</p>
<blockquote>
<p>“We shall solve the City Problem by leaving the City,” declared Henry Ford in one of his oft-quoted aphorisms. “Get the people into the country, get them into communities where a man knows his neighbor, where there is a commonality of interest, where life is not artificial, and you have solved the City Problem. You have solved it by eliminating the City.” As downtown interests struggled with snarled traffic and inadequate parking, real estate developers seized on Ford’s logic-not to eliminate the city, as Ford suggested, but to expand it in a radically new car-dependent form on the city’s outer fringe.</p>
</blockquote>
<p>The migration of urban to suburban occurred over a number of decades, sharply pronounced after World War II as a consequence of a great deal of veterans returning & migrating within the US and forming new households.</p>
<p>Meanwhile, urban commercial cores suffered as they failed to meet this new car-centric transit demand with land-use that met the unquenchable demand for car parking:</p>
<blockquote>
<p>Parking shortages improved somewhat in the 1930s, when the owners of vacant or otherwise unprofitable buildings razed existing structures to reduce tax valuations and opened parking lots to generate cash flow. The late 1930s also saw the proliferation of parking meters- -the first of which were installed in Kansas City in 1935-which effectively discouraged all-day street parking while generating reliable municipal revenue.
As off-street parking spaces multiplied and parking meters increased the turnover of on-street spots, many cities began to get a handle on their parking problems for the first time since the rapid growth of automotive traffic began. Downtown’s accessibility, on the other hand, remained a thorny issue, prompting cities across the country to draft plans for hugely expensive expressways as a way to facilitate the movement of cars to and from downtown. In the face of growing competition from outlying business districts, downtown was no longer the business district, but rather the largest and most central of many competing districts scattered across the city. And though downtown remained accessible by streetcar, many of the new competing business districts were entirely car-dependent in their location, in their site plans, and in their business practices.</p>
</blockquote>
<p>The rise of car-centric community planning was fully funded by the national government.</p>
<p>In part by the massive interstate highway system funded by Congress under the Eisenhower presidency.</p>
<p>But created and financed by a system of federally insured mortgages for homebuyers, that was pushed through in the face of a massive housing shortage post-WWII.</p>
<blockquote>
<p>By the end of World War II, a serious, long-term housing shortage wracked American cities, big and small alike. By 1945, housing starts had failed to keep up with demand for new housing through sixteen straight years of depression and war. The number of urban rental apartments actually contracted from 16.3 million in 1940 to just 13 million in 1950 as rentals converted into owner-occupied homes, highlighting the acuteness of the shortage as soldiers began to return home. The housing industry moved quickly to address these problems. Drawing on a host of new construction methods, including an adapted version of assembly-line techniques, housing construction boomed after World War Il, adding roughly Is million new housing units over the next decade. The overwhelming majority of these were single-family homes? With the housing sector booming, national homeownership rates crept upward. Homeowners reached majority status in the United States for the first time in the late 1940s, climbing to 55 percent in 19so and 62 percent in 1960.3 Nearly all of the increase came in car-dependent suburbs, where homeownership nearly doubled between 1940 and 1950.</p>
</blockquote>
<p>The author asks two important questions:</p>
<ol>
<li>Why did the housing industry respond to postwar demand with almost exclusively <em>suburban</em> construction?</li>
<li>Why did suburban growth overwhelmingly take the form of car-dependent landscapes?</li>
</ol>
<p>Both are explained by the decisionmaking of a federal bureaucracy called the Federal Housing Authority (FHA).</p>
<p>There was a preference to solve the problems that large-scale developers faced, as smaller scale developers had a bad reputation–and to overcome a common urban practice of “promotional” zoning, in which municipalities used zoning as a tool for maximizing tax revenue.</p>
<p>Instead, the FHA wanted new communities to use “protective” zoning, in which zoning was used to protect neighborhoods from new, value-disrupting land uses.</p>
<p>Coming to the present, the moves the FHA made in the 40s, 50s and 60s have been intractable and unchanged, as non-car transit options have been left to dwindle and fade in their funding.</p>
<p>Critically, oil prices have exhibited very little inflation.</p>
<p>Overall it is a solid read, and I would recommend reading it.</p>
<p><a href="https://twitter.com/maxmautner">Follow me on Twitter</a> to talk about this book and bicycles.</p>
<p><img src="/public/images/car-country.jpeg" alt="Car Country" /></p>
Writing Without Bullshit2023-05-04T00:00:00+00:00https://maxmautner.com/2023/05/04/writing-without-bullshit<p>Summary from listening to the audio book of “<a href="https://withoutbullshit.com/book">Writing Without Bullshit</a>: Boost Your Career by Saying What You Mean” by <a href="https://withoutbullshit.com/josh-bernoff">Josh Bernoff</a>.</p>
<p><img src="/public/images/writing-without-bullshit.jpeg" alt="" /></p>
<hr />
<h2 id="key-takeaway">Key takeaway</h2>
<p>Write as if your audience’s time is worth more than your own.</p>
<h2 id="how">How</h2>
<p>Do this by creating value for your audience–do not postpone/hide the delivery of value (information) in your writing).</p>
<p>Content formatting:</p>
<ul>
<li>utilize formatting (indentation, lists, tables) to break down walls of text</li>
<li>incorporate images, data visualization</li>
</ul>
<p>Consider your format–e.g. reading on a mobile phone screen.</p>
<p>For example with email: the subject line is 10 times more important than the email body.</p>
<p>Jargon & acronyms separate your audience into those who do and don’t know them.</p>
<p>Do not kill your audience size by unnecessarily using jargon/acronyms.</p>
<p>Use pronouns (you, me, we, I).</p>
<p>Eliminate:</p>
<ul>
<li>passive voice.</li>
<li>adverbs, qualifiers (very, generally), weasel words (most, many, few, countless).</li>
</ul>
<p>Shorter is better.</p>
<p>State numbers. Source them with care.</p>
<p>Use modern collaborative editing software (Google Docs, Dropbox/Box/Drive).</p>
<p>Creativity ideas:</p>
<ul>
<li>Create “fat” outlines. No harm to starting out “fat” as it’s easier to flesh out.</li>
<li>Research interviews.</li>
</ul>
<p>Editors do not dictate what to write–they help you see what you cannot see.</p>
<p>Communicate with your editor what you are uncertain about & to what degree you are seeking feedback.</p>
<h2 id="common-problems">Common problems</h2>
<ul>
<li>Too long.</li>
<li>Do not get to the point fast enough.</li>
<li>Passive voice.</li>
<li>Too much jargon, weasel words.</li>
<li>Not prescriptive enough–not focused on the audience.</li>
<li>Bad use of data.</li>
<li>Lack of structure.</li>
<li>No central idea.</li>
</ul>
<p>Not mentioned in the book–but <a href="https://hemingwayapp.com/">Hemingway App</a> is an interesting tool for eliminating passive voice:</p>
The Moral Imperative for Bike Lanes2023-04-06T00:00:00+00:00https://maxmautner.com/2023/04/06/the-moral-case-for-bike-lanes<p>What parents need now more than ever is the ability to set their kids free and have them be safe.</p>
<p>Bike lanes are a solution.</p>
<p>They make life easier, healthier and more fun for parents, kids and seniors.</p>
<p>While it builds our kids’ resilience and independence, it also <a href="https://www.sciencedaily.com/releases/2019/05/190529113036.htm">saves lives</a>.</p>
<p>Walking and biking myself around I see loads of bikes parked in the alleys of restaurants–our community’s wageworkers cannot afford the cost of being a victim of traffic violence.</p>
<p>Bike lanes also save families a jaw-dropping amount of money.</p>
<p>The annual cost of car ownership <a href="https://newsroom.aaa.com/2022/08/annual-cost-of-new-car-ownership-crosses-10k-mark/">now exceeds $10,000 per year</a>.</p>
<p>Enabling households to drop one of their cars is a massive windfall for our community–and those savings go directly to helping residents avoid displacement and stay in their homes!</p>
<p>The benefits of bike lanes are both quantifiable & unquantifiable.</p>
<p>They are quantifiable as more households build wealth by opting for fewer cars–reducing traffic & competitive street parking.</p>
<p>And they are unquantifiable: a next generation who are independent, resilient and responsible–prepared to participate in our community fully without needing to be 16 years old or have $10,000.</p>
<p><img src="/public/images/bike-lanes.png" alt="Bike lanes" /></p>
Biking to Work2023-03-13T00:00:00+00:00https://maxmautner.com/2023/03/13/biking-to-work<p>About a year ago I sold my car I had used for commuting and bought an e-bike for ~$1,000.</p>
<p>Where my drive to the bus stop previously took ~15 minutes, the e-bike ride took ~20 minutes–and was roughly the equivalent exercising of jogging for 2 miles.</p>
<p>This has been a huge help as I have lost ~15 pounds of bodyweight over the year since dropping driving a car.</p>
<p>I’ve since been intrigued by video production on bicycles–inspired in part by <a href="https://www.youtube.com/playlist?list=PLSHhOwcVorC5Skr91zvInLVMO5lfL5zs4">Terry Barentsen’s “Hotline” series in New York City</a>.</p>
<p>I live in San Mateo, California though–a much less dense area of the world than Manhattan–so the situations I capture on video while biking are very different from Terry’s footage!</p>
<p>I’ve studied & have largely tried to mimic Terry’s video production rig, making a video about my <a href="https://youtu.be/Ld9XlkTbFjc">bike video-recording setup</a> & here is a photo of it:</p>
<p><img src="/public/images/mic-and-gopro.jpeg" alt="H1n pro + GoPro Hero 8 Black with a Chesty mount" /></p>
<p>And here are the videos I’ve recorded of my bike commute for your enjoyment–both to and from:</p>
<h2 id="the-ride-to-work">The ride to work</h2>
<iframe width="560" height="420" style="max-width: 100%;" frameborder="0" src="//www.youtube.com/embed/FjjblFo8jao?color=white&theme=light"></iframe>
<h2 id="the-ride-home-from-work">The ride home from work</h2>
<iframe width="560" height="420" style="max-width: 100%;" frameborder="0" src="//www.youtube.com/embed/oGa-t4PdNAA?color=white&theme=light"></iframe>
<h2 id="conclusion">Conclusion</h2>
<p>I don’t think these videos will help persuade other folks to commute to work by bike.</p>
<p>Let’s be real: the video (and thumbnails) do a great job of depicting just how terrifying it is to be passed by aggressive drivers in excessively large vehicles.</p>
<p>I <em>do</em> think that any video footage of bicycling helps normalizes it as a valid mode of transportation.</p>
<p>And that is all I aim to do–alive or dead.</p>
First Anniversary2023-03-12T01:00:00+00:00https://maxmautner.com/2023/03/12/sf-bike-trip<p>My wife and I celebrated our first wedding anniversary and stayed in a hotel in San Francisco, across from the Ferry Building.</p>
<p>We had a fantastic view of the bay bridge:</p>
<p><img src="/public/images/sf-anniversary/view.jpeg" alt="View of the San Francisco Bay Bridge from 1 Hotel" /></p>
<p>We encountered rain before we could begin our bike ride:</p>
<p><img src="/public/images/sf-anniversary/rain.gif" alt="Raining in San Francisco" /></p>
<p>However we got rolling on our way to Sausalito on our e-bikes (which the hotel lent us for free!).</p>
<p><img src="/public/images/sf-anniversary/bike1.jpeg" alt="Riding e-bikes on Embarcadero" /></p>
<p>On our way to the Golden Gate we got some great views:</p>
<p><img src="/public/images/sf-anniversary/view4.jpeg" alt="View of the Golden Gate Bridge" /></p>
<p><img src="/public/images/sf-anniversary/view3.jpeg" alt="" /></p>
<p>Of Crissy Field and the city skyline:</p>
<p><img src="/public/images/sf-anniversary/view2.jpeg" alt="Crissy Field" /></p>
<p>We managed to swiftly cross the Golden Gate Bridge, however the micro-climate on the bridge was hailing(!) and it was demoralizing for my wife to complete the bike ride:</p>
<p><img src="/public/images/sf-anniversary/goldengate.jpeg" alt="Unhappy bicyclist" /></p>
<p>We biked ahead, down the hill to Sausalito where we ate lunch at Avatars, a restaurant I first visited over 10 years ago:</p>
<p><img src="/public/images/sf-anniversary/avatars.jpeg" alt="Samosas at Avatars in Sausalito" /></p>
<p>We opted to take the ferry home, from Sausalito to SF in under 20 minutes:</p>
<p><img src="/public/images/sf-anniversary/ferry.jpeg" alt="Sausalito-San Francisco Ferry" /></p>
<p><img src="/public/images/sf-anniversary/bikes.jpeg" alt="Two Rad Runner E-Bikes" /></p>
<p>With dinner and drinks at the restaurant, we witnessed the last night with the <a href="https://www.kron4.com/news/bay-area/the-moment-the-bay-bridge-lights-went-dark-watch/">bay bridge lights turned on</a>:</p>
<p><img src="/public/images/sf-anniversary/drinks.jpeg" alt="Drinks at 1 Hotel's Terrene Restaurant & Bar" /></p>
<p><img src="/public/images/sf-anniversary/lights.jpeg" alt="Bay Bridge lights" /></p>
<p>Not gonna miss them tremendously–there is so much natural (non-electric) beauty in the area.</p>
Legion of Honor2023-03-12T00:00:00+00:00https://maxmautner.com/2023/03/12/legion-of-honor<p>This Saturday I visited San Francisco for lunch and a visit to the <a href="https://en.wikipedia.org/wiki/Legion_of_Honor_(museum)">Legion of Honor</a> art museum.</p>
<p>Before traveling to the distant northwest side of the city we ate lunch at <a href="https://www.bstarbar.com/">B Star</a>, on Clement Street in the inner richmond.</p>
<p>I had vegetarian garlic noodles, it was good:</p>
<p><img src="/public/images/loh/food.jpeg" alt="B Star - vegetarian garlic noodles" /></p>
<p>We were surprised to learn that it was a free admissions day.</p>
<p>The special exhibit was “Sargent & Spain”–a collection of illustrations and paintings by a guy in Spain 1856-1925.</p>
<p>Some very nice looking contrasts:</p>
<p><img src="/public/images/loh/portrait.jpeg" alt="Spanish woman portrait by John Sargent" /></p>
<p>And some comical staredowns:</p>
<p><img src="/public/images/loh/staredown.jpeg" alt="Art gallery staredown between old man and painting of young man" /></p>
<p>Beyond Sargent, the main gallery has cool stuff.</p>
<p>Some Rodin sculptures (who made <a href="https://en.wikipedia.org/wiki/The_Thinker">the thinker</a>):</p>
<p><img src="/public/images/loh/pointing.jpeg" alt="A trio of sculpted men pointing down" /></p>
<p>Some busts:</p>
<p><img src="/public/images/loh/bust.jpeg" alt="A curly-haired Italian aristocrat sculpted bust" /></p>
<p><img src="/public/images/loh/bust2.jpeg" alt="Some Italian-looking sculpted bust" /></p>
<p>The lighting in these museums is fantastic–I wish I could shadow/follow whoever sets up the lights for these museums:</p>
<p><img src="/public/images/loh/lighting.jpeg" alt="Pretty lighting in the Legion of Honor museum" /></p>
<p>Really trippy demonic carving:</p>
<p><img src="/public/images/loh/carving.jpeg" alt="Demonic wood carving" /></p>
<p>Outside the museum is a statue of Joan of Arc, with some ominous San Francisco fog (and a golf course in the background.</p>
<p>As you step closer it gets more epic:</p>
<p><img src="/public/images/loh/joan.jpeg" alt="Joan of Arc" />
<img src="/public/images/loh/joan3.jpeg" alt="Joan of Arc" /></p>
<p>Here is the group that visited the museum together:</p>
<p><img src="/public/images/loh/group.jpeg" alt="Group outside Legion of Honor" /></p>
Running Injuries2023-01-24T00:01:00+00:00https://maxmautner.com/2023/01/24/running-injuries<p>Injuries from running are shockingly high.</p>
<p>There is an excellent review of academic studies on injury rates I recently read, and it has critical takeaways for those interested in running as a leisure or athletic activity:</p>
<p><a href="https://pubmed.ncbi.nlm.nih.gov/1439399/">Running injuries. A review of the epidemiological literature</a></p>
<p>Here are some choice excerpts of its abstract:</p>
<blockquote>
<p>Given the limitations of the studies it appears that for the average recreational runner, who is steadily training and who participates in a long distance run every now and then, <strong>the overall yearly incidence rate for running injuries varies between 37 and 56%</strong>.</p>
</blockquote>
<p>This is shockingly high. Of course, the injury risk is massively outweighed by the longterm health effects of physical exercise of any kind.</p>
<p>What is the root cause of these injuries?</p>
<blockquote>
<p>About 50 to 75% of all running injuries appear to be overuse injuries due to the constant repetition of the same movement.</p>
</blockquote>
<blockquote>
<p>…The prevention of sports injuries should focus on changes of behaviour by health education. Health education on running injuries should primarily focus on the importance of complete rehabilitation and the early recognition of symptoms of overuse, and on the provision of training guidelines.</p>
</blockquote>
<p>People run–and do not know how to listen to their bodies.</p>
<p><strong>Listen to your body!</strong></p>
<p><img src="/public/images/running.jpeg" alt="a runner running" /></p>
Why I bicycle2022-12-10T00:01:00+00:00https://maxmautner.com/2022/12/10/why-i-bicycle<p>It’s fun</p>
<p>It’s cheap</p>
<p>I need exercise for my health</p>
<p>I need social activity–bikes are slow enough to wave, make eye contact, & say hello</p>
<p>I need to get places</p>
<p>It’s good for the planet</p>
<p>It reminds me of my childhood</p>
<p>It feels like flying</p>
<p>I love passing cars</p>
<p>Parking is so easy</p>
<h2 id="why-do-i-not-bicycle">Why do I not bicycle?</h2>
<p>Emergency room visit</p>
<p>Many passengers</p>
<p>Heavy loads</p>
<p>Imbalanced loads</p>
<p>Avoiding bike theft</p>
<p>Night visibility</p>
<p><img src="/public/images/smbike.jpeg" alt="a bike in Santa Monica" /></p>
A Los Angeles commute2022-11-27T00:03:00+00:00https://maxmautner.com/2022/11/27/a-los-angeles-commute<p>I am traveling to Los Angeles this past Thanksgiving week and decided to try commuting to the Netflix LA offices by borrowing a bike from the hotel we stayed at.</p>
<p>It was pretty uneventful, and beautiful.</p>
<p>Here is the cruiser bicycle, riding down Abbot Kinney on the 10 minute ride:</p>
<p><img src="/public/images/la-commute/1.jpeg" alt="" /></p>
<p>The bicycle, mounted on the private corporate shuttle (I was the only one on the bus, probably because of Thanksgiving week):</p>
<p><img src="/public/images/la-commute/2.jpeg" alt="" /></p>
<p>The drive went on the freeway, where the bus’s rear bike rack was tested:</p>
<p><img src="/public/images/la-commute/3.jpeg" alt="" /></p>
<p>Arrived, at Netflix LA:</p>
<p><img src="/public/images/la-commute/6.jpeg" alt="" /></p>
<p>Some views:</p>
<p><img src="/public/images/la-commute/7.jpeg" alt="" />
<img src="/public/images/la-commute/8.jpeg" alt="" />
<img src="/public/images/la-commute/9.jpeg" alt="" /></p>
<p>I came back using the bus + bicycle, and got a great view of the sunset, looking towards Venice beach:</p>
<p><img src="/public/images/la-commute/10.jpeg" alt="" /></p>
<p>I would highly recommend getting out of a car.</p>
<p>You learn <em>so</em> much more about the sights and sounds of neighborhoods.</p>
Russia 1985-1999: TraumaZone2022-11-27T00:02:00+00:00https://maxmautner.com/2022/11/27/traumazone<p>I spent several hours watching a BBC documentary on <a href="https://www.youtube.com/playlist?list=PLSjQL8MYniTTLA3wnZ25U-s6RgR4uJNvL">pirated on YouTube</a> about post-Soviet Russia.</p>
<p>Here is a selection of still images I captured from the documentary that I think illustrate some poignant moments.</p>
<ul id="markdown-toc">
<li><a href="#extreme-poverty-equity-vouchers" id="markdown-toc-extreme-poverty-equity-vouchers">Extreme poverty, equity vouchers</a></li>
<li><a href="#striking-miners-in-ukraine" id="markdown-toc-striking-miners-in-ukraine">Striking miners, in Ukraine</a></li>
<li><a href="#on-fertilitypopulation-growthabortion" id="markdown-toc-on-fertilitypopulation-growthabortion">On fertility/population growth/abortion</a></li>
<li><a href="#auctioning-off-government-assets" id="markdown-toc-auctioning-off-government-assets">Auctioning off government assets</a></li>
<li><a href="#chechenschechnya" id="markdown-toc-chechenschechnya">Chechens/Chechnya</a></li>
<li><a href="#chechen-gangsters" id="markdown-toc-chechen-gangsters">Chechen gangsters</a></li>
<li><a href="#cosmonauts--economic-collapse" id="markdown-toc-cosmonauts--economic-collapse">Cosmonauts & economic collapse</a></li>
<li><a href="#grozny" id="markdown-toc-grozny">Grozny</a></li>
<li><a href="#ukraine-elections-leonid-kuchma" id="markdown-toc-ukraine-elections-leonid-kuchma">Ukraine elections, Leonid Kuchma</a></li>
<li><a href="#money-making-post-soviet-union" id="markdown-toc-money-making-post-soviet-union">Money-making, post-Soviet Union</a></li>
<li><a href="#price-liberalisation" id="markdown-toc-price-liberalisation">Price liberalisation</a></li>
<li><a href="#yegor-gaidar" id="markdown-toc-yegor-gaidar">Yegor Gaidar</a></li>
<li><a href="#boris-yeltsin-drunk" id="markdown-toc-boris-yeltsin-drunk">Boris Yeltsin, drunk</a></li>
<li><a href="#vladimir-zhirinovsky" id="markdown-toc-vladimir-zhirinovsky">Vladimir Zhirinovsky</a></li>
<li><a href="#more-boris-zhirinovsky" id="markdown-toc-more-boris-zhirinovsky">More Boris Zhirinovsky</a></li>
<li><a href="#invasion-of-chechnya-parallels-with-ukraine-invasion" id="markdown-toc-invasion-of-chechnya-parallels-with-ukraine-invasion">Invasion of Chechnya, parallels with Ukraine invasion</a></li>
<li><a href="#invasion-of-chechnya-part-2" id="markdown-toc-invasion-of-chechnya-part-2">Invasion of Chechnya, part 2</a></li>
<li><a href="#democratic-failure" id="markdown-toc-democratic-failure">Democratic failure</a></li>
<li><a href="#zhirinovsky-victimhood" id="markdown-toc-zhirinovsky-victimhood">Zhirinovsky Victimhood</a></li>
</ul>
<h2 id="extreme-poverty-equity-vouchers">Extreme poverty, equity vouchers</h2>
<p><img src="/public/images/traumazone/vouchers.png" alt="Vouchers" />
<img src="/public/images/traumazone/vouchers2.png" alt="Vouchers" />
<img src="/public/images/traumazone/vouchers3.png" alt="Vouchers" /></p>
<h2 id="striking-miners-in-ukraine">Striking miners, in Ukraine</h2>
<p><img src="/public/images/traumazone/striking-miners1.png" alt="Striking miners" />
<img src="/public/images/traumazone/striking-miners2.png" alt="Striking miners" /></p>
<h2 id="on-fertilitypopulation-growthabortion">On fertility/population growth/abortion</h2>
<p><img src="/public/images/traumazone/no-money1.png" alt="No money" />
<img src="/public/images/traumazone/no-money2.png" alt="No money" />
<img src="/public/images/traumazone/no-money3.png" alt="No money" /></p>
<h2 id="auctioning-off-government-assets">Auctioning off government assets</h2>
<p><img src="/public/images/traumazone/auction1.png" alt="Auction" />
<img src="/public/images/traumazone/auction2.png" alt="Auction" /></p>
<h2 id="chechenschechnya">Chechens/Chechnya</h2>
<p><img src="/public/images/traumazone/chechen-dance1.png" alt="Chechnya" />
<img src="/public/images/traumazone/chechen-dance2.png" alt="Chechnya" /></p>
<h2 id="chechen-gangsters">Chechen gangsters</h2>
<p><img src="/public/images/traumazone/chechen-gangsters.png" alt="Chechnyan gangsters" />
<img src="/public/images/traumazone/chechen-gangsters2.png" alt="Chechnyan gangsters" /></p>
<h2 id="cosmonauts--economic-collapse">Cosmonauts & economic collapse</h2>
<p><img src="/public/images/traumazone/cosmonaut1.png" alt="Cosmonaut" />
<img src="/public/images/traumazone/cosmonaut2.png" alt="Cosmonaut" /></p>
<h2 id="grozny">Grozny</h2>
<p><img src="/public/images/traumazone/grozny1.png" alt="Grozny, Chechnya" />
<img src="/public/images/traumazone/grozny2.png" alt="Grozny, Chechnya" /></p>
<h2 id="ukraine-elections-leonid-kuchma">Ukraine elections, <a href="https://en.wikipedia.org/wiki/Leonid_Kuchma">Leonid Kuchma</a></h2>
<p><img src="/public/images/traumazone/kuchma1.png" alt="Leonid Kuchma" />
<img src="/public/images/traumazone/kuchma2.png" alt="Leonid Kuchma" />
<img src="/public/images/traumazone/kuchma3.png" alt="Leonid Kuchma" /></p>
<h2 id="money-making-post-soviet-union">Money-making, post-Soviet Union</h2>
<p><img src="/public/images/traumazone/money1.png" alt="Money" />
<img src="/public/images/traumazone/money2.png" alt="Money" /></p>
<h2 id="price-liberalisation">Price liberalisation</h2>
<p><img src="/public/images/traumazone/price-liberalisation1.png" alt="Price liberalisation" />
<img src="/public/images/traumazone/price-liberalisation2.png" alt="Price liberalisation" /></p>
<h2 id="yegor-gaidar"><a href="https://en.wikipedia.org/wiki/Yegor_Gaidar">Yegor Gaidar</a></h2>
<p><img src="/public/images/traumazone/yegor1.png" alt="Yegor Gaidar" />
<img src="/public/images/traumazone/yegor2.png" alt="Yegor Gaidar" /></p>
<h2 id="boris-yeltsin-drunk">Boris Yeltsin, drunk</h2>
<p><img src="/public/images/traumazone/yeltsin-drunk1.png" alt="Boris Yeltsin" />
<img src="/public/images/traumazone/yeltsin-drunk2.png" alt="Boris Yeltsin" /></p>
<h2 id="vladimir-zhirinovsky"><a href="https://en.wikipedia.org/wiki/Vladimir_Zhirinovsky">Vladimir Zhirinovsky</a></h2>
<p><img src="/public/images/traumazone/zhirinovsky-problem1.png" alt="Vladimir Zhirinovsky" />
<img src="/public/images/traumazone/zhirinovsky-problem2.png" alt="Vladimir Zhirinovsky" />
<img src="/public/images/traumazone/zhirinovsky-problem3.png" alt="Vladimir Zhirinovsky" /></p>
<h2 id="more-boris-zhirinovsky">More Boris Zhirinovsky</h2>
<p><img src="/public/images/traumazone/zhirinovsky1.png" alt="Vladimir Zhirinovsky" />
<img src="/public/images/traumazone/zhirinovsky2.png" alt="Vladimir Zhirinovsky" /></p>
<h2 id="invasion-of-chechnya-parallels-with-ukraine-invasion">Invasion of Chechnya, parallels with Ukraine invasion</h2>
<p><img src="/public/images/traumazone/chechnya-invasion1.png" alt="Chechnya invasion" />
<img src="/public/images/traumazone/chechnya-invasion2.png" alt="Chechnya invasion" />
<img src="/public/images/traumazone/chechnya-invasion3.png" alt="Chechnya invasion" /></p>
<h2 id="invasion-of-chechnya-part-2">Invasion of Chechnya, part 2</h2>
<p><img src="/public/images/traumazone/chechnya-invasion4.png" alt="Chechnya invasion" />
<img src="/public/images/traumazone/chechnya-invasion5.png" alt="Chechnya invasion" />
<img src="/public/images/traumazone/chechnya-invasion6.png" alt="Chechnya invasion" />
<img src="/public/images/traumazone/chechnya-invasion7.png" alt="Chechnya invasion" />
<img src="/public/images/traumazone/chechnya-invasion8.png" alt="Chechnya invasion" /></p>
<h2 id="democratic-failure">Democratic failure</h2>
<p><img src="/public/images/traumazone/democracy1.png" alt="Democracy in Russia" />
<img src="/public/images/traumazone/democracy2.png" alt="Democracy in Russia" /></p>
<h2 id="zhirinovsky-victimhood">Zhirinovsky Victimhood</h2>
<p><img src="/public/images/traumazone/zhirinovsky-victim.png" alt="Zhirinovsky victim complex" /></p>
Post-9/11 Conflict2022-11-27T00:01:00+00:00https://maxmautner.com/2022/11/27/us-deaths-post-911<p><a href="https://watson.brown.edu/costsofwar/files/cow/imce/papers/2018/Human%20Costs%2C%20Nov%208%202018%20CoW.pdf">Human Cost of the Post-9/11 Wars: Lethality and the Need for Transparency (PDF)</a></p>
<p><img src="/public/images/us-deaths.png" alt="US deaths stemming from post-9-11 wars.png " /></p>
<p>Post-traumatic stress disorder is massively under-appreciated by your average American.</p>
Half Moon Bay2022-07-07T00:01:00+00:00https://maxmautner.com/2022/07/07/bike-camping<p>I took a bicycle ride to Half Moon Bay, to camp overnight.</p>
<p>It was delightful, and I took a number of photos.</p>
<p>This was the first photo I took, before beginning the climb up Highway 92:</p>
<p><img src="/public/images/hmb-ride/crystal-springs.jpeg" alt="Crystal Springs Reservoir" /></p>
<p>This was after reaching the summit of Highway 92:</p>
<p><img src="/public/images/hmb-ride/summit.jpeg" alt="Highway 92 Summit" /></p>
<p>I reached the campground without too much bother, and slept restlessly without a tent:</p>
<p><img src="/public/images/hmb-ride/end-of-ride.jpeg" alt="Bike in front of beach view" /></p>
<p>In the morning I captured a couple of photos before beginning the journey back:</p>
<p><img src="/public/images/hmb-ride/rv-parking.jpeg" alt="RV campground at sunrise" />
<img src="/public/images/hmb-ride/view.jpeg" alt="View of the fog in Half Moon Bay" /></p>
<p>I left the campground after sunrise, and before 6am.</p>
<p>The return ride felt a little easier, having gotten comfortable with the route in some sense.</p>
<p>The view of Crystal Springs Reservoir was made better by fog and cloud cover:</p>
<p><img src="/public/images/hmb-ride/crystal-springs2.jpeg" alt="View of Crystal Springs Reservoir in early morning" /></p>
Onsite2022-05-04T00:01:00+00:00https://maxmautner.com/2022/05/04/onsite<p>Forget the corporate “offsite”</p>
<p>The “onsite” is the new corporate gathering in the inverted remote work world.</p>
<p>I took some candids from the festivities (meetings):</p>
<p><img src="/public/images/nflx-ian.jpeg" alt="Ian" />
<img src="/public/images/nflx-alisa-la.jpeg" alt="Alisa & La" />
<img src="/public/images/nflx-sergii-dh.jpeg" alt="Sergii & DH" /></p>
An updated goal list2022-02-21T00:01:00+00:00https://maxmautner.com/2022/02/21/goals<p><img src="/public/images/target.png" alt="Goals" /></p>
<p>Alongside my list of publicly stated <a href="/2019/12/02/interests2.html">interests</a>, I figured I’d publicly document some abstract goals that I’ve mulled over & collected:</p>
<ul>
<li>produce documentaries (politics, relationship between labor & capital)</li>
<li>compete in powerlifting into my 70s (80s?)</li>
<li>deeply learn computer profiling/software testing</li>
<li>minimize car-driving, maximize walking</li>
<li>retirement income eclipsing salary</li>
<li>support family financially (health, housing, education)</li>
<li>lead a healthy love life & build a family</li>
</ul>
<p>They are not static goals, but very dynamic–by that I just mean that I expect they will change over time.</p>
<p>I document & share them to take a snapshot of a point in time of my life, for reflection in the future.</p>
<p>I’m curious to hear <em>your</em> goals, <a href="https://twitter.com/maxmautner">ping me on Twitter</a> to discuss.</p>
Early life lessons2022-02-19T00:01:00+00:00https://maxmautner.com/2022/02/19/early-life-lessons<p><img src="/public/images/dad.jpg" alt="Max's father" /></p>
<p>I had saved $1,000 from a summer job in college. I had learned in high school & college the importance of not just saving your money but investing it too.</p>
<p>But I didn’t understand the “how” of investing.</p>
<p>How do you buy stocks, or bonds?</p>
<p>So I asked my dad.</p>
<p>My dad referred me to his broker at a name brand financial company.</p>
<p>My dad had been “working with” this well-groomed 55-year old man for the past 30 years, managing my parents’ investments & savings.</p>
<p>I get on a phone call with the guy–he tells me “since your father’s my client, sure I will create you a brokerage account. What do you want me to buy?”</p>
<p>I remember I spent several hours after that phone call on free stock research websites like Yahoo Finance, Google Finance, Morningstar.</p>
<p>I settled on an exchange-traded fund–a real estate investment trust ($<a href="https://www.bloomberg.com/quote/FTY:US">FTY</a>, now $<a href="https://g.co/finance/BLK:NYSE">BLK:US</a>) and called up the guy to place my order for $1000 worth of $FTY.</p>
<p>“The trading commission will be $70.”</p>
<p>So I had bought $930 worth of $FTY for a $70 commission.</p>
<p>I spent 7% of my savings on a commission to be able to buy $FTY.</p>
<p>And it would have been another $70 or 7% to sell my $FTY!</p>
<p>Is that a lot? Is that a little?</p>
<p>It is a lot.</p>
<p>At that point in time (2009) you could open a free account with Charles Schwab where trading commissions were $7/trade.</p>
<p>So my father’s broker was 10x more expensive.</p>
<p>All for the opportunity to be able to place your order of the telephone, rather than a website.</p>
<p>I still rage at this experience.</p>
<p>But this experience taught me, there are even some very adult topics (like finance) that your elders (in this case my father) may not fully understand.</p>
<p>You must follow your passions & watch out for yourself–channel your rage into understanding.</p>
<p>Maybe one day you will have gained wisdom to impart to your family & friends that your parents did not.</p>
Saying thank you2021-12-28T00:01:00+00:00https://maxmautner.com/2021/12/28/saying-thank-you<p>Saying “thank you” signals that a non-cash debt has been paid off or created.</p>
<p>It does not demonstrate a true intention to complete a debt’s repayment.</p>
<p>What are some of the best actions you can take to gift to others?</p>
<p>Instead of saying thank you?</p>
<p>Here are some of my ideas:</p>
<ul>
<li>travel to them & visit with them</li>
<li>listen to them, only ask questions</li>
<li>in parting, give them a hug if they want one</li>
<li>record a song about them, and share it with them</li>
</ul>
San Mateo County History Museum2021-11-28T00:01:00+00:00https://maxmautner.com/2021/11/28/smc-history-museum<p>My household visited the <a href="https://historysmc.org/plan-your-visit/">San Mateo County History Museum</a> on a whim, and had an awesome time.</p>
<p>Here’s some notes about the experience!</p>
<p><img src="/public/images/smc-history.jpeg" alt="San Mateo County History Museum" /></p>
<p>We visited the day after Thanksgiving (a Friday), around noon.</p>
<p>We had the whole 2-story museum to ourselves, besides the woman at the frontdesk where it cost $6 per adult ticket.</p>
<p>The first section of the museum we entered discussed the history of transportation in San Mateo County.</p>
<p>It traced the progression from walking, to horse-drawn carriages, to trains, and then to automobiles & buses.</p>
<p>The transportation installation goes to lengths to illustrate just how prohibitively expensive that chartered stage coach rides were up until the 20th century (and how dreadfully uncomfortable they must have been).</p>
<p>It also illustrates how undesirable gas-powered cars were when they were first introduced.</p>
<p>I learned that a big increase in the suburban San Francisco population occurred after the 1906 earthquake which led to folks fleeing the destroyed city and the rise of affordable public streetcars for middle-class commuters.</p>
<p>It was also surprising to learn about the history (and fate) of the coastal train line, running from SF down past Santa Cruz.</p>
<p>This proved unsustainable due to competition from cars, earthquakes destroying the infrastructure, and seasonality of tourism to coastal towns like Half Moon Bay.</p>
<p>In growing as a suburb, big tracts of land owned by the wealthy were subdivided into plots of land for single-family homes, like Hayward Park (<a href="https://www.google.com/maps/place/Hayward+Park,+San+Mateo,+CA/">Google Maps</a>):</p>
<p><img src="/public/images/hayward-park.jpeg" alt="Hayward Park subdivision" /></p>
<p>Progressing around the first floor, there were also sections dedicated to:</p>
<ul>
<li>the <a href="https://en.wikipedia.org/wiki/Ohlone">Ohlone people</a> (the indigenous of the San Francisco bay area)</li>
<li>how economic innovations in housing construction enabled mass homeownership of higher quality, cheaply-produced homes (e.g. <a href="https://en.wikipedia.org/wiki/Joseph_Eichler">Joseph Eichler</a>)</li>
<li>a section dedicated to the expansion of the train lines, connecting the west and east coast economies of the United States via train (photo below)</li>
</ul>
<p><img src="/public/images/train.jpeg" alt="Train" />
<img src="/public/images/trains-photo.jpeg" alt="Trains & photography" /></p>
<p>The second floor has several distinct installations:</p>
<ul>
<li>the old county courthouse (photos below)</li>
<li>history and memorial to law enforcement officers of San Mateo County</li>
<li>a dedicated section of entrepreneurs who got their start in San Mateo County (there are an impressive amount–including <a href="https://en.wikipedia.org/wiki/Steve_Jobs">Steve Jobs</a>, <a href="https://en.wikipedia.org/wiki/Elon_Musk">Elon Musk</a>, and many pharma & tech innovators like the inventor of the birth-control pill)</li>
</ul>
<p><img src="/public/images/courthouse.jpeg" alt="Old county courthouse" /></p>
<p><img src="/public/images/courthouse2.jpeg" alt="Jessie in the judge's chair" /></p>
<p>Overall, it was an extremely illuminating museum experience–I highly recommend experiencing it for yourself!</p>
Alternative experiment protocols2021-08-24T00:01:00+00:00https://maxmautner.com/2021/08/24/alternative-experimentation-protocols<p>I came across an interesting list of alternatives to vanilla A/B testing in this blogpost, “<a href="https://www.crosstab.io/articles/experiment-platform-purpose">Choose your experiment platform wisely</a>”:</p>
<blockquote>
<p>Good experiment platforms go beyond the minimum functionality in many ways. Among other things, they may…allow experiment protocols other than simple A/B testing. <a href="https://en.wikipedia.org/wiki/Crossover_study">Crossover</a>,<a href="https://medium.com/@DoorDash/switchback-tests-and-randomized-experimentation-under-network-effects-at-doordash-f1d938ab7c2a">switchback</a>, <a href="https://multithreaded.stitchfix.com/blog/2020/08/05/bandits/">bandit</a>, and <a href="https://bgweber.github.io/experimentation.html#staged-rollouts">staged rollout</a> protocols (among others) have advantages over A/B designs in relevant situations</p>
</blockquote>
<p>Here is a short summary of what exactly these alternative “experiment protocols” mean:</p>
<h2 id="crossover">Crossover</h2>
<p>Example referenced: <a href="https://en.wikipedia.org/wiki/Crossover_study">Crossover study - Wikipedia</a></p>
<p>“…a <a href="https://en.wikipedia.org/wiki/Longitudinal_study">longitudinal study</a> in which <a href="https://en.wikipedia.org/wiki/Human_subject_research">subjects</a> receive a sequence of different <a href="https://en.wikipedia.org/wiki/Medical_case_management">treatments</a>.”</p>
<p>“Nearly all crossover are designed to have “balance”, whereby all subjects receive the same number of treatments and participate for the same number of periods. In most crossover trials each subject receives all treatments, in a random order.”</p>
<p>“These studies are often done to improve the symptoms of patients with <a href="https://en.wikipedia.org/wiki/Chronic_(medicine)">chronic conditions</a>. For curative treatments or rapidly changing conditions, cross-over trials may be infeasible or unethical.”</p>
<p><strong>Takeaway</strong>: this is useful if you have hypotheses about sequencing a repeatable treatment (like applying a medicine to a patient over time).</p>
<h2 id="switchback">Switchback</h2>
<p>Example referenced: <a href="https://medium.com/@DoorDash/switchback-tests-and-randomized-experimentation-under-network-effects-at-doordash-f1d938ab7c2a">Switchback Tests and Randomized Experimentation Under Network Effects at DoorDash</a></p>
<p>“To be able to experiment in the face of network effects, we use a technique known as switchback testing, where we switch back and forth between treatment and control in particular regions over time. This approach resembles A/B tests in many ways, but requires certain adjustments to the analysis.”</p>
<p>“…<em>the core concept is that we switch back and forth between control and treatment algorithms in a certain region at alternating time periods</em>. For example, in the SOS pricing example, we switch back and forth every 30 minutes between having SOS pricing and not having SOS pricing. We then compare the customer experience and marketplace efficiency between the control time bucket and treatment time bucket metrics corresponding to the decisions made by the algorithm during the two periods.”</p>
<p><strong>Takeway</strong>: this is useful if your variants affect each other–for example one variant siphons available resources from a second variant.</p>
<h2 id="bandit">Bandit</h2>
<p>Example referenced: <a href="https://multithreaded.stitchfix.com/blog/2020/08/05/bandits/">Multi-Armed Bandits and the Stitch Fix Experimentation Platform</a></p>
<p>“a multi-armed bandit learns to divert traffic away from poorly-performing arms and towards the better-performing ones.”</p>
<p>“The multi-armed bandit model is a simplified version of reinforcement learning, in which there is an agent interacting with an environment by choosing from a finite set of actions and collecting a non-deterministic reward depending on the action taken. The goal of the agent is to maximize the total collected reward over time.“</p>
<p>“The agent must make decisions based on incomplete information, resulting in a dilemma known as the <em>explore vs. exploit problem</em>. Early in the process, reward estimates are highly uncertain, so the agent is compelled to gather evidence about all the available actions, in order to be more certain about which action is likely to produce the highest average reward.”</p>
<p>“can provide more efficient optimization than standard A/B tests in some circumstances, and a more flexible method for long-term optimization”</p>
<p><strong>Takeaway</strong>: this protocol is useful if you have many variants, are okay with letting the test run for a longer time period (perhaps indefinitely), and wish to minimize “regret” (opportunity cost) from over-allocating to under-performing variants.</p>
<h2 id="staged-rollouts">Staged rollouts</h2>
<p>Example referenced: <a href="https://bgweber.github.io/experimentation.html#staged-rollouts">Data Science for Startups</a></p>
<p>“…it may not be possible to control which users are part of a treatment group for an experiment…two different approaches for drawing conclusions when you do not have direct control of assigning experiment groups”</p>
<p>“Staged rollouts enable developers to release a new build to a subset of the user base. Rather than implementing A/B logic within the application itself, by writing ‘if’ blocks that maintain separate treatment and control code paths, developers can build two separate versions and deploy them simultaneously. This feature is useful when making major changes to an application, such as redesigning the UI. A drawback of staged rollouts is that we no longer control the A/B splits for experiments. Common use cases for staged rollouts include:</p>
<ol>
<li>Testing the stability of a new release.</li>
<li>Measuring the usage of new features.</li>
<li>Measuring the impact of a new release on metrics.”</li>
</ol>
<p><strong>Takeaway</strong>: this protocol is appropriate/useful if you do not have granular control over applying your variants’ treatment. For example if your experience is downloadable from an app store where you are beholden to their limited or non-existent experimentation tooling.</p>
<h2 id="conclusion">Conclusion</h2>
<p>It’s always interesting to learn about these variations on the classic A/B testing experimentation protocol. As more software-enabled businesses crop up, there will be more distinctive experimentation protocols being applied–knowing about these innovations may help you when you encounter such distinctive situations.</p>
Podcasting workshop2021-08-09T00:01:00+00:00https://maxmautner.com/2021/08/09/podcasting-workshop<p>Given my podcasting experience over the years I’ve thought about how I could share/evangelize my process for producing podcast content.</p>
<p>If I were teaching a podcasting workshop then this is what I would cover:</p>
<ul>
<li>Why audio-only?
<ul>
<li>Low production costs
<ul>
<li>Equipment</li>
<li>Editing</li>
<li>Sourcing guests</li>
<li>Publishing/hosting</li>
<li>Promotion</li>
</ul>
</li>
<li>Audience
<ul>
<li>You’re reaching an audience that doesn’t require a screen</li>
</ul>
</li>
<li>You are ugly
<ul>
<li>Not actually: no fashion, makeup required</li>
</ul>
</li>
</ul>
</li>
<li>Even if you are only publishing audio, record the conversation with video conferencing
<ul>
<li>Body language</li>
<li>Building rapport rapidly</li>
<li>Signaling interest</li>
</ul>
</li>
<li>Video-conferencing options:
<ul>
<li>Yes: Google Meet, Zoom, Skype, Microsoft Teams</li>
<li>No: Zencastr, Jitsi</li>
</ul>
</li>
<li>How to capture
<ul>
<li>Audio Hijack</li>
<li>Quicktime</li>
<li>Zencastr</li>
<li>In-person
<ul>
<li>iOS</li>
<li>Android</li>
<li>Dedicated audio recorder (Zoom H1n)</li>
</ul>
</li>
</ul>
</li>
<li>How to edit
<ul>
<li>Do you have to edit? Why?</li>
<li>Software
<ul>
<li>Audacity</li>
<li>iMovie</li>
<li>FCPX</li>
</ul>
</li>
</ul>
</li>
<li>The process (from idea to publishing)
<ul>
<li>Scheduling</li>
<li>Pre-interview
<ul>
<li>Time for rapport building</li>
<li>Topic identification</li>
</ul>
</li>
<li>IP waiver</li>
<li>Recording duration</li>
</ul>
</li>
<li>Hosting options
<ul>
<li>Sole host</li>
<li>Federated hosts (e.g. Software Engineering Radio)</li>
</ul>
</li>
<li>Promotion options
<ul>
<li>Social
<ul>
<li>Reddit</li>
<li>Twitter</li>
<li>LinkedIn</li>
</ul>
</li>
<li>SEO
<ul>
<li>Google</li>
<li>Podcast indices
<ul>
<li>Apple</li>
<li>Spotifhy</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>I’ve hosted over 100 episodes of <a href="https://theaccidentalengineer.com/">The Accidental Engineer</a>, if you’re curious for my credentials on this topic.</p>
<p>If you’d want to participate in such a workshop then let me know! I’m reachable on Twitter <a href="https://twitter.com/maxmautner">@maxmautner</a>.</p>
Being Ignored & Building Software2021-08-09T00:00:00+00:00https://maxmautner.com/2021/08/09/being-ignored<p>I joined my first startup as the second employee of the newly-formed email marketing team.</p>
<p>This was my first software engineering job, and I received no guidance in software engineering best practices.</p>
<p>These best practices cover the “how” of creating software products, including how to release new versions, logging, monitoring, and alerting when things break–stuff that is called “devops” or “site reliability engineering” these days.</p>
<p>I knew none of this and was stumbling blindly, rolling on the floor in sadness when I’d mistakenly drop a table from the database.</p>
<p>Six months after I joined the company, a bearded fellow came on board. He was an MIT grad student & ex-startup founder.</p>
<p>He was seated near me in the cubicle-strewn office space.</p>
<p><img alt="Joe with a Pickle" src="/public/images/joe.jpeg" width="100%" /></p>
<p>His name was Joe and I really liked Joe. Joe was quiet and highly regarded by the most senior folks at the company who had recruited him. And so, in trying to learn my way through software engineering I attached myself to Joe.</p>
<p>I would approach Joe’s desk & ask questions, bringing him the multitude of problems I encountered when creating software for the first time:</p>
<ul>
<li>“How come I can’t connect to this database?”</li>
<li>“Why is this taking so long–how can I make it faster?”</li>
<li>“Is it safe to run this command?”</li>
</ul>
<p>Joe taught me great lessons–primarily by telling me to go F myself.</p>
<p>Maybe not those words specifically, but he would ignore me. His eyes would remain focused on his monitor as I would walk up to him to ask him questions. He’d keep clicking at his keyboard as I’d try and impose my presence in his sentient line-of-sight.</p>
<p>I failed to understand a simple truth: he was working on stuff that he was obligated to get done, and I was committing theft. I was a selfish, self-absorbed coworker who was trying to enlist their assistance in my tasks.</p>
<p>Learning this truth is critical to maturing as a software engineer.</p>
<p>Joe was formative for my software engineering career. The simple act of ignoring me did more to improve my behavior around learning software engineering than if he had answered my questions.</p>
<p>If you are a junior software engineer then being ignored by your engineering colleagues is a critical maturing process for how you approach problem-solving.</p>
Screenshare iOS to Zoom, Meet2021-05-02T00:00:00+00:00https://maxmautner.com/2021/05/02/screenshare-ios<p>I produced a short video on how to share your iPhone (or iPad) screen with people you meet on <a href="">Google Meet</a> or <a href="">Zoom</a>:</p>
<iframe width="560" height="420" style="max-width: 100%;" frameborder="0" src="//www.youtube.com/embed/zH1m3z8XuNo?color=white&theme=light"></iframe>
<p>This technique came in handy when I attended a 1-on-1 photo lesson with <a href="https://www.sebfurtado.com/">Seb Furtado</a>, where we both reviewed my usage of <a href="https://apps.apple.com/us/app/adobe-lightroom-photo-editor/id878783582">Lightroom mobile</a> on my iPhone.</p>
<p>Hope it helps other folks–I continue to try and improve the production quality of these videos.</p>
<p>I think I am creating these “how to” videos because they are entirely on my own schedule and don’t require coordination with anyone else.</p>
<p>I would really rather do video production that involves a lot more of a social component (whether documentary or fiction, not sure)–hopefully I can exercise more of that post-COVID (which seems to be almost upon us!).</p>
<p>If you have any follow-up questions don’t hesitate to reach me on <a href="https://twitter.com/maxmautner">Twitter: @maxmautner</a>.</p>
Chrome Productivity2021-04-13T00:00:00+00:00https://maxmautner.com/2021/04/13/chrome-productivity<p>I made a short tutorial on Chrome keyboard shortcuts on the Mac:</p>
<iframe width="560" height="420" style="max-width: 100%;" frameborder="0" src="//www.youtube.com/embed/atl5dEc66-A?color=white&theme=light"></iframe>
<p>I used <a href="https://www.telestream.net/screenflow/overview.htm">Screenflow</a> to capture my desktop, which has some nice tools for highlighting elements of your screen it didn’t help me produce a truly great video.</p>
<p>I also used a Sony RX100 vi point-and-shoot camera to capture the video of myself, with some simple lighting around my desk setup.</p>
<p>It came out really nice–but realistically I don’t expect that higher “production quality” of the video drives long-term big traffic for videos like this.</p>
<p>After spending the 1.5 hours producing this video I immediately regret not doing a better introduction.</p>
<p>Explaining a summary up front of “what you’ll learn” would probably perform better (from a retention/dropoff perspective).</p>
<p>I don’t really intend to promote this video, just offering it up to be indexed by the great Google/YouTube Search algorithm in the sky as a sacrifice to learn about video production.</p>
Chrome extensions I use2021-04-12T00:00:01+00:00https://maxmautner.com/2021/04/12/chrome-extensions<p>I only use 4 Chrome extensions on my Macbook–for productivity & security:</p>
<h2 id="ublock-origin"><a href="https://chrome.google.com/webstore/detail/ublock-origin/cjpalhdlnbpafiamejdnhcphjbkeiagm?hl=en">uBlock Origin</a></h2>
<p>My one and only adblocker. It makes YouTube, Facebook, Reddit & general web browsing readable.</p>
<h2 id="https-everywhere"><a href="https://chrome.google.com/webstore/detail/https-everywhere/gcbommkclmclpchllfjekcdonpmejbdp?hl=en">HTTPS Everywhere</a></h2>
<p>Helps prevent man-in-the-middle attacks. It doesn’t prevent you from visiting “http://” URLs, but it does provide helpful warnings.</p>
<h2 id="lastpass"><a href="https://chrome.google.com/webstore/detail/lastpass-free-password-ma/hdokiejnpimakedhajhdlcegeplioahd?hl=en-US">LastPass</a></h2>
<p>Cross-platform password manager–worth the $3/month to not be in Chrome vendor lock-in/shared to iOS/Android as necessary.</p>
<h2 id="meet-transcript"><a href="https://chrome.google.com/webstore/detail/meet-transcript/jkdogkallbmmdhpdjdpmoejkehfeefnb/related?hl=en">Meet Transcript</a></h2>
<p>I use this tool to capture transcripts automatically (by default) of Google Meet video conference calls I want to record.</p>
<hr />
<p>What do you use? Am I missing? Let me know: <a href="https://twitter.com/maxmautner">@maxmautner</a></p>
Jekyll + Emails2021-04-12T00:00:00+00:00https://maxmautner.com/2021/04/12/jekyll-emails<p>Here at <em>maxmautner.com</em> we are big fans of <a href="https://jekyllrb.com/">Jekyll, the static site generator</a>.</p>
<p>We recognize that many of our readers prefer to read our content via email. In order to support this we use a Jekyll theme called <a href="https://gitlab.com/cscottmills/loom/-/tree/master">Loom</a> converts our posts into HTML emails that look pretty on your little phones.</p>
<p>Your Jekyll site probably already has a theme so switching to Loom is a non-starter. This was the case for me so I cherry-picked the files needed from Loom to generate the email:</p>
<ul>
<li><code class="highlighter-rouge">scripts/email.sh</code></li>
<li><code class="highlighter-rouge">email.html</code></li>
<li><code class="highlighter-rouge">latest.md</code></li>
<li><code class="highlighter-rouge">resources/*</code></li>
<li>and copying over a few things from <code class="highlighter-rouge">_config.yml</code></li>
</ul>
<h2 id="our-workflow">Our Workflow</h2>
<p>Having installed the requirements (some Ruby, some NodeJS), a simple bash script converts your latest Jekyll post from markdown to HTML with inlined CSS.</p>
<p>Inlining of CSS is a critical step, as HTML emails viewed at Gmail.com or in your iPhone’s Mail app will not load remote CSS files.</p>
<p>Here is an example screenshot of this post as an email:</p>
<p><img src="/public/images/loom-email.png" alt="Example maxmautner.com email" /></p>
<p>To generate the HTML email I ran <code class="highlighter-rouge">./scripts/email.sh</code>, then to send it used a Python script I wrote below in combination with the Amazon Web Service command line tool (<a href="https://pypi.org/project/awscli/">awscli</a>):</p>
<p><code class="highlighter-rouge">blah.py</code>:</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">json</span>
<span class="n">fname</span> <span class="o">=</span> <span class="s">'/path/to/index.html'</span>
<span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="s">'message.json'</span><span class="p">,</span> <span class="s">'w'</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
<span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">json</span><span class="o">.</span><span class="n">dumps</span><span class="p">({</span>
<span class="s">"Subject"</span><span class="p">:</span> <span class="p">{</span>
<span class="s">"Data"</span><span class="p">:</span> <span class="s">"Test email sent using the AWS CLI"</span><span class="p">,</span>
<span class="s">"Charset"</span><span class="p">:</span> <span class="s">"UTF-8"</span>
<span class="p">},</span>
<span class="s">"Body"</span><span class="p">:</span> <span class="p">{</span>
<span class="s">"Text"</span><span class="p">:</span> <span class="p">{</span>
<span class="s">"Data"</span><span class="p">:</span> <span class="s">"This is the message body in text format."</span><span class="p">,</span>
<span class="s">"Charset"</span><span class="p">:</span> <span class="s">"UTF-8"</span>
<span class="p">},</span>
<span class="s">"Html"</span><span class="p">:</span> <span class="p">{</span>
<span class="s">"Data"</span><span class="p">:</span> <span class="nb">open</span><span class="p">(</span><span class="n">fname</span><span class="p">)</span><span class="o">.</span><span class="n">read</span><span class="p">(),</span>
<span class="s">"Charset"</span><span class="p">:</span> <span class="s">"UTF-8"</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="p">}))</span>
</code></pre></div></div>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span>python blah.py
<span class="nv">$ </span>aws ses send-email <span class="se">\</span>
<span class="nt">--from</span> <my-verified-sender-address> <span class="se">\</span>
<span class="nt">--to</span> myself@gmail.com <span class="se">\</span>
<span class="nt">--message</span> file://message.json
</code></pre></div></div>
<p>And voila!</p>
<p>A few things to be mindful of:</p>
<ul>
<li>this HTML email does not have a plain text version, generating one is left as an exercise for the reader</li>
<li>to style the email with custom CSS requires editing the SCSS under the resources directory (something which I haven’t done yet)</li>
<li>images in the generated HTML emails may have relative URLs instead of absolute–this is okay on your website but must be absolute URLs in your emails or the images won’t render</li>
</ul>
<p>Best of luck, I am sure you can find workflow improvements from here on out.</p>
Improving Audio2021-04-07T00:00:00+00:00https://maxmautner.com/2021/04/07/improving-audio<p>I have spent a <em>lot</em> of time on video-conferencing calls these past 12 months.</p>
<p>I am generally aware of how lo-fidelity communication over Google Meet/Zoom/etc is.</p>
<p>As a result, I’ve found entertainment in trying to improve the fidelity of my communication with coworkers.</p>
<p>I conducted a simple test comparing 3 different microphones:</p>
<ul>
<li>the built-in mic on Macbook</li>
<li>iPhone earpods</li>
<li>Zoom H4N Pro</li>
</ul>
<h3 id="built-in-mic-on-macbook">built-in mic on Macbook</h3>
<audio controls="">
<source src="/public/audio/audiosample-desktop.m4a" type="audio/mpeg" />
Your browser does not support the audio element.
</audio>
<p><img src="/public/images/audio-macbook.JPG" alt="2019 Macbook Pro" /></p>
<h3 id="iphone-earpods">iPhone earpods</h3>
<audio controls="">
<source src="/public/audio/audiosample-earpods.m4a" type="audio/mpeg" />
Your browser does not support the audio element.
</audio>
<p><img src="/public/images/audio-earpods.JPG" alt="iPhone earpods" /></p>
<h3 id="zoom-h4n-pro">Zoom H4N Pro</h3>
<audio controls="">
<source src="/public/audio/audiosample-h4n.m4a" type="audio/mpeg" />
Your browser does not support the audio element.
</audio>
<p><img src="/public/images/audio-h4n.JPG" alt="Zoom H4N Pro" /></p>
<p>I used these instructions <a href="https://www.youtube.com/watch?v=i_YLw0jngZY">from YouTube on how to connect the Zoom H4N</a> as an external microphone on my Macbook.</p>
<p><a href="https://www.bhphotovideo.com/c/product/1459383-REG/zoom_h4n_pro_black_h4n_pro_4_channel_handy.html">Zoom H4N Pro</a> can be picked up on B&H Photo for ~$220 USD.</p>
<hr />
<h2 id="conclusion">Conclusion</h2>
<p>I think it’s undebatable: the Zoom sounds better hands-down.</p>
<p><em>However</em>, this is recorded locally on my computer–not as it sounds to someone on the other end of a Google Meet/Zoom/Skype/etc.</p>
<p>A more authentic test would capture the audio as it sounds over the wire–apologies that I did not do that!</p>
Content Marketing Tips2021-03-04T00:00:00+00:00https://maxmautner.com/2021/03/04/condensed-content-marketing-tips<p>I am condensing two resources I’ve come across that explain the explanatory variables of powerful content marketing.</p>
<h2 id="priceonomics-content-marketing-handbook"><a href="https://priceonomics.com/the-content-marketing-handbook/">Priceonomics Content Marketing Handbook</a></h2>
<h3 id="what-to-write">What to Write</h3>
<p>Write about information. Make it good. Have a plan for how it will spread.</p>
<p>The data and information that is a byproduct of your business is valuable.</p>
<p>…if you make a good piece of content, it increasingly doesn’t matter if you publish it on The New York Times website or your company’s blog</p>
<p>Why do people share [content in general]? Mostly to confirm their existing biases</p>
<ol>
<li>Bring new information to the world</li>
<li>Be interesting</li>
<li>Be right</li>
</ol>
<p>In the vain of being right: “keep the scope of your argument narrow”</p>
<h3 id="on-editing">On Editing</h3>
<p>The introduction is by far the most important part of the article. Without a great one, no one will read your article. The second most important part of the article is the conclusion.</p>
<p>…conclusion not only repackages the essay so the reader can remember what it was about, but it primes the reader on what he should share</p>
<p>When editing our work, sometimes we just read the introduction, the conclusion, and every topic sentence. The essay should stand alone on these segments.</p>
<p>Focus on the introduction, conclusion, and topic sentences [in that order]</p>
<p>sharing is a form of self-expression, and titles are the most visible part of the article when it’s shared. Your title should make people feel good about sharing it. When someone shares your article, the title should express the feeling they want to share</p>
<p>Our goal with a title is twofold: it should honestly convey what the article is about, and it should emphasis the point that we think the reader will share</p>
<h3 id="on-writing-tooling">On writing tooling</h3>
<p>We do most of our writing in Google Docs and only paste it into the CMS at the very end.</p>
<h3 id="on-writing-hacks">On Writing Hacks:</h3>
<p>When you first start, don’t write every day. Spend 40 hours on your first post, and then make it succeed. Do whatever it takes to find the story that’s in the data to make it genuinely interesting. <span style="text-decoration:underline;">The returns on writing something great are enormous; the returns on writing something average are zero. </span></p>
<p>Some “hacks” or tricks for coming up with and implementing good ideas…there are three nodes of information we like to focus on: data, industries, and people.</p>
<h4 id="on-data-content">On “data” content:</h4>
<p><em>A Ranked order list - Come up with an interesting metric and rank the results in a list</em></p>
<p>People share them because lists include information that’s important to them (where they live, their school, their favorite music)</p>
<p>Do not abuse the power of the list by writing about things that have nothing to do with your company, product, or industry</p>
<p><em>How much does something cost?</em></p>
<p>Data that proves someone’s strongly held intuition, or that disproves a weakly held one</p>
<p>People love to have their own biases confirmed by data</p>
<p><em>A surprising trend</em></p>
<p>Unless something is accelerating or decelerating so fast that it is shocking, writing about a trend is hard to pull off</p>
<p><em>The relationship between two things</em></p>
<p>Do you ever wonder why so many charts are confined to 2x2 matrices? That’s because people love thinking about the relationship between two items. These kind of charts also take a little bit of thinking to understand, so it’s satisfying when you figure out what the data actually means.</p>
<h4 id="on-industry-content">On “industry” content</h4>
<p>You possess a unique understanding of your industry and are in a good position to competently research a topic that other people are curious about.</p>
<h4 id="on-people-content">On “people” content</h4>
<p>The Hero’s Journey: The hero is just a regular person. One day, an incident causes the hero to start a journey. There is a huge problem the hero tries to solve. It looks like the hero is going to solve it, but he fails. After failing time after time, the hero perseveres and triumphs.</p>
<p>This pattern is a framework to tell the story of every single entrepreneur, inventor, or everyday person. Each of us is on our little Hero’s Journey.</p>
<p>You should go to every single one of your customers and ask if you can profile how they were founded. They will all be flattered; you’ll have incredible content for your site; and you can showcase that you have actual customers</p>
<h3 id="in-summation">In summation</h3>
<p>Write about great information in a way that is shareable, and make your content so great that everyone has to read it, including your target market.</p>
<h2 id="how-to-write-stuff-that-gets-on-the-front-page-of-hacker-news"><a href="https://blog.alinelerner.com/how-to-write-stuff-that-gets-on-the-front-page-of-hacker-news/">How to write stuff that gets on the front page of Hacker News</a></h2>
<p><em>Two strategies:</em></p>
<p>…tap into a controversial point that your audience already holds and then back it up with data that you have to confirm their suspicions.</p>
<p>share something uniquely helpful with your audience that makes them better at some meaningful aspect of their lives.</p>
<p>the [2nd,] “controversial with data” technique is way more effective than being “helpful”.</p>
<p>Data provides you with the credibility that nothing else can</p>
<p>If you can’t be controversial, then be helpful….“helpful” means giving specific, actionable advice about things that have a big impact on [your readers’] lives (love, work, sex, health)</p>
<h3 id="on-writing-hacks-1">On Writing Hacks</h3>
<p>Drink wine… it stills the inexorable pull of self-editing and silences the voices that tell you you’re a piece of shit who can’t write worth a damn</p>
<p>Do it again and again, until the ritual itself is what gives you comfort and lets you produce 😉</p>
How I Got My Jobs2021-03-03T00:00:00+00:00https://maxmautner.com/2021/03/03/how-i-got-my-jobs<p>This isn’t meant to be a comprehensive diary of my job-seeking. My personal career journey is not generalizable to everyone’s situation, and I’m limiting my sharing to job offers I ultimately received and accepted.</p>
<h2 id="first-job-post-college">First job post-college</h2>
<p>My first job after college I joined a financial trading firm in Chicago, landing my interview (& ultimately the job offer) from the college career center at Harvey Mudd College.</p>
<p>While I’m grateful for the opportunity I had in that first job to learn about finance and the business world it ultimately was horrible for my mental health & I felt relief quitting that job for a several month period of unemployment.</p>
<h2 id="second-job">Second job</h2>
<p>As I was unemployed, I considered going back to school for a graduate degree in computer science (to reorient me to a career in software engineering).</p>
<p>After talking with a friend from college who encouraged me to come join the startup he worked at, I re-evaluated the economics of graduate school. Grad school was over $100,000 in opportunity cost (paying for tuition & housing while losing out on salary).</p>
<p>Why would I pay to learn software engineering when I could get paid to do it?</p>
<p>Despite being cold-shouldered after an initial “phone screen” I made an effort to reduce the friction it might take to interview me by telling the in-house recruiter that I would be passing through town if they wanted to meet:</p>
<p><img src="/public/images/cogo.jpg" alt="alt_text" title="image_tooltip" /></p>
<p>A few hours later I was somewhat surprised to receive a reply:</p>
<p><img src="/public/images/cogo2.jpg" alt="alt_text" title="image_tooltip" /></p>
<p>We set up a time to do an on-site interview, and I ultimately got the job (after some awful negotiation on my part).</p>
<h2 id="third-job">Third Job</h2>
<p>The 3rd job was a segway from the 2nd–a transfer from one company to its sister company.</p>
<p>The way that went down was very, very weird and I won’t delve into the details because it’s not generalizable/a great learning experience.</p>
<p>What I will say is that non-compete agreements are really fucked up and I am glad to live in California where these contracts are not upheld in court.</p>
<h2 id="fourth-job">Fourth Job</h2>
<p>I was ready to move home from Massachusetts to California, and reached out to an in-house recruiter at a startup in Berkeley:</p>
<p><img src="/public/images/leadgenius.jpg" alt="alt_text" title="image_tooltip" /></p>
<p>I would probably write this email differently if I were writing it today, but hey, it worked! I received this reply 4 days later:</p>
<p><img src="/public/images/leadgenius2.jpg" alt="alt_text" title="image_tooltip" /></p>
<h2 id="fifth-job">Fifth Job</h2>
<p>I stayed at LeadGenius through them raising a Series B round of funding ($14M?), and wanted a change of pace. I’d literally driven by a company on my way to the gym & looked them up online & on AngelList where they had a job listing with an advertised salary range that was more than I currently earned.</p>
<p>So naturally I reached out by cold email + AngelList:</p>
<p><img src="/public/images/madefire.jpg" alt="alt_text" title="image_tooltip" /></p>
<p>Within 8 minutes I received this email reply:</p>
<p><img src="/public/images/madefire2.jpg" alt="alt_text" title="image_tooltip" /></p>
<p>Bada bing bada boom–some more interviewing later & I had moved on to my fifth job.</p>
<h2 id="sixth-job">Sixth Job</h2>
<p>I moved across the SF bay from Berkeley to San Mateo to move-in with my girlfriend and improve her commute.</p>
<p>This led me to job search for a shorter commute and a new work experience–I looked around at employers nearby and I realized a personal finance app I used was a 5-minute drive from home.</p>
<p>Naturally, I reached out to the head of engineering via cold email (I guessed his email address):</p>
<p><img src="/public/images/pc.jpg" alt="alt_text" title="image_tooltip" /></p>
<p>Within 3 minutes I received this reply:</p>
<p><img src="/public/images/pc2.jpg" alt="alt_text" title="image_tooltip" /></p>
<h2 id="seventh-job-current-role">Seventh Job (Current Role)</h2>
<p>That brings us to my 7th job, which is my current role.</p>
<p>I won’t dwell on it because I think it’s the least interesting one.</p>
<p>I will say that throughout, reaching out directly to a human being has been the key to my job searches.</p>
<p>After all human beings are the ones making the decision to hire you: exchanging their business’s financial capital for your human capital.</p>
<p>If you want any help or have questions about how to do this kind of a job search my inbox is open & I’ll try to help you: max.mautner@gmail.com</p>
How To Do Logging In Python2021-02-15T00:00:00+00:00https://maxmautner.com/2021/02/15/how-to-do-logging-in-python<p><img src="/public/images/logging-small.png" alt="Logging" /></p>
<ul id="markdown-toc">
<li><a href="#introduction" id="markdown-toc-introduction">Introduction</a></li>
<li><a href="#what-does-logging-give-us" id="markdown-toc-what-does-logging-give-us">What does logging give us?</a></li>
<li><a href="#how-to-log" id="markdown-toc-how-to-log">How to Log</a></li>
<li><a href="#where-to-log" id="markdown-toc-where-to-log">Where to Log</a> <ul>
<li><a href="#stdout-and-stderr" id="markdown-toc-stdout-and-stderr">stdout and stderr</a></li>
<li><a href="#files--sockets" id="markdown-toc-files--sockets">Files & Sockets</a></li>
</ul>
</li>
<li><a href="#configuration" id="markdown-toc-configuration">Configuration</a></li>
<li><a href="#the-right-way-to-log" id="markdown-toc-the-right-way-to-log">The Right Way to Log</a></li>
<li><a href="#about-the-author" id="markdown-toc-about-the-author">About the Author</a></li>
</ul>
<p>This is a plain and simple guide to logging in Python.</p>
<p>Read this guide to fully make sense of the Python logging landscape.</p>
<h2 id="introduction">Introduction</h2>
<p>Sooner or later, every Python application needs logging.</p>
<p>You probably first learned logging in Python by using the “print()” function:</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">print</span><span class="p">(</span><span class="s">'Hello world!'</span><span class="p">)</span>
</code></pre></div></div>
<p>It could be that you simply want to know the system’s state:</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">print</span><span class="p">(</span><span class="s">'Application successfully started on port 8000'</span><span class="p">)</span>
</code></pre></div></div>
<p>Or you need to record error messages when an exception occurs:</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">try</span><span class="p">:</span>
<span class="n">doSomethingErrorProne</span><span class="p">()</span>
<span class="k">except</span> <span class="nb">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="k">print</span><span class="p">(</span><span class="s">'Error: '</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">))</span>
</code></pre></div></div>
<p>But there is a better way! Python bundles a utility in the standard library called <em><a href="https://docs.python.org/3/library/logging.html">logging</a></em>:</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">logging</span>
<span class="n">logger</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">getLogger</span><span class="p">()</span>
<span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s">'Hello world!'</span><span class="p">)</span>
</code></pre></div></div>
<p>But why is this better? Why have 3 lines when one will suffice?</p>
<h2 id="what-does-logging-give-us">What does logging give us?</h2>
<p>Using the standard library’s logging module gives us several things:</p>
<ul>
<li><a href="https://docs.python.org/3/library/logging.html#logrecord-attributes">Message formatting (using LogRecord attributes)</a>
<ul>
<li>Timestamp</li>
<li>Process & thread ID</li>
<li>Server & service ID</li>
</ul>
</li>
<li><a href="https://docs.python.org/3/howto/logging.html#logging-levels">Log “levels” or severity</a>
<ul>
<li>Control of log severity (both in first party code & 3rd party code that uses logging)</li>
</ul>
</li>
<li>Guarantees around flushing stdout/stderr</li>
</ul>
<p>This last one is a little known fact–just because you <code class="highlighter-rouge">print()</code> something, it doesn’t mean your program will print it out (<a href="https://stackoverflow.com/questions/230751/how-to-flush-output-of-print-function">source</a>).</p>
<p>Using the <code class="highlighter-rouge">logging</code> API to emit your logs helps guarantee that your program logs every message you intend it to (<a href="https://stackoverflow.com/a/16634444">source</a>)!</p>
<h2 id="how-to-log">How to Log</h2>
<p>Beginning with a simple example, you can incorporate logging into your Python program by obtaining a logger object in your module’s global scope:</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">logging</span>
<span class="n">logger</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">getLogger</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">my_function</span><span class="p">():</span>
<span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="err">“</span><span class="n">Hello</span> <span class="n">world</span><span class="err">!”</span><span class="p">)</span>
</code></pre></div></div>
<p>When you obtain a <em>logger</em> object, you can optionally identify your logger object by name:</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">logger</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">getLogger</span><span class="p">(</span><span class="s">'mylogger'</span><span class="p">)</span> <span class="c"># a custom string (only letters, numbers and "." characters are allow)</span>
<span class="n">logger</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">getLogger</span><span class="p">(</span><span class="n">__name__</span><span class="p">)</span> <span class="c"># the name of the module in which this runs</span>
</code></pre></div></div>
<p>If you don’t provide a name to <code class="highlighter-rouge">.getLogger()</code> then you obtain the “root” logger of your program which has the only drawback that it can’t be granularly configured.</p>
<p>The documentation for Django covers this topic and <a href="https://docs.djangoproject.com/en/3.1/topics/logging/#using-logging">the merits of naming your loggers</a>.</p>
<h2 id="where-to-log">Where to Log</h2>
<h3 id="stdout-and-stderr">stdout and stderr</h3>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">logging</span>
<span class="kn">import</span> <span class="nn">sys</span>
<span class="n">logger</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">getLogger</span><span class="p">()</span>
<span class="n">handler</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">StreamHandler</span><span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">stdout</span><span class="p">)</span>
<span class="n">logger</span><span class="o">.</span><span class="n">addHandler</span><span class="p">(</span><span class="n">handler</span><span class="p">)</span>
<span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="s">'Hello'</span><span class="p">)</span>
</code></pre></div></div>
<p><a href="https://stackoverflow.com/a/14058475">Source</a></p>
<h3 id="files--sockets">Files & Sockets</h3>
<p>In the same way, you can create logging handlers similar to <code class="highlighter-rouge">logging.StreamHandler</code> that write your program’s log messages to <a href="https://docs.python.org/3/library/logging.handlers.html#filehandler">files</a> or <a href="https://docs.python.org/3/library/logging.handlers.html#sockethandler">sockets</a>.</p>
<p>In fact, given a single <em>logger,</em> we can add two handlers to one logger so that log messages are directed to two or more different destinations:</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">logger</span><span class="o">.</span><span class="n">addHandler</span><span class="p">(</span><span class="n">logging</span><span class="o">.</span><span class="n">StreamHandler</span><span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">stdout</span><span class="p">))</span>
<span class="n">logger</span><span class="o">.</span><span class="n">addHandler</span><span class="p">(</span><span class="n">logging</span><span class="o">.</span><span class="n">FileHandler</span><span class="p">(</span><span class="s">'myfile.out'</span><span class="p">))</span>
</code></pre></div></div>
<p>There are a number of <a href="https://docs.python.org/3/howto/logging.html#useful-handlers">other useful loggers covered here</a>.</p>
<p>Your choice of output destination depends on what type of application you’re developing.</p>
<p>For web services, my suggestion and what is suggested as a best practice by <a href="https://12factor.net/logs">12 Factor Apps</a> is to always log to stdout.</p>
<p>This makes development easier, and simplifies log management when deploying to production hosting environments.</p>
<h2 id="configuration">Configuration</h2>
<p>We’ve seen a few ways of customizing our logger behavior–here is some more information about how to do it in <a href="https://docs.python.org/3/howto/logging.html#configuring-logging">a declarative way</a>.</p>
<p>One way is to load configuration from a file, e.g. <code class="highlighter-rouge">logging.conf.fileConfig('yourlogging.conf')</code> (<a href="https://docs.python.org/3/library/logging.config.html#logging.config.fileConfig">source</a>).</p>
<p>Another is to read configuration from a <code class="highlighter-rouge">dict</code>, e.g. <code class="highlighter-rouge">logging.conf.dictConfig(configDict)</code> (<a href="https://docs.python.org/3/library/logging.config.html#logging.config.dictConfig">source</a>).</p>
<p>I am not going to cover these options in detail, just follow the source links to read more if you are so inclined.</p>
<h2 id="the-right-way-to-log">The Right Way to Log</h2>
<p>Given the various ways of configuring and invoking logging, how should you integrate logging with your Python program?</p>
<p>Here are a few principles to follow:</p>
<ul>
<li>Make logs usable, i.e. publish your software’s logs to a dedicated service for viewing and searching them. This could be a self-hosted <a href="https://www.elastic.co/kibana">Kibana</a> dashboard, <a href="https://aws.amazon.com/cloudwatch/">Amazon CloudWatch</a>, <a href="https://cloud.google.com/logging">Google Cloud Logging</a>.</li>
<li>Be careful of what you log! Logs are a common security vulnerability–where private data (customer emails, passwords, payment info) and private credentials could leak. Government regulations like GDPR and CCPA may make your business obliged to purge log data that references a given user of your software–depending on how you are archiving your logs, this type of data purging may be very labor-intensive.</li>
<li>Use logs as part of your monitoring pipeline–treat your logs as data to be analyzed & monitored: how many requests is my service receiving? Per second, per minute, per day? What percentage are failures?</li>
</ul>
<p>For more info about data analytics pipelines, see my friend Ben Weber’s free ebook: <a href="https://bgweber.github.io/">Data Science for Startups</a></p>
<h2 id="about-the-author">About the Author</h2>
<p><a href="/">Max Mautner</a> is a Senior Software Engineer at Netflix, where he builds high-scale services for messaging with customers.</p>
Notes on remote work2021-02-08T00:00:00+00:00https://maxmautner.com/2021/02/08/remote-work<p>I was recently surveyed by my workplace on my perception of working remotely since the state of California implemented a stay-at-home order and our office began working full-time from home.</p>
<p>I thought deeply about my responses to the survey, and wanted to shared them publicly:</p>
<p><strong>Please list a few positive things about working remotely.</strong></p>
<ul>
<li>Commuting time is freed up to be more physically healthy, e.g. exercising instead of sitting in a carseat. In my case that is 2 hours a day (1 hour each way) so I’ve taken up running and have lost 20 pounds of bodyweight.</li>
<li>Employees have adopted more permanent and public forms of communication in order to document decision-making (e.g. more Google Docs which is great)–this has huge benefits for the scalability of employees and the business, I hope it only increases</li>
</ul>
<p><strong>Please list a few challenges you encounter working remotely.</strong></p>
<ul>
<li>Number 1: it is trickier to put psychological boundaries around my working hours. There is no clear physical context switch before or after working hours–the side effect of this is that I’m left more fatigued by work concerns than when working in the office, which is a drag on my productivity and mental health.</li>
<li>Higher likelihood of miscommunication due to text & video-conferencing being less reliable media than in-person.</li>
<li>Harder to communicate and signal emotional state</li>
<li>I sense that people are more likely to avoid tough conversations, for fear of miscommunicating</li>
<li>I believe that I’ve met fewer coworkers & developed shallower relationships with them than I would have in person</li>
</ul>
<p><strong>What do you currently miss most about working in the office?</strong></p>
<ul>
<li>Face time with my manager or other leaders</li>
<li>Collaborating face-to-face with my coworkers</li>
<li>Meeting new people</li>
</ul>
<p><strong>Briefly explain how and why your productivity has been affected.</strong></p>
<p>I witness fewer & less context-rich instances of what the business values in working remote.</p>
<p>Knowing what the business, management, and customers’ value is harder to discern remotely.</p>
<p><strong>Are there any tools that you feel are missing at <employer>? Please be specific and list their names.</strong></p>
<p>Assistance with home internet connectivity–if I don’t have internet-connectivity I cannot do my job.</p>
<p>If you want people working from home, help them (and pay for) setting up a reliable home internet.</p>
<p><img src="/public/images/wfh.png" alt="The WFH bus" /></p>
Gift Giving2021-02-04T00:00:00+00:00https://maxmautner.com/2021/02/04/gift-giving<p>A series of interesting <a href="https://twitter.com/search?q=gift%20(from%3Adegenrolf)&src=typed_query">journal article abstracts</a> from Rolf Degen on the behavioral economics of gift-giving:</p>
<ul>
<li><a href="https://twitter.com/DegenRolf/status/1286929770488487936">Just saying “have a nice day” to a stranger helped people have a nicer day themselves.</a></li>
<li><a href="https://twitter.com/DegenRolf/status/806044913854976000">Gift-givers are often too much focussed on the moment of the gift handover to achieve the optimal impact.</a></li>
<li><a href="https://twitter.com/DegenRolf/status/1182983839737696256">More sloppily wrapped gifts can make for happier recipients.</a></li>
<li><a href="https://twitter.com/DegenRolf/status/905791043370668033">Gift-givers fail to anticipate that receivers would appreciate even partial gifts wholeheartedly.</a></li>
<li><a href="https://twitter.com/DegenRolf/status/1047377377788133376">Small gifts do markedly lubricate business relationships.</a></li>
<li><a href="https://twitter.com/DegenRolf/status/892627281809723392">Compliments and individual expressions of appreciation achieve greater net reciprocal benefits than monetary gifts.</a></li>
<li><a href="https://twitter.com/DegenRolf/status/727879514970296322">Small gifts do actually serve as “oil” to lubricate business negotiations</a></li>
<li><a href="https://twitter.com/DegenRolf/status/892627281809723392">Compliments and individual expressions of appreciation achieve greater net reciprocal benefits than monetary gifts.</a></li>
<li><a href="https://twitter.com/DegenRolf/status/1009327050203844608">People often fail to give gifts that achieve endurable satisfaction because they are so zealous to induce an enthusiastic instant smile. </a></li>
<li><a href="https://twitter.com/DegenRolf/status/808322778231349248">Experiential gifts bolstered relationships more strongly than material ones.</a></li>
<li><a href="https://twitter.com/DegenRolf/status/1067493954252353536">Motivated gifts, which are given away with the hope of getting support in return, backfire, making recipients less likely to provide help.</a></li>
</ul>
<p><a href="https://twitter.com/DegenRolf/">@DegenRolf</a>
<i class="fab fa-twitter-square"></i></p>
It's all Legacy Code2021-01-22T00:00:00+00:00https://maxmautner.com/2021/01/22/its-all-legacy-code<p>The truth is that 99% of a professional software engineer’s job is refactoring other people’s code (AKA “Legacy Code”).</p>
<p>Given this fact, an engineer seeking success should study methodologies for working with legacy code.</p>
<p>There are a few methodologies (or tools) that the community has developed that ought to be reviewed:</p>
<h2 id="1-test-driven-development-or-tdd">1. <a href="https://twitter.com/maxmautner/status/1201932564799246336">Test-driven development, or TDD</a></h2>
<p><img src="/public/images/tdd.jpeg" alt="TDD" /></p>
<h2 id="2-types-of-automated-tests">2. <a href="https://twitter.com/maxmautner/status/1201933590478503936">Types of automated tests</a></h2>
<p><img src="/public/images/tests.jpeg" alt="Types of automated software tests" /></p>
<h2 id="3-mocking-behaviors-where-your-software-interacts-with-the-outside-world">3. <a href="https://twitter.com/maxmautner/status/1201944702959775744">Mocking behaviors where your software interacts with the “outside” world</a></h2>
<p>These include:</p>
<ul>
<li>third party APIs</li>
<li>network I/O</li>
<li>hardware I/O (meatspace)</li>
</ul>
<p><img src="/public/images/mocks.jpeg" alt="Mocks, stubs, spies" /></p>
<p>These methodologies are inherited from physical engineering (mechanical/civil/aeronautical/etc.), and have a track record longer than any of us reading this have been alive.</p>
<p>A software engineer that is deeply-versed in these methodology will be successful in their role as an operator.</p>
Power2021-01-17T00:00:00+00:00https://maxmautner.com/2021/01/17/power<p>Power comes from tenure</p>
<p>Power comes from experience</p>
<p>Power comes from knowledge</p>
<p>Power comes from repetition</p>
<p>Power comes from violence</p>
<p>Power comes from perceived ability to be violent</p>
<p>Power comes from saying “no”</p>
<p>Power comes from financial independence</p>
<p>Power comes from having a <em>community</em></p>
<p>Power comes from debts</p>
<p>Debts come from lending/generosity</p>
<p><img src="/public/images/power.png" alt="Power" /></p>
Daniil Dubov2021-01-14T00:00:00+00:00https://maxmautner.com/2021/01/14/daniil-dubov<p>Daniil Dubov is a notable Russian chess player.</p>
<p>From <a href="https://chess24.com/en/read/news/daniil-dubov-on-carlsen-kasparov-much-more">a recent 2020 interview</a>, he shared this money quote:</p>
<blockquote>
<p>In general, I think that the competition is not so great in chess.</p>
</blockquote>
<blockquote>
<p><strong>If, to put it crudely, you ask me how many people in the world: a) work at least 4-6 hours a day long-term, b) take care of their physical fitness, c) have a strong-willed character, a desire to fight and win, then I’ll surprise you. There are maybe 5-6 people like that in the world – who manage to combine it all.</strong></p>
</blockquote>
<blockquote>
<p>And among those, he’s the best.</p>
</blockquote>
<p>The interview is a good read in full, take the time to read it.</p>
Technical Writing, the Google course2020-12-25T00:00:00+00:00https://maxmautner.com/2020/12/25/technical-writing-google<!-- Copy and paste the converted output. -->
<!-----
NEW: Check the "Suppress top comment" option to remove this info from the output.
Conversion time: 0.401 seconds.
Using this Markdown file:
1. Paste this output into your source file.
2. See the notes and action items below regarding this conversion run.
3. Check the rendered output (headings, lists, code blocks, tables) for proper
formatting and use a linkchecker before you publish this page.
Conversion notes:
* Docs to Markdown version 1.0β29
* Sat Dec 26 2020 01:16:37 GMT-0800 (PST)
* Source doc: Technical Writing, the Google course
----->
<p>Google has a public <a href="https://developers.google.com/tech-writing">Technical Writing course</a>.</p>
<p>I encountered it after meeting & <a href="https://theaccidentalengineer.com/accidental-technical-writing-ed-bacher-google/">interviewing</a> the inimitable Ed Bacher, who served as a Staff <a href="https://developers.google.com/tech-writing/becoming">Technical Writer</a> at Google for 7 years.</p>
<p>I condensed the 2-part technical writing course contents into notes below:</p>
<h2 id="technical-writing-one"><a href="https://developers.google.com/tech-writing/one">Technical Writing One</a></h2>
<ul>
<li>Understand <a href="https://developers.google.com/tech-writing/one/just-enough-grammar">the parts of English speech</a></li>
<li>Define terms, or preferably link to an existing definition</li>
<li>Acronyms are ok, guiding principles about using them:
<ul>
<li>Don’t define acronyms that would only be used a few times.</li>
<li>Do define acronyms that meet both of the following criteria:
<ul>
<li>The acronym is significantly shorter than the full term.</li>
<li>The acronym appears many times in the document.</li>
</ul>
</li>
</ul>
</li>
<li>Use pronouns carefully, they’re not required and can confuse readers</li>
<li>Avoid passive voice, use active voice–this requires training to unlearn</li>
<li>Use <span style="text-decoration:underline;">active</span> verbs, avoid “be/is/are/am/was/etc.”, “occurs”, “happens” (<a href="https://developers.google.com/tech-writing/one/clear-sentences">source</a>)
<ul>
<li>A sentence’s verb defines its strength</li>
</ul>
</li>
<li>Sentences contain a single thought, not multiple (<a href="https://developers.google.com/tech-writing/one/short-sentences">source</a>)
<ul>
<li>Can you remove words? Do it</li>
<li>“That” and “which” <a href="https://developers.google.com/tech-writing/one/short-sentences#distinguish_that_from_which">are different special</a>, avoid them</li>
</ul>
</li>
<li>Lists and tables are great
<ul>
<li>Only include alike items in lists</li>
<li>Introduce tables with a preceding sentence</li>
</ul>
</li>
<li>Paragraphs
<ul>
<li>One thought per sentence, one topic per paragraph
<ul>
<li>Answer what, why, and how</li>
</ul>
</li>
<li>Opening sentences are critical…
<ul>
<li>so focus your energy on them</li>
<li>establish the paragraph’s point</li>
<li>rhetorical questions also work</li>
</ul>
</li>
</ul>
</li>
<li>Define your audience
<ul>
<li>“After reading the documentation, the audience will know how to do the following tasks”</li>
<li>Match vocabulary to audience</li>
<li><strong><a href="https://developers.google.com/tech-writing/one/audience#fit_documentation_to_your_audience">Curse of knowledge</a></strong></li>
<li>Keep your writing culturally neutral</li>
</ul>
</li>
<li><a href="https://developers.google.com/tech-writing/one/markdown">Markdown</a> is useful</li>
</ul>
<h2 id="technical-writing-two"><a href="https://developers.google.com/tech-writing/two">Technical Writing Two</a></h2>
<ul>
<li>Self-editing (<a href="https://developers.google.com/tech-writing/two/editing">source</a>)
<ul>
<li>Consider establishing a <a href="https://developers.google.com/tech-writing/two/editing#adopt_a_style_guide">style guide</a></li>
<li>Know your audience, and <a href="https://developers.google.com/tech-writing/two/editing#think_like_your_audience">think like your audience</a></li>
<li><a href="https://developers.google.com/tech-writing/two/editing#read_it_out_loud">Read it out loud</a></li>
<li><a href="https://developers.google.com/tech-writing/two/editing#come_back_to_it_later">Come back to it later</a></li>
<li><a href="https://developers.google.com/tech-writing/two/editing#change_the_context">Re-approach your writing in a different medium</a></li>
<li><a href="https://developers.google.com/tech-writing/two/editing#find_a_peer_editor">Find a peer editor</a></li>
</ul>
</li>
<li>Organizing large docs
<ul>
<li>E.g. tutorials or conceptual guides</li>
<li>Create an outline
<ul>
<li>A clear outline allows 3rd party contributors</li>
<li>Provide navigation, table-of-contents</li>
</ul>
</li>
</ul>
</li>
<li>Illustrating with images
<ul>
<li>Write caption first, then create/acquire illustration</li>
<li>Avoid illustrations that are too complex</li>
<li>Focus the reader by circling/arrowing the point of interest</li>
<li>Revise illustrations the same as text (“<a href="https://developers.google.com/tech-writing/two/illustrations#illustrating_is_re-illustrating">re-illustrating</a>”)</li>
</ul>
</li>
<li>Creating sample code
<ul>
<li>A lot of self-evident advice</li>
</ul>
</li>
</ul>
<h2 id="takeaways">Takeaways</h2>
<p>These are invaluable lessons, and also apply for other forms of text-based communication (email, instant-messaging).</p>
Tech Interview Gauntlet2020-10-19T00:00:00+00:00https://maxmautner.com/2020/10/19/tech-interview-gauntlet<p>I recently reflected on a property shared in common by 2 of the most famous contemporary Americans:</p>
<ul>
<li>Donald Trump</li>
<li>Joe Rogan</li>
</ul>
<p>They have both hosted reality TV shows (The Apprentice & Fear Factor respectively).</p>
<p>So I thought, with vague ambitions of fame of my own, what reality show could I host?</p>
<p>This is the premise I dreamt up for such a reality show:</p>
<h2 id="specs">Specs</h2>
<ul>
<li>
<p>contestants battle for a job at a marquee tech employer</p>
</li>
<li>
<p>sponsored by {LeetCode,Interviewing.io,InterviewCake}</p>
</li>
<li>
<p>and/or sponsored by the software engineering employer</p>
</li>
</ul>
<h2 id="episode-format">Episode Format</h2>
<ul>
<li>Intro the host
<ul>
<li>Social proof of some kind?</li>
</ul>
</li>
<li>Explain the format
<ul>
<li>“You will be tasked with implementing a piece of software”</li>
<li>“You will be measured by the number of tests that start out failing but by implementing the software you make them pass”</li>
<li>“The person with the most passing tests at the end wins!”</li>
</ul>
</li>
<li>Intro the contestants
<ul>
<li>For contestant in contestants:
<ul>
<li>Typing at keyboard</li>
<li>Crossed arms</li>
<li>Bottom third title text/motion graphics</li>
<li>“What attracted you to software engineering?”</li>
</ul>
</li>
</ul>
</li>
<li>Let’s get started! But before we do, let’s introduce our judges(?)/color commentators
<ul>
<li>for commentator in commentators:
<ul>
<li>“Sally is Engineering Manager at AirBnB where she leads the iOS team”</li>
<li>“Ben is Distinguished Engineer at Google, working on search engines”</li>
<li>“Harrison is Engineering Manager at Lyft, developing the ride-share algorithm”</li>
</ul>
</li>
</ul>
</li>
<li>Here is today’s prize:
<ul>
<li>1x $150,000 salary job at Company X</li>
<li>[Or 1x $20,000 cash money?]</li>
</ul>
</li>
<li>Today’s challenge, brought to you by {LeetCode, Interviewing.io, InterviewCake}
<ul>
<li>Your task will be to proceed through each of the coding problems and get the test passing</li>
<li><a href="https://code.golf/">Code Golf?</a> [<a href="https://github.com/code-golf/code-golf">Github</a>]</li>
</ul>
</li>
<li>Round 1 (elimination)
<ul>
<li>Review the results</li>
</ul>
</li>
<li>Round 2 (1 on 1)</li>
<li>Announce the winner
<ul>
<li>Cut from winner celebrating with judges/color commentators</li>
</ul>
</li>
<li>“Thanks for joining us on Tech Interview Gauntlet–see you next time!”</li>
</ul>
<h2 id="execution">Execution</h2>
<p>Still figuring that out in the midst of a global pandemic!</p>
<hr />
<p>This article was composed in Google Docs, converted to markdown using <a href="https://gsuite.google.com/marketplace/app/docs_to_markdown/700168918607">Docs to Markdown</a> for publication via <a href="https://jekyllrb.com/">Jekyll</a>.</p>
Coercive regulations2020-09-09T00:00:00+00:00https://maxmautner.com/2020/09/09/regulatory-complexity<p>A pessimist might say that government regulations are difficult to obey <em>by design</em>.</p>
<p>Samples of regulations:</p>
<ul>
<li>tax policy (the US federal tax corpus is <a href="https://taxfoundation.org/how-many-words-are-tax-code/">over a million words</a>)</li>
<li>home construction permitting</li>
<li>carrying firearms</li>
</ul>
<p>If you violate a government’s regulation then you and your property are at risk of being coercively <a href="https://en.wiktionary.org/wiki/bring_to_heel">brought to heel</a>.</p>
<p>The reality is a little more complex, as governments compete for market-share.</p>
<p>Evil governments create brain drain, liberal governments are brain magnets.</p>
USB Footpad Review2020-07-21T00:00:00+00:00https://maxmautner.com/2020/07/21/usb-footpad<p>Thoughts on this <a href="https://www.amazon.com/Kinesis-Savant-Elite2-Programmable-FP30AJ/dp/B00QZC4NYQ#customerReviews">Kinesis Savant Elite2</a> USB footpad.</p>
<p>I learned of it from reading about stenography & how people can type over 200 words-per-minute (that is very fast–give it a try with <a href="https://play.typeracer.com/">TypeRacer</a>).</p>
<p>I have a friend who became a court stenographer after a career as a performance cellist.</p>
<p>She attributes her excellent stenography abilities to her piano-playing (using a footpedal)</p>
<h2 id="who-its-marketed-to">Who it’s marketed to:</h2>
<ul>
<li>medical practitioners who need clean hands (think dentists)</li>
<li>auto mechanics w/ dirty hands</li>
<li>gamers who want to toggle their voice chat on/off (Discord)</li>
<li>phone operators (think call centers)</li>
<li>bank tellers triggering the silent alarm</li>
</ul>
<h2 id="my-experiences">My experiences</h2>
<p>It requires serious brain re-training to effectively incorporate the footpedal into your human-computer interactions</p>
<p>It can’t be used for modifier keys in combination with your “main” keyboard (e.g. shift, control, etc.) due to Mac limitations.</p>
<p>Retraining myself to use my foot for spacebar is a big task–maybe it could work for backspace?</p>
<p>It’s difficult to configure what the footpedals do–I think it could be handy for opening specific apps (e.g. Chrome, Slack, IntelliJ), but those are uncommon actions (taken 10s of times a day)</p>
A Conversation with Ben Jacobson2020-04-27T00:00:00+00:00https://maxmautner.com/2020/04/27/conversation-with-ben-jacobson<p>A conversation with Ben Jacobson on why stories are important:</p>
<audio controls="">
<source src="/public/audio/ben-jacobson.mp3" type="audio/mpeg" />
Your browser does not support the audio element.
</audio>
<p>Show notes:</p>
<ul>
<li><a href="https://www.netflix.com/watch/80987903">Midnight Gospel on Netflix</a> (<a href="https://www.youtube.com/watch?v=0kQWAqjFJS0">Trailer</a>)</li>
<li><a href="https://www.youtube.com/watch?v=apnNtpo81_g">Georgian National Ballet (YouTube)</a></li>
<li><a href="https://en.wikipedia.org/wiki/Contra_dance">Contra Dance (Wikipedia)</a></li>
<li><a href="https://en.wikipedia.org/wiki/Children_of_Men">Children of Men (Wikipedia)</a></li>
<li><a href="https://www.economist.com/books-and-arts/2019/06/22/chinas-grand-gloomy-sci-fi-is-going-global">“China’s grand, gloomy sci-fi is going global” - The Economist</a></li>
<li><a href="https://en.wikipedia.org/wiki/Chinese_science_fiction">Chinese science fiction</a></li>
<li>“The best minds of my generation are thinking about how to make people click ads. That sucks.” - Jeff Hammerbacher</li>
<li><a href="https://en.wikipedia.org/wiki/Anthropic_principle">Anthropic principle (Wikipedia)</a></li>
<li><a href="https://en.wikipedia.org/wiki/Earthrise">Earthrise (Wikipedia)</a></li>
<li><a href="https://en.wikipedia.org/wiki/Panama_Papers">Panama Papers (Wikipedia)</a></li>
<li><a href="https://twitter.com/bjacobso">@bjacbso (Ben Jacobson on Twitter)</a></li>
</ul>
<p><img src="/public/images/ben-max.png" alt="Ben Jacobson and Max Mautner" /></p>
Live-Streaming Site in 30 Mins2020-04-05T00:00:00+00:00https://maxmautner.com/2020/04/05/livestreaming<h2 id="in-3-small-steps">In 3 Small Steps</h2>
<p>This guide came about when I tried creating a video live-streaming site.</p>
<p>I had started with a harder task: running the live-streaming service on the public internet, both for public viewers and potential streamers.</p>
<p>I’d started with <a href="https://benwilber.github.io/nginx/rtmp/live/video/streaming/2018/03/25/building-a-live-video-streaming-website-part-1-start-streaming.html">following this guide</a>, but encountered difficulty configuring everything about the networking behind a VPC + loadbalancer.</p>
<p>Instead, I found a much shorter route to my proof-of-concept: running everything locally on my Macbook.</p>
<h3 id="prerequisites">Prerequisites</h3>
<p>If not installed already, install:</p>
<ul>
<li><a href="https://docs.docker.com/install/">Docker</a>, the open-source container runtime (~1-5 mins), and</li>
<li><a href="https://obsproject.com/">OBS</a>, the open-source livestream publishing software (~1-5 mins)</li>
</ul>
<h3 id="1-receive-stream-via-rtmp-2mins">1. Receive Stream via RTMP (~2mins)</h3>
<p>We can use a pre-existing Docker image, <a href="https://github.com/tiangolo/nginx-rtmp-docker">tiangolo/nginx-rtmp</a>.</p>
<p>The image contains our prerequisites: nginx + the <a href="https://github.com/arut/nginx-rtmp-module">nginx-rtmp-module plugin</a>.</p>
<p>In your local terminal, run:</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ docker run -d -p 1935:1935 --name nginx-rtmp tiangolo/nginx-rtmp
</code></pre></div></div>
<p>And to verify that the Docker container is running (in the background):</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ docker ps
</code></pre></div></div>
<p>You should see output like this:</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
031c98b488b8 tiangolo/nginx-rtmp "nginx -g 'daemon of…" 30 minutes ago Up 3 seconds 0.0.0.0:1935->1935/tcp nginx-rtmp
</code></pre></div></div>
<p>We now have a server that will now act as a proxy between our video stream:</p>
<ol>
<li>producer (camera hardware) and</li>
<li>consumers (web player, mobile app, or otherwise).</li>
</ol>
<p>Next steps…</p>
<h3 id="2-broadcast-stream-via-rtmp-to-server-1min">2. Broadcast Stream via RTMP to Server (~1min)</h3>
<p>In OBS, navigate to “Settings” -> “Stream”, and select “Custom” from the dropdown.</p>
<p>Enter <code class="highlighter-rouge">rtmp://127.0.0.1/live</code> in the hostname.</p>
<p>Enter <code class="highlighter-rouge">test</code> as the streaming key. Note: this key can be modified to support multiple streams.</p>
<p>Click “Ok”, and “Start streaming”.</p>
<h3 id="3-consume-stream-2-5mins">3. Consume Stream (~2-5mins)</h3>
<p>Lastly, create an <code class="highlighter-rouge">index.html</code> file in a scratch directory on your filesystem, copy-pasting this content:</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt"><html></span>
<span class="nt"><head></span>
<span class="nt"><link</span> <span class="na">href=</span><span class="s">"https://vjs.zencdn.net/7.7.5/video-js.css"</span> <span class="na">rel=</span><span class="s">"stylesheet"</span> <span class="nt">/></span>
<span class="nt"><script </span><span class="na">src=</span><span class="s">"https://vjs.zencdn.net/7.7.5/video.js"</span><span class="nt">></span><span class="o">&</span><span class="nt"></script></span>
<span class="nt"><script </span><span class="na">src=</span><span class="s">"https://cdn.jsdelivr.net/npm/videojs-flash@2/dist/videojs-flash.min.js"</span><span class="nt">></span><span class="o">&</span><span class="nt"></script></span>
<span class="nt"></head></span>
<span class="nt"><body></span>
<span class="nt"><video</span> <span class="na">id=</span><span class="s">"my-video"</span>
<span class="na">class=</span><span class="s">"video-js vjs-default-skin vjs-big-play-centered"</span>
<span class="na">controls</span>
<span class="na">autoplay</span>
<span class="na">preload=</span><span class="s">"auto"</span>
<span class="na">data-setup=</span><span class="s">'{"techorder" : ["flash","html5] }'</span><span class="nt">></span>
<span class="nt"><source</span> <span class="na">src=</span><span class="s">"rtmp://127.0.0.1:1935/live/test"</span> <span class="na">type=</span><span class="s">"rtmp/mp4"</span><span class="nt">/></span>
<span class="nt"></video></span>
<span class="nt"><script></span>
<span class="kd">var</span> <span class="nx">player</span> <span class="o">=</span> <span class="nx">videojs</span><span class="p">(</span><span class="s1">'my-video'</span><span class="p">);</span>
<span class="nt"></script></span>
<span class="nt"></body></span>
<span class="nt"></html></span>
</code></pre></div></div>
<p>If you need help serving the file up to be viewed in your browser, run the following in your terminal in the same directory as your <code class="highlighter-rouge">index.html</code>:</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ python -m http.server
</code></pre></div></div>
<p>Or if you have Python 2:</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ python -m SimpleHttpServer
</code></pre></div></div>
<p>You can then open the page in your browser at <a href="http://localhost:8000/">http://localhost:8000/</a> to see your livestream.</p>
<p>You will need to enable Flash for this page in order for the video player to play (TODO: add details of how to do this in Chrome/Safari/Firefox).</p>
<h3 id="results">Results</h3>
<p><img src="/public/images/livestream.png" alt="The end resulting livestream in Chrome" title="image_tooltip" /></p>
<h3 id="future-goals">Future Goals</h3>
<ol>
<li>Publish stream to a public domain name, e.g <code class="highlighter-rouge">live.maxmautner.com</code></li>
<li>Host the video-player at a public domain name</li>
<li>Remove need for Flash video player (encode from RTMP to HLS)</li>
<li>Implement player in:
<ol>
<li>Android app</li>
<li>iOS app</li>
<li>TV app?</li>
</ol>
</li>
<li>Load test & identify CDN/scaling costs and options</li>
</ol>
<h3 id="resources">Resources</h3>
<ul>
<li><a href="https://github.com/tiangolo/nginx-rtmp-docker">tiangolo/nginx-rtmp-docker: Docker image with Nginx using the nginx-rtmp-module module for live multimedia (video) streaming.</a></li>
<li><a href="https://github.com/videojs/videojs-flash">videojs/videojs-flash: The Flash tech for video.js</a></li>
<li><a href="https://stackoverflow.com/a/43431322/468653">How to play rtmp live stream using videojs?</a></li>
<li><a href="https://github.com/alfg/docker-nginx-rtmp">Docker image that supports RTMPS/HLS</a></li>
</ul>
Pay remote workers a premium2020-04-01T01:00:00+00:00https://maxmautner.com/2020/04/01/remote-work<p>Several arguments for why remote employees should be paid more than their in-office counterparts:</p>
<blockquote class="twitter-tweet" data-conversation="none"><p lang="en" dir="ltr">1. The same perks of being in the office are not there<br>2. You work harder and longer<br>3. Work/life merge<br>4. Cost to company per remote person is significantly lower</p>— Ankit Kumar (@ankit17k) <a href="https://twitter.com/ankit17k/status/1245218350952615936?ref_src=twsrc%5Etfw">April 1, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
<hr />
<h2 id="1-the-same-perks-of-being-in-the-office-are-not-there">1. The same perks of being in the office are not there</h2>
<p>There’s no snacks, no cleaners, no free internet.</p>
<p>No catered lunches (a pre-tax benefit), no furniture, no building maintenance.</p>
<h2 id="2-you-work-harder-and-longer">2. You work harder and longer</h2>
<p>There’s no time spent commuting, you are reached out to on Slack/receive that email.</p>
<p>With a commute, you go offline. You can take a break and your mind can wander.</p>
<p>More hours a day should mean more compensation.</p>
<h2 id="3-worklife-merge">3. Work/life merge</h2>
<p>With a salary, there is no common standard for when you are expected to respond to inquiries.</p>
<h2 id="4-cost-to-company-per-remote-person-is-significantly-lower">4. Cost to company per remote person is significantly lower</h2>
<p>Those savings can and should be passed on to remote employees, as those expenses are shifted directly onto them.</p>
Interrotron2020-04-01T00:00:00+00:00https://maxmautner.com/2020/04/01/interrotron<p>I’ve recently begun fascinated with the topic of gaze correction:</p>
<blockquote>
<p><a href="http://www.cs.technion.ac.il/~gotsman/AmendedPubl/Claudia/gazecorrection.pdf">Effective communication using current video conferencing systems is severely hindered by the lack of eye contact caused by the disparity between the locations of the subject and the camera. While this problem has been partially solved for high-end expensive video conferencing systems, it has not been convincingly solved for consumer-level setups.</a></p>
</blockquote>
<p><img src="/public/images/gaze-correction.jpg" alt="Gaze correction" /></p>
<p>Here’s a compilation of links I’ve assembled (bookmarked) for future reading on the topic:</p>
<ul>
<li><a href="http://www.mr-nash.com/rants/my-own-teleprompter-for-under-40/">My own teleprompter for under $40</a></li>
<li><a href="https://slaterooffilms.com/blog/how-and-why-we-created-a-diy-interrotron">How and Why we created a DIY interrotron</a></li>
<li><a href="https://www.youtube.com/watch?v=lp4TbZqk8QM">YouTube: We Built An Interrotron</a></li>
<li><a href="http://www.eyeline.tv/interrotron/">Eyeline Teleprompting</a></li>
<li><a href="https://www.bhphotovideo.com/c/buy/Teleprompters/ci/2122/N/4028759394">BHPhoto: teleprompters ($100+)</a></li>
<li><a href="https://www.reddit.com/r/Filmmakers/comments/b317kz/diy_eyedirect_interrotron_instructions/">/r/Filmmakers: DIY EyeDirect / Interrotron instructions?</a></li>
<li><a href="https://eyedirect.tv/">EyeDirect Interrotron (~$1-2,000)</a></li>
<li><a href="https://www.youtube.com/watch?v=W1ZR83aeP3M">YouTube: How To: Setup the EyeDirect Mark II</a></li>
</ul>
30 Days to Backend Software Engineer2020-03-15T00:00:00+00:00https://maxmautner.com/2020/03/15/30-days-to-software-engineer<p>I’ve published this new guide to <a href="/30-days/to-backend-engineer/">becoming a backend software engineer in 30 days</a>!</p>
<p>There are two more courses I would also recommend:</p>
<ul>
<li><a href="https://missing.csail.mit.edu/">MIT’s “The Missing Semester of Your CS Education”</a></li>
<li><a href="https://training.linuxfoundation.org/training/essentials-of-linux-system-administration/">Essentials of Linux System Administration (LFS201)</a></li>
</ul>
<p><img src="/public/images/30-days2.jpeg" alt="30 Days to Backend Software Engineer" /></p>
18% of Github Projects Have CI2020-02-02T00:00:00+00:00https://maxmautner.com/2020/02/02/continuous-integration-adoption<h2 id="introduction">Introduction</h2>
<p>In this post, I’ll share my analysis of the adoption of <a href="https://en.wikipedia.org/wiki/Continuous_integration">continuous integration</a> (CI) in public Github repositories, based on usage of the following CI vendors:</p>
<ul>
<li><a href="https://travis-ci.org/">TravisCI</a></li>
<li><a href="https://circleci.com/">CircleCI</a></li>
<li><a href="https://jenkins.io/">Jenkins</a></li>
<li><a href="https://github.com/features/actions">Github Actions</a></li>
<li><a href="https://azure.microsoft.com/en-us/services/devops/pipelines/">Azure Pipelines</a></li>
<li><a href="https://www.jetbrains.com/teamcity/">TeamCity</a></li>
<li><a href="https://github.com/marketplace/google-cloud-build">Google Cloud Build</a></li>
</ul>
<p>I’m the first to admit that this is not a comprehensive list of CI vendors.</p>
<p>It’s also obvious that using a CI vendor for executing your builds is not a requirement for having CI.</p>
<p>That being said, we can dig into public data provided by Github to get a lower-bound estimate.</p>
<h2 id="methodology">Methodology</h2>
<p>Github has provided a public dataset of code that can be queried via Google’s <a href="https://en.wikipedia.org/wiki/BigQuery">BigQuery</a> database service.</p>
<p>I followed Google’s “<a href="https://codelabs.developers.google.com/codelabs/bigquery-github/index.html?index=..%2F..index#0">Codelab</a>” for querying this dataset using SQL, running a <a href="https://console.cloud.google.com/bigquery?sq=222308836220:7da844e424f44942abb08d859f75565c">basic query to identify repositories in their test dataset</a>.</p>
<p>In order to identify whether a repository uses a given CI vendor we must assemble a list of rules for identifying repositories that are configured for specific CI vendors.</p>
<p>For example, in modern versions of Jenkins it’s encouraged to include a <code class="highlighter-rouge">Jenkinsfile</code> in the project root of your repository.</p>
<p>If this file is present then Jenkins will process its contents as a manifest for how to build your software.</p>
<p>This type of file-based configuration is not exclusive to Jenkins, and it allows us to count repositories that are using file-based manifests for configuring CI.</p>
<p>Here is a list of rules for detecting if a repository is configured for CI with the given vendor:</p>
<table>
<tr>
<td><strong>CI Vendor</strong>
</td>
<td><strong>File pattern</strong>
</td>
</tr>
<tr>
<td><a href="https://travis-ci.org/">TravisCI</a>
</td>
<td><a href="https://config.travis-ci.com/">.travis.yml</a>
</td>
</tr>
<tr>
<td><a href="https://circleci.com/">CircleCI</a>
</td>
<td><a href="https://circleci.com/docs/2.0/configuration-reference/">.circleci/config.yml</a>
</td>
</tr>
<tr>
<td><a href="https://jenkins.io/">Jenkins</a>
</td>
<td><a href="https://jenkins.io/doc/book/pipeline/jenkinsfile/">Jenkinsfile</a>
</td>
</tr>
<tr>
<td><a href="https://github.com/features/actions">Github Actions</a>
</td>
<td><a href="https://help.github.com/en/actions/automating-your-workflow-with-github-actions/configuring-a-workflow#creating-a-workflow-file">.github/workflows</a>
</td>
</tr>
<tr>
<td><a href="https://azure.microsoft.com/en-us/services/devops/pipelines/">Azure Pipelines</a>
</td>
<td><a href="https://docs.microsoft.com/en-us/azure/devops/pipelines/get-started/pipelines-get-started?view=azure-devops&tabs=yaml">azure-pipelines.yml</a>
</td>
</tr>
<tr>
<td><a href="https://www.jetbrains.com/teamcity/">TeamCity</a>
</td>
<td><a href="https://confluence.jetbrains.com/display/TCD9/Storing+Project+Settings+in+Version+Control">.teamcity/</a>
</td>
</tr>
<tr>
<td><a href="https://github.com/marketplace/google-cloud-build">Google Cloud Build</a>
</td>
<td><a href="https://cloud.google.com/cloud-build/docs/configuring-builds/create-basic-configuration">cloudbuild.yaml</a>
</td>
</tr>
</table>
<p>Here is the SQL query I used to get a count of repositories that had each of these files:</p>
<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">SELECT</span>
<span class="k">CASE</span>
<span class="k">WHEN</span> <span class="n">path</span> <span class="o">=</span> <span class="s1">'.travis.yml'</span> <span class="k">THEN</span> <span class="s1">'TravisCI'</span>
<span class="k">WHEN</span> <span class="n">path</span> <span class="o">=</span> <span class="s1">'.circleci/config.yml'</span> <span class="k">OR</span> <span class="n">path</span> <span class="o">=</span> <span class="s1">'circle.yml'</span> <span class="k">THEN</span> <span class="s1">'CircleCI'</span>
<span class="k">WHEN</span> <span class="n">path</span> <span class="o">=</span> <span class="s1">'Jenkinsfile'</span> <span class="k">THEN</span> <span class="s1">'Jenkins'</span>
<span class="k">WHEN</span> <span class="n">path</span> <span class="k">LIKE</span> <span class="s1">'.github/workflows%'</span> <span class="k">THEN</span> <span class="s1">'Github Actions'</span>
<span class="k">WHEN</span> <span class="n">path</span> <span class="o">=</span> <span class="s1">'azure-pipelines.yml'</span> <span class="k">THEN</span> <span class="s1">'Azure Pipelines'</span>
<span class="k">WHEN</span> <span class="n">path</span> <span class="k">LIKE</span> <span class="s1">'.teamcity/%'</span> <span class="k">THEN</span> <span class="s1">'TeamCity'</span>
<span class="k">WHEN</span> <span class="n">path</span> <span class="o">=</span> <span class="s1">'cloudbuild.yaml'</span> <span class="k">THEN</span> <span class="s1">'Google Cloud Build'</span>
<span class="k">END</span><span class="p">,</span>
<span class="k">COUNT</span><span class="p">(</span><span class="k">distinct</span> <span class="n">repo_name</span><span class="p">)</span> <span class="k">AS</span> <span class="n">num_duplicates</span>
<span class="k">FROM</span> <span class="nv">`bigquery-public-data.github_repos.files`</span>
<span class="k">GROUP</span> <span class="k">BY</span> <span class="mi">1</span>
<span class="k">ORDER</span> <span class="k">BY</span> <span class="mi">2</span> <span class="k">DESC</span>
</code></pre></div></div>
<p><a href="https://console.cloud.google.com/bigquery?sq=222308836220:10d559dc757740c7a01d3be3d04742bc">BigQuery link</a></p>
<h2 id="results">Results</h2>
<table>
<tr>
<td>CI Vendor
</td>
<td>Number of Repos
</td>
<td>Percentage of Repos
</td>
</tr>
<tr>
<td>Total
</td>
<td><p style="text-align: right">
3345134</p>
</td>
<td><p style="text-align: right">
1</p>
</td>
</tr>
<tr>
<td>TravisCI
</td>
<td><p style="text-align: right">
565369</p>
</td>
<td><p style="text-align: right">
16.90%</p>
</td>
</tr>
<tr>
<td>CircleCI
</td>
<td><p style="text-align: right">
28608</p>
</td>
<td><p style="text-align: right">
0.86%</p>
</td>
</tr>
<tr>
<td>Github Actions
</td>
<td><p style="text-align: right">
5532</p>
</td>
<td><p style="text-align: right">
0.17%</p>
</td>
</tr>
<tr>
<td>Jenkins
</td>
<td><p style="text-align: right">
5389</p>
</td>
<td><p style="text-align: right">
0.16%</p>
</td>
</tr>
<tr>
<td>Azure Pipelines
</td>
<td><p style="text-align: right">
1829</p>
</td>
<td><p style="text-align: right">
0.05%</p>
</td>
</tr>
<tr>
<td>Google Cloud Build
</td>
<td><p style="text-align: right">
253</p>
</td>
<td><p style="text-align: right">
0.01%</p>
</td>
</tr>
<tr>
<td>TeamCity
</td>
<td><p style="text-align: right">
72</p>
</td>
<td><p style="text-align: right">
0.00%</p>
</td>
</tr>
</table>
<p>That’s a grand total of 18.1% of repositories in this dataset having been setup with any CI vendor at all.</p>
<p>The market seems to be dominated by TravisCI, having a <code class="highlighter-rouge">.travis.yml</code> file present in 16.9% of repos.</p>
<p>Here are some <a href="https://docs.google.com/spreadsheets/d/1aGISJ0WQ0Qice9w2z-dK0quM3OWHnMkvb0ip5S0THQg/edit?usp=sharing">data visualizations</a> to help illustrate the results:</p>
<p><img src="/public/images/ci-chart1.png" alt="alt_text" title="image_tooltip" /></p>
<p><img src="/public/images/ci-chart2.png" alt="alt_text" title="image_tooltip" /></p>
<h2 id="discussion">Discussion</h2>
<p>With only 18% adoption, that leaves 82% of these public repositories not using popular CI vendors.</p>
<p>This is a huge opportunity to make CI a default and easier to adopt.</p>
<p>Areas of future research:</p>
<ul>
<li>relationship between CI adoption and popularity of repository</li>
<li>analysis of a repository’s dependencies & their use of CI</li>
<li>analysis of CI adoption by programming language</li>
<li>when in the repository’s timeline was CI introduced (at the beginning? later?)</li>
</ul>
<p>One area I am most curious about is automatically profiling a software’s CI runtimes and factors that introduce flakiness to the build.</p>
<p>These two characteristics of software reflect:</p>
<ol>
<li>the mental health of software engineers working on it</li>
<li>the ability to make changes quickly and confidently to it</li>
</ol>
<p>Please do email me with comments/suggestions, etc. at max.mautner@gmail.com</p>
<h2 id="links">Links</h2>
<ul>
<li><a href="https://www.google.com/search?hl=en&sxsrf=ACYBGNRP9TDa3fhwxYDMrgJ2cXZIbEJW9g%3A1580792809899&ei=6fs4XsevNoXI-gTlsqDwCA&q=github+bigquery+files&oq=github+bigquery+files&gs_l=psy-ab.3...40756.41453..41751...0.2..0.96.468.6......0....1..gws-wiz.......0i71j0j0i22i30j0i22i10i30j33i299j33i160.9ZJMXSLEms8&ved=0ahUKEwiHyJaPkLfnAhUFpJ4KHWUZCI4Q4dUDCAs&uact=5">Github bigquery</a></li>
<li><a href="https://www.gharchive.org/">https://www.gharchive.org/</a></li>
<li><a href="https://stackoverflow.com/questions/50565798/bigquery-github-dataset-returns-wrong-results">BigQuery github dataset returns wrong results</a></li>
<li><a href="https://codelabs.developers.google.com/codelabs/bigquery-github/index.html?index=..%2F..index#0">Query GitHub data using BigQuery</a></li>
<li><a href="https://cloud.google.com/bigquery/docs/reference/standard-sql/conditional_expressions">Conditional Expressions in Standard SQL</a></li>
</ul>
<!-- Docs to Markdown version 1.0β17 -->
Google Docs to Markdown2020-02-01T00:01:00+00:00https://maxmautner.com/2020/02/01/google-docs-script<h2 id="introduction">Introduction</h2>
<p>I recently sat next to a Google employee on a flight from SFO to Austin, TX.</p>
<p>He works on reporting tools that lean heavily on the <a href="https://developers.google.com/apps-script/">Google Apps Script</a> suite of tools.</p>
<p>Google Apps Script now supports virtually all Google Drive doc types (Docs, Sheets, etc.) as well as other Google product offerings (Gmail, Calendar, Hangouts, Maps, etc.).</p>
<p>The tool has come a <strong><span style="text-decoration:underline;">long</span></strong> way since it was first announced in 2009, over 10 years ago.</p>
<h2 id="content-authoring">Content Authoring</h2>
<p>In my work at Netflix, Google Docs is popular for authoring <a href="https://blog.usejournal.com/the-memo-culture-41a2debefe2d">memos</a>.</p>
<p>Memos are collaboratively-authored documents which specify product initiatives and collect team feedback via Google Docs’ commenting features.</p>
<p>Using the tool at work has reminded me of all the positives of the real-time collaborative use-case:</p>
<ul>
<li>Commenting</li>
<li>Task assignment</li>
<li>Tracking changes</li>
<li>Shallow learning curve</li>
</ul>
<p>These positive features led me to seek out ways to incorporate Google Docs into my publishing process for this blog (built with <a href="https://jekyllrb.com/">Jekyll</a>).</p>
<p>Thankfully, there are pre-existing tools that use Google Apps Script to convert a Google Doc into <a href="https://www.markdowntutorial.com/">Markdown</a> text which can be easily incorporated into any website generated from markdown (like Jekyll, <a href="https://gohugo.io/">Hugo</a>, <a href="https://www.gatsbyjs.org/">GatsbyJS</a>):</p>
<ul>
<li><a href="https://github.com/evbacher/gd2md-html">Gd2md-html</a> (closed-source)</li>
<li><a href="https://github.com/mangini/gdocs2md">Gdocs2md</a> (open-source)</li>
</ul>
<p>I discovered these tools from links via this thorough how-to on <a href="https://trypigeon.co/blog/how-to-interview">outsourcing your content production via interviews</a>.</p>
<p><a href="https://drive.google.com/file/d/1oe9F6OsLWGxs9wkhe-90sospk2YJ-yxV/view?usp=sharing">Here is a short (14-second) illustration of how the 1st tool works</a>. After clicking those 2 buttons, I copy-paste the outputted markdown text to a new post in my Jekyll repository.</p>
<p>Smooth and easy, baby! 👏😎</p>
<h2 id="conclusion">Conclusion</h2>
<p>I look forward to using Google Docs in my editing process going forward; for my personal blog (here) and for:</p>
<ul>
<li><a href="https://theaccidentalengineer.com/">the Accidental Engineer</a></li>
<li><a href="https://www.thatoneweirdtrick.com/">That One Weird Trick</a></li>
</ul>
<p>I’m going to make time to re-evaluate Google Apps Script for a number of use cases going forward.</p>
<h2 id="additional-resources">Additional Resources</h2>
<ul>
<li><a href="https://github.com/google/clasp">google/clasp</a>: a command-line tool for scaffolding Google Apps scripts</li>
<li><a href="https://github.com/contributorpw/google-apps-script-awesome-list">Google-apps-script-awesome-list</a>: a big, awesome list of more GAS resources</li>
<li><a href="https://github.com/gwax/GwTest">GwTest</a>: a unit-testing framework for your apps scripts</li>
</ul>
<!-- Docs to Markdown version 1.0β17 -->
McCarthy vs. Roosevelt2020-02-01T00:00:00+00:00https://maxmautner.com/2020/02/01/cormac-mccarthy<p><img src="/public/images/teddy.jpg" alt="Teddy Roosevelt" title="image_tooltip" /></p>
<p><a href="https://en.wikipedia.org/wiki/Theodore_Roosevelt">Teddy Roosevelt</a> once said:</p>
<blockquote>
<p>It is not the critic who counts; not the man who points out how the strong man stumbles, or where the doer of deeds could have done them better. <span style="text-decoration:underline;">The credit belongs to the man who is actually in the arena, whose face is marred by dust and sweat and blood</span>; who strives valiantly; who errs, who comes short again and again, because there is no effort without error and shortcoming; but who does actually strive to do the deeds; who knows great enthusiasms, the great devotions; who spends himself in a worthy cause; who at the best knows in the end the triumph of high achievement, and who at the worst, if he fails, at least fails while daring greatly, so that his place shall never be with those cold and timid souls who neither know victory nor defeat. (<a href="https://www.goodreads.com/quotes/7-it-is-not-the-critic-who-counts-not-the-man">Source</a>)</p>
</blockquote>
<p>Besides achieving the 26th Presidency of the United States, Teddy served in the US Army in the Spanish-American War (albeit to what extent he put himself in fatal crosshairs is unclear).</p>
<p>In contrast, contemporary American author <a href="https://en.wikipedia.org/wiki/Cormac_McCarthy">Cormac McCarthy</a> wrote:</p>
<blockquote>
<p>As war becomes dishonored and its nobility called into question those honorable men who recognize the sanctity of blood will become excluded from the dance, which is the warrior’s right, and thereby will the dance become a false dance, and the dancers false dancers. And yet there will be one there always who is a true dancer and can you guess who that might be?…<span style="text-decoration:underline;">Only that man who has offered up himself entire to the blood of war, who has been to the floor of the pit and seen horror in the round and learned at last that it speaks to his inmost heart, only that man can dance.</span> (<a href="https://www.goodreads.com/quotes/7450665-as-war-becomes-dishonored-and-its-nobility-called-into-question">Source</a>)</p>
</blockquote>
<p>This passage is from McCarthy’s novel <a href="https://en.wikipedia.org/wiki/Blood_Meridian">Blood Meridian</a>.</p>
<p>McCarthy served in the Air Force, spending 2 of 4 years of his service in Alaska hosting a radio show.<sup id="fnref:1"><a href="#fn:1" class="footnote">1</a></sup></p>
<p>For whatever reason, I find myself more moved by his rendition of Teddy’s old quote.</p>
<p><img src="/public/images/cormac.jpg" alt="Cormac McCarthy" title="image_tooltip" /></p>
<div class="footnotes">
<ol>
<li id="fn:1">
<p><a href="https://www.cormacmccarthy.com/biography/">Biography: CormacMcCarthy.com</a> <a href="#fnref:1" class="reversefootnote">↩</a></p>
</li>
</ol>
</div>
Building a Home Gym2019-12-27T00:00:00+00:00https://maxmautner.com/2019/12/27/building-a-home-gym<p>I started lifting weights at ~23 years old after the internet pointed me to buying a copy of the book <a href="https://startingstrength.com/">Starting Strength</a>.</p>
<p><a href="/2018/07/23/graveyard-shift.html">My job was crazy</a> at the time and I discovered that exercise was an awesome stress-relief valve and <a href="/2019/03/30/why-weightlifting.html">I’ve been lifting ever since</a>.</p>
<p>Here is a brief history of the monthly gym dues I’ve paid over the years:</p>
<p><img src="/public/images/gym-price.png" alt="gym cost chart" /></p>
<ul>
<li>$35/mo - XSport gym chain in Chicago (2010-2012)</li>
<li>$80/mo - Zesiger center @ MIT (2012-2015)</li>
<li>$76/mo - Berkeley IronWorks (2015)</li>
<li>$180/mo - <a href="https://www.maxsgymoakland.com">Max’s Gym Oakland</a> (2015-2017) - coached in a group of ~8 at a time</li>
<li>$200/mo - Bulgarian Barbell Club (2017-2018) - coached in a group of ~6 at a time</li>
<li>$200/mo - Lift 6 for 6 (2018) - coached in a group of ~16 at a time</li>
</ul>
<p>At an average of $100/month x 12 months x 8 years, I spent <em>~$10,000</em> in total.</p>
<p>Knowing that, I estimated what the cost of building a home gym would be.</p>
<p>I came across the <a href="https://www.reddit.com/r/homegym">/r/Homegym subreddit</a> in estimating thise costs–besides having great advice it has a bunch of photos people share of their home gyms to provide inspiration.</p>
<p>There are risks to consider before proceeding with how to build a home gym:</p>
<ol>
<li>you may get injured</li>
<li>you may lose interest in lifting weights</li>
<li>you may move residence</li>
</ol>
<p>It’s reassuring to know that there is an active secondary market for gym equipment. You can sell off all of your equipment in the case of any of these situations.</p>
<p>Think of buying a gym membership as insurance against these 3 risks.</p>
<h2 id="resources">Resources</h2>
<h3 id="rhomegym">/r/HomeGym</h3>
<p>It’s a great resource, <a href="https://www.reddit.com/r/homegym/wiki/faq">they have got a great Wiki</a>.</p>
<p>I already knew what I wanted to buy, but jt gave me a sense for pricing and quality of equipment brands.</p>
<h3 id="craigslist">Craigslist</h3>
<p>My first purchases were off of Craigslist, where I found a single listing that included:</p>
<ul>
<li>1x squat rack,</li>
<li>1x barbell,</li>
<li>metal plates (2x35lbs, 2x25lbs, 2x10lbs)</li>
</ul>
<p>All-in it cost $120. Next step was picking up more plates.</p>
<p>I found a second Craigslist listing where a <a href="https://www.yelp.com/biz/planet-granite-belmont-2">local gym</a> was liquidating their steel plates as they were replacing
them all with bumper plates. I think they charged a flat $1/lb:</p>
<ul>
<li>8x45lb plates = $360</li>
</ul>
<p><strong>Total cumulative cost: $480</strong></p>
<p>With this setup, I could squat, bench and deadlift up to 535lbs (something I have never done yet in any single lift).</p>
<h3 id="facebook-marketplace">Facebook Marketplace</h3>
<p>I’ve bought/sold a few items here, none of which were gym equipment.</p>
<p>I would recommend checking it out, however you will likely get sidetracked browsing products unrelated to your home gym!</p>
<h3 id="farm-supply-store">Farm Supply Store</h3>
<p>If you don’t want to destroy your plates or your garage floor you will need special flooring.</p>
<p>Based on recommendations in /r/HomeGym, I visited my local <a href="https://www.tractorsupply.com/tsc/product/4-ft-x-6-ft-x-3-4-in-thick-rubber-stall-mat">Tractor Supply Co to buy these</a>:</p>
<p><img alt="Horse stall mats" src="/public/images/horse-mats.png" width="100%" /></p>
<p>I bought 4 for $180 total, stacking 2 on top of each other to cover an 8’x6’ area of my garage.</p>
<p>The store helpfully rolled them up for me and fit all 4 into the rear of our Prius with the back seats folded down.</p>
<p>When we first bought them they smelled awful of an odd plastic smell, but within a week or two the scent had gone away.</p>
<p><strong>Total cumulative cost: $660</strong></p>
<h3 id="play-it-again-sports">Play-it Again Sports</h3>
<p><a href="https://www.yelp.com/biz/play-it-again-sports-soquel">In Soquel, California</a>, my girlfriend and I were walking around the neighborhood and saw a used sports supply company.</p>
<p><img alt="Play It Again sports" src="/public/images/play-it-again.jpg" width="100%" /></p>
<p>Their basement had a large selection of new and used barbell plates, priced reasonably at $0.60/lb so I picked up:</p>
<ul>
<li>2x5 lb plates</li>
<li>2x2.5 lb plates</li>
</ul>
<p><strong>Total cumulative cost: $670</strong></p>
<h3 id="amazoncom">Amazon.com</h3>
<p>I made the foolish mistake of buying a pair of cheap 5lb plates off of Amazon.</p>
<p>I discovered after they arrived that they weighed significatnly different than advertised (or relative to each other).</p>
<p>I didn’t return them (which I now regret). Don’t make my mistake–do not put up with being sold garbage!</p>
<p><strong>Total cumulative cost: $720</strong></p>
<h3 id="rogue">Rogue</h3>
<p>As I got interested in olympic weightlifting I went ahead and bought bumper plates directly from <a href="https://www.roguefitness.com/">RogueFitness.com</a>:</p>
<ul>
<li>1x men’s barbell</li>
<li>2x 25kg bumpers</li>
<li>2x 20kg bumpers</li>
<li>2x 15kg bumpers</li>
<li>2x 10kg bumpers</li>
<li>2x 5kg bumpers</li>
<li>2x 2.5kg fractional plates</li>
<li>2x 2kg fractional plates</li>
<li>2x 1kg fractional plates</li>
<li>2x 0.5kg fractional plates</li>
</ul>
<p>They shipped them direct to our house, but it took a while and one 20kg plate was missing from the first shipment so I had to call Rogue support to send another one (for free).</p>
<p>Here’s a screenshot of the two orders I placed with Rogue through their website:</p>
<p><img alt="Rogue barbell and plate kit" src="/public/images/rogue-order1.png" width="100%" /></p>
<p><img alt="Rogue fractional plates" src="/public/images/rogue-order2.png" width="100%" /></p>
<p><strong>Total cost of Rogue equipment: ~$1.1k</strong></p>
<h3 id="addendum">Addendum</h3>
<p>If I could go back in time, I would buy precision-milled cast iron plates for the reason that they are:</p>
<ul>
<li>brand-spanking new (longer life-time)</li>
<li>not that much more then what I bought used</li>
<li>more likely to be the 45-pound plate is actually 45 pounds…</li>
</ul>
<p>Note this link has a ton of affiliate links, but it is what ultimately persuaded me of what I <em>should</em> have bought:</p>
<p><a href="https://www.garage-gyms.com/steel-powerlifting-weight-plates-discs-guide-review/#simple-cast-iron-weight-plates">https://www.garage-gyms.com/steel-powerlifting-weight-plates-discs-guide-review/#simple-cast-iron-weight-plates</a></p>
A Newbie's Guide to Digital Art2019-12-07T00:00:00+00:00https://maxmautner.com/2019/12/07/newbie-guide-to-digital-art<h2 id="introduction">Introduction</h2>
<p>Circa 2017, I discussed with my girlfriend the idea of one of us doing an MBA.</p>
<p><img src="/public/images/kiss.gif" alt="kissing" title="image_tooltip" /></p>
<p>We both were scared of the 💰250,000 price tag, and we agreed that the key benefit of an MBA is the social network you find in your classmates (as opposed to the education).</p>
<p>I suggested saving the $250k and <a href="https://theaccidentalengineer.com/">starting a podcast instead</a> to grow my social network by interviewing friends and strangers about what they were working on.</p>
<p>I would feature my guest, they’d lend me their <a href="https://en.wikipedia.org/wiki/Social_proof">social proof</a>, and voila! We’re creating interesting content just by having a conversation!</p>
<p>Around this point in time I worked at <a href="https://www.madefire.com/">Madefire</a>, a digital comic books startup. I <em>love</em> the aesthetic of comics and I realized that I could use digital art to improve the reach of the podcast by making artwork to help promote each episode.</p>
<p>I picked my coworkers brains for insights on how an entry-level artist should create digital art. They happily shared advice and I’ve collected & shared it below for posterity!</p>
<p><img src="/public/images/amitai.png" alt="amitai accidental engineer" title="image_tooltip" /></p>
<p>The tools for creating digital art come in two forms: hardware and software.</p>
<h2 id="hardware">Hardware</h2>
<h3 id="wacom">Wacom</h3>
<p><img src="/public/images/wacom-tablet.jpg" alt="wacom tablet" /></p>
<p>For the longest time, <a href="https://www.wacom.com/en-es">Wacom</a> has been the dominant hardware manufacturer of digital drawing surfaces.</p>
<p>They are the digital drawing hardware for feature film & television <a href="https://en.wikipedia.org/wiki/Storyboard">storyboarding</a>, animation studios, marketing agencies, and video game art departments.</p>
<p>They are moderately expensive (>$2k), huge, clunky and often require 2 USB ports to operate.</p>
<p>The reason I did not purchase a Wacom drawing surface is that I discovered that it is not a standalone device. You cannot comfortably draw with it in your lap in the passenger seat of a car, and it has weak support for using two fingers to pinch for zoom-in/zoom-out.</p>
<p>Instead, they have analog dials and buttons for zooming in/out and for performing undo/redo of paintbrush actions.</p>
<p>I went so far as locating one for $1k on CraigsList and visiting the seller’s apartment to try it out.</p>
<p>The model they showed me takes up half the surface of a dinner table in space and easily weighed over 25lbs. I declined buying it (and carrying it to my car) and opted for a new iPad Pro + Apple Pencil instead, for ~$850.</p>
<h3 id="microsoft-surface">Microsoft Surface</h3>
<p><img src="/public/images/ms-surface.jpg" alt="Microsoft surface drawing" /></p>
<p>Microsoft has also entered the market for digital drawing hardware with their <a href="https://www.microsoft.com/en-us/p/surface-studio-2/8sbjxm0m58t4?activetab=pivot%3aoverviewtab">Surface Studio</a>.</p>
<p>It’s expensive: ~$3.5k circa 2019.</p>
<p>I had the opportunity to try it out in-person while at Madefire and was not impressed at some of the latency in using the stylus to draw in software like Adobe.</p>
<p>It is also a desktop computer and so it fails the “passenger seat drawing” test.</p>
<p>It seems like it might be appropriate for CAD users (computer-assisted design) like architects, but I wouldn’t recommend it for hobbyists.</p>
<h3 id="apple-ipad-pro">Apple iPad Pro</h3>
<p>My favorite and what I would recommend is the iPad + Apple Pencil.</p>
<p><img src="/public/images/flipaclip.jpg" alt="flipaclip" /></p>
<p>I’ll rattle off some of my favorite distinctive characteristics of this combo:</p>
<ul>
<li>The stylus (Apple Pencil) is awesomely reactive and fun to use,</li>
<li>The tablet is incredibly portable (< 1 pound),</li>
<li>You can AirDrop your files from the iPad to your MacBook/iMac to incorporate your digital artwork elsewhere</li>
<li>It has a really long battery life</li>
<li>It can be used for so many other things (e.g. email, chat, etc.) so collaborative communication has a lower barrier than with a Wacom/Microsoft device</li>
</ul>
<p>All around the iPad Pro is a delightful device which enables a <span style="text-decoration:underline;">fun</span> drawing experience.</p>
<p>There is an exciting future now that <a href="https://support.apple.com/en-afri/HT210380">MacOS Catalina supports using your iPad as a Sidecar</a>—this means you can use drawing software installed on your Mac while using your iPad as your drawing interface (with your Apple Pencil).</p>
<p>I’ve tried this out and it doesn’t work seamlessly (e.g. the pencil doesn’t behave as naturally as it does when just using the iPad), but it suggests a very exciting future where your tablet and desktop computers become Siamese twins.</p>
<p><img src="/public/images/ipad-pair.png" alt="ipad for drawing" title="image_tooltip" /></p>
<h2 id="software">Software</h2>
<h3 id="adobe">Adobe</h3>
<p><img src="/public/images/adobe.jpg" alt="adobe" /></p>
<p><a href="https://www.adobe.com/creativecloud.html">Adobe Creative Cloud</a> is the dominant software in digital art. It is a subscription-priced suite of tools, including:</p>
<ul>
<li><a href="https://www.adobe.com/products/sketch.html">Sketch</a> (drawing)</li>
<li>PhotoShop (photo manipulation)</li>
<li>Animate (animation)</li>
<li>Premiere (video editing)</li>
</ul>
<p>I personally don’t fancy their business model (subscription-based pricing), and have opted for Apple alternatives.</p>
<p>You can give their free trial a try, but I ended up exclusively using the following two iOS apps for the iPad Pro:</p>
<h3 id="procreate">ProCreate</h3>
<p><img src="/public/images/procreate.png" alt="procreate" /></p>
<p>ProCreate is a $5 iOS app that is the showcase app for drawing on the iPad Pro.</p>
<p>It has great features for working with layers, pinch to zoom, exporting to a variety of formats quickly (PNG/JPG, MP4, PSD).</p>
<p>I’d recommend <a href="https://www.youtube.com/results?search_query=procreate+tutorial">searching YouTube for tutorials</a> if you’d like to get a preview of the drawing experience with ProCreate.</p>
<h3 id="flipaclip">FlipaClip</h3>
<p>FlipaClip is a crude animation tool. Where ProCreate can create static images (like my podcast episode thumbnails), FlipaClip is a cheap iOS app that allows you to make animated GIFs or video files.</p>
<p>These short-form animations can be standalone or incorporated into longer-form videos.</p>
<p>It’s time intensive to make longer-form video, but I’ve had success with <a href="https://www.linkedin.com/posts/maxmautner_alyssa-whitwell-leslie-carr-of-clover-activity-6409632481141751808-z5_f">creating promotional videos for podcast episodes Iike this</a>.</p>
<h2 id="conclusion">Conclusion</h2>
<p>The world of digital art has never been more exciting—especially with the arrival of computer-generated artwork.</p>
<p>If you have questions or comments, feel free to add them to the document!</p>
<!-- Docs to Markdown version 1.0β17 -->
Netflix DVD automation vids2019-12-07T00:00:00+00:00https://maxmautner.com/2019/12/07/netflix-dvd-automation<p>I was reading about Netflix’s Qwikster disaster of 2011, and came across this apology video:</p>
<p><a href="https://www.youtube.com/watch?v=7tWK0tW1fig">Netflix CEO Reed Hastings Apologizes for Mishandling the Change to Qwikster</a></p>
<p>In it Netflix CEO Reed Hastings sits alongside the newly-annointed Qwikster CEO <a href="https://www.linkedin.com/in/andy-rendich-6285221/">Andy Rendich</a>
to apologize to customers for mis-telegraphing the planned split of DVD-mailing and online streaming subscription products.</p>
<p>I was curious–what happened to Andy Rendich after this episode in history?</p>
<p>Around this time, <a href="https://www.google.com/search?q=andy+rendich">Andy</a> and the Netflix DVD business enlisted
an engineering contractor for automating their physical DVD mailing operations:</p>
<ul>
<li><a href="https://www.youtube.com/watch?v=u8UtP6pxjuQ">Netflix Testimonial on Bronway Automation, by Andy Rendich</a></li>
<li><a href="https://www.youtube.com/watch?v=yU_tosw0xn4">Bronway ML-1000, DVD Mailer Insertion Automation</a></li>
<li><a href="https://www.youtube.com/watch?v=pzvFzyerPaw">Bronway Automated Rental Return Machine for Netflix</a></li>
<li><a href="https://www.youtube.com/watch?v=vgLg5TViLm0">Bronway SL2200 with Print & Apply for Netflix</a></li>
<li><a href="https://www.youtube.com/watch?v=40OOBYOc5BQ">From 2012: Jefferson Graham visits Netflix</a></li>
</ul>
<p>While Andy’s no longer with Netflix, these videos are a fascinating glimpse into a high-scale automated physical operation.</p>
<p>Here’s a kicker: <a href="https://www.nbc.com/saturday-night-live/video/netflix-apology/n13218">SNL’s comedy sketch, re-enacting the Qwikster apology</a></p>
My current curiosities2019-12-02T00:00:00+00:00https://maxmautner.com/2019/12/02/interests2<p>I’d rather save this list than forget it, and rather make it public than private:</p>
<h2 id="1-art">1. Art</h2>
<h3 id="public--private-funded-art">Public & private funded art</h3>
<p><strong>Why?</strong> Influencing what others think is critical to affecting the world in positive (or anti-negative) ways.</p>
<h3 id="pricing-modeling-supply--demand-marketing--auctions">Pricing, modeling supply + demand, marketing, & auctions</h3>
<p><strong>Why?</strong> All art is financed in some way–whether under a formal capitalist system or not. If you want art then it must be paid resourced.</p>
<h3 id="tactics-and-strategy-of-content-creation-collaborative-creation-eg-wikipedia">Tactics and strategy of content-creation, collaborative creation (e.g. Wikipedia)</h3>
<p><strong>Why?</strong> Because this is where the fun happens 😊</p>
<h3 id="situations-that-create-captive-audiences-ie-airplane-flights">Situations that create captive audiences (i.e. airplane flights)</h3>
<p><strong>Why?</strong> These are precious moments in the lives of humans–there is so much un-met demand for good art in these situations.</p>
<h2 id="2-economics">2. Economics</h2>
<h3 id="limits-of-capitalism-monopoly-monopsony-economies-of-scale">Limits of capitalism, monopoly, <a href="https://en.wikipedia.org/wiki/Monopsony">monopsony</a>, economies of scale</h3>
<p><strong>Why?</strong> The limits are where there is systemic risk–to subjugation/enslavement of humans or revolutionuray communism and the absolvement of property rights.</p>
<h3 id="risk-free-profit-arbitrage">Risk-free profit (arbitrage)</h3>
<p><strong>Why?</strong> These profits free humanity to pursue art, empathy, & explore the universe of experiences</p>
<h3 id="tax-law-optimization--enforcement">Tax law, optimization, & enforcement</h3>
<p><strong>Why?</strong> Wealth re-distribution is essential to supporting a sustainable, optimal civilization. Tax avoidance provides compounding rewards to unethical components of civilization.</p>
<h3 id="telecommuting-remote-work-1-2">Telecommuting, remote work <a href="http://www.overcomingbias.com/2014/06/trustworthy-telepresence.html">[1]</a>, <a href="https://www.overcomingbias.com/2012/05/work-face-signals.html">[2]</a></h3>
<p><strong>Why?</strong> <a href="/2021/02/08/remote-work.html">I discussed this post-COVID here</a></p>
<h3 id="games-of-imperfect-information-the-evolution-of-cooperation">Games of <a href="https://en.wikipedia.org/wiki/Information_asymmetry">imperfect information</a>, <a href="https://en.wikipedia.org/wiki/The_Evolution_of_Cooperation">the evolution of cooperation</a></h3>
<p><strong>Why?</strong> They illustrate the framework underlying social and biological behavior.</p>
<h2 id="3-social">3. Social</h2>
<h3 id="self-control-addiction">Self-control, addiction</h3>
<p><strong>Why?</strong> Studying these topics can better explain what behaviors (if any) are “free-will”</p>
<h3 id="teamgroup-activities">Team/group activities</h3>
<p><strong>Why?</strong> <a href="https://andrewwhitby.com/2020/12/25/if-you-want-to-go-fast/">“If you want to move fast, go alone. If you want to move far, go together”</a></p>
<h3 id="costly-signalling-ritual-behaviors"><a href="https://en.wikipedia.org/wiki/Signalling_theory">Costly-signalling</a>, ritual behaviors</h3>
<p><strong>Why?</strong> Understanding what purpose they serve, how to identify them.</p>
<h3 id="measuring-skill"><a href="/2019/12/01/the-case-interview-of-software-engineering.html">Measuring skill</a></h3>
<p><strong>Why?</strong> What role do they serve in hiring/vetting talent? How does this influence the labor pool/human behaviors?</p>
<h2 id="4-physiologybiology">4. Physiology/Biology</h2>
<h3 id="performance-enhancing-drugs-like-nootropics-steroids-peds">Performance-enhancing drugs, like <a href="https://en.wikipedia.org/wiki/Nootropic">nootropics</a>, <a href="https://en.wikipedia.org/wiki/Performance-enhancing_substance">steroids (PEDs)</a></h3>
<p><strong>Why?</strong> They exist, there are ethical reasons to use them.</p>
<h3 id="gender-hormonal-systems">Gender, hormonal systems</h3>
<p><strong>Why?</strong> These are fundamental building blocks for a high-trust society.</p>
<h3 id="strengthendurance-sports-weightlifting">Strength/endurance sports, <a href="/2019/03/30/why-weightlifting.html">weightlifting</a></h3>
<p><strong>Why?</strong> They are a lot of fun</p>
<h2 id="5-software">5. Software</h2>
<h3 id="methods-of-verifying-software-quality--risk-reduction-of-software-failure">Methods of <a href="https://theaccidentalengineer.com/categories/#testing">verifying software quality</a> & risk reduction (of software failure)</h3>
<p><strong>Why?</strong> Software is essential to all human activity–to protect human welfare software must work as expected within certain error allowance.</p>
<h3 id="technical-debt"><a href="https://theaccidentalengineer.com/trunk-based-development-paul-hammant/">Technical debt</a></h3>
<p><strong>Why?</strong> TBD</p>
<p><a href="https://www.twitter.com/maxmautner/">Drop me a line</a>, I’m always curious to chat about people knowledgeable or also interested in these topics.</p>
<p><img alt="Max Mautner" src="/public/images/me.png" width="100%" /></p>
The Case Interview (of Software Engineering)2019-12-01T00:00:00+00:00https://maxmautner.com/2019/12/01/the-case-interview-of-software-engineering<p>Software engineers have two jobs:</p>
<ul>
<li>their day job</li>
<li>their preparation for job interviews</li>
</ul>
<p>These two jobs do not overlap much.</p>
<p>Preparing for the job interview (separate of preparing for the job) is a valuable activity for software engineers, as it can directly improve your chances of getting the job in the first place.</p>
<p>Given that, I can share from personal experience that the “system design” interview has risen in popularity for software engineering jobs.</p>
<p>Much like consulting firms and <a href="https://en.wikipedia.org/wiki/Case_interview">case interviews</a>, system design interviews are evaluating:</p>
<ul>
<li>your communication abilities,</li>
<li>your information-seeking abilities,</li>
<li>your ability to discover constraints of a problem and find a solution that accounts for the constraints</li>
</ul>
<p>There are a ton of free and paid information resources out there online for helping you prepare for the system design interview.</p>
<p>Specifically, Facebook coaches job applicants (which I was at one time) on how to prepare for these interviews.</p>
<p>They even pay for an online course curriculum that you can study as a job applicant.</p>
<p>To the best of my ability, I followed <a href="https://www.educative.io/courses/grokking-the-system-design-interview/m2ygV4E81AR">the interview prep course that Facebook provided</a> and took notes below.</p>
<p>The course lays out a framework for presenting your solution to a system design job interview question:</p>
<ol>
<li>requirements clarification
<ul>
<li>what problem is this system trying to address?</li>
</ul>
</li>
<li>system interface design
<ul>
<li>define read/write API specifications (at a high level)</li>
</ul>
</li>
<li>back-of-the-envelope estimation
<ul>
<li>number of requests/second</li>
<li>quantity of data I/O (in flight, on disk)–media files (text, image, video)</li>
</ul>
</li>
<li>defining data model
<ul>
<li>resources</li>
<li>entity-relationship diagram between them</li>
<li>uniqueness constraints</li>
<li>encryption?</li>
<li>numerical integrity (integer vs. floating point data truncation) when dealing with $$$</li>
</ul>
</li>
<li>high-level design
<ul>
<li>draw a system diagram</li>
<li>sketch how requests flow through the system and the system’s components (e.g. load balancer, app-server, database)</li>
<li>draw element of the system proportionately to cost/”size” (e.g. traffic, # of instances)</li>
</ul>
</li>
<li>detailed design
<ul>
<li>is the system usage uniform? Or spikey?</li>
<li>pros/cons of sharding, what to shard by (time? tenant?)</li>
<li>optimize for reads or writes?</li>
<li>what to cache and how cache is managed/designed</li>
<li>how to monitor our system’s performance at different points</li>
</ul>
</li>
</ol>
<p>Now the real question: did this course improve my perceived performance to my interviewers vs. not having consumed this content?</p>
<p>It’s hard to say, but I think so.</p>
<p>Demonstrating familiarity with the system design format shows that:</p>
<ul>
<li>you are taking the process seriously</li>
<li>you are a competitive candidate for roles at other employers</li>
<li>you might be an effective interviewer of candidates yourself, after you are hired</li>
</ul>
<p>In conclusion, I would recommend preparating for the system design interview format in your softare engineering job search.</p>
OSI Layer Notes2019-09-23T00:00:00+00:00https://maxmautner.com/2019/09/23/osi-layers<p>I watched a series of YouTube videos on the OSI model to shore up my fluency on the details of computer networking and its different layers of abstraction.</p>
<p>Overview:</p>
<ul>
<li><a href="https://www.youtube.com/watch?v=3b_TAYtzuho">OSI and TCP IP Models - Best Explanation</a></li>
<li><a href="https://www.youtube.com/watch?v=HEEnLZV2wGI">The OSI Model Demystified</a></li>
</ul>
<ol>
<li>Physical layer
<ul>
<li>hardware</li>
<li>CAT-5 cable</li>
<li>“95% of networking problems”</li>
</ul>
</li>
<li>Data-link layer
<ul>
<li><a href="https://www.youtube.com/watch?v=vj3ut2uGCgs">https://www.youtube.com/watch?v=vj3ut2uGCgs</a></li>
<li><a href="https://www.youtube.com/watch?v=_gmnOBujm4Q">https://www.youtube.com/watch?v=_gmnOBujm4Q</a></li>
<li>MAC address = media access control
<ul>
<li>every hardware device that has a NIC (network interface card) has a MAC</li>
<li>48-bit address assigned to a NIC, hexadecimal characters (4-bits)</li>
<li>1st half (24-bits or 6 characters) vendor code</li>
<li>2nd half (24-bits or 6 characters) “unique value” for that particular card</li>
</ul>
</li>
<li>LLC = link layer controls
<ul>
<li>acknowledges receipt of messages</li>
<li>flow control (occurs at other OSI layers too)
<ul>
<li>limit amt of data from sender</li>
</ul>
</li>
<li>error control
<ul>
<li>allows receiver to notify sender when frame not received or checksum fails</li>
</ul>
</li>
<li>Synchronizing transmissions (agreeing about clock)
<ul>
<li>isochronous (shared clock), lowest overhead</li>
<li>async</li>
<li>synchronous</li>
</ul>
</li>
</ul>
</li>
<li>Switches, bridges, NICs, VLANs</li>
<li>Protocols
<ul>
<li>Ethernet</li>
<li>CDP (Cisco discovery protocol)</li>
<li><a href="https://en.wikipedia.org/wiki/Frame_Relay">Frame Relay</a>, superced by <a href="https://en.wikipedia.org/wiki/Multiprotocol_Label_Switching">MPLS</a></li>
<li>LLDP (link layer discovery protocol)</li>
<li><a href="https://networkengineering.stackexchange.com/questions/5064/on-which-layer-of-the-osi-model-does-the-arp-protocol-belong">ARP = address resolution protocol</a>, <a href="https://en.wikipedia.org/wiki/Address_Resolution_Protocol">Wikipedia</a>
<ul>
<li>IP to MAC address mapping</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>Network layer
<ul>
<li><a href="https://www.youtube.com/watch?v=_d2zkAFytPk">https://www.youtube.com/watch?v=_d2zkAFytPk</a></li>
<li><a href="https://www.youtube.com/watch?v=mp1l-x5AXi4">https://www.youtube.com/watch?v=mp1l-x5AXi4</a></li>
<li>forwarding traffic based on addresses</li>
<li>IP v4/v6 addresses, logical addresses</li>
<li>switching
<ul>
<li>packet switching (routing “packets”)</li>
<li>circuit switching (dedicated link btwn 2 parties, e.g. telephony)</li>
<li>message switching (distinct from packets, but may be retained like emails)</li>
</ul>
</li>
<li>route discovery and connection
<ul>
<li>routers maintain the <em>routing table</em></li>
<li>manual or dynamically configured based on routing protocol</li>
</ul>
</li>
<li>connection services
<ul>
<li>similar to layer 2, flow/error control, packet ordering</li>
</ul>
</li>
<li>bandwidth usage</li>
<li>multiplexing strategy</li>
<li>Protocols:
<ul>
<li>ICMP</li>
<li><a href="https://en.wikipedia.org/wiki/IPsec">IPsec</a></li>
<li>RIP: old, do not need to know</li>
<li>OSPF</li>
<li>EIGRP</li>
</ul>
</li>
</ul>
</li>
<li>Transport layer
<ul>
<li><a href="https://www.youtube.com/watch?v=DsQcX-7n6fY">https://www.youtube.com/watch?v=DsQcX-7n6fY</a></li>
<li><a href="https://www.youtube.com/watch?v=YeB9RuFElVg">https://www.youtube.com/watch?v=YeB9RuFElVg</a></li>
<li>how large a block of data to transfer
<ul>
<li>windowing
<ul>
<li>dynamical segment size based on # of repeat successes</li>
</ul>
</li>
<li>buffering</li>
</ul>
</li>
<li>buffering/flushing IO via socket</li>
<li>WAN accelerators</li>
<li>load balancers</li>
<li>firewalls (TCP/IP)</li>
<li>Protocols:
<ul>
<li>TCP: 3-step handshake (SYN, ACK, SYN/ACK), no dropped packets
<ul>
<li>usage: reliable</li>
</ul>
</li>
<li>UDP: no re-transmission of dropped packets, no guaranteed delivery order, no acknowldegments
<ul>
<li>usage: speed, audio/video streaming</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>Session layer
<ul>
<li><a href="https://www.youtube.com/watch?v=aPcku3orRmI">https://www.youtube.com/watch?v=aPcku3orRmI</a></li>
<li><a href="https://www.youtube.com/watch?v=OgXB2HJgXZY">https://www.youtube.com/watch?v=OgXB2HJgXZY</a></li>
<li>connection state btwn client/server</li>
<li>setup
<ul>
<li>verify user’s credentials</li>
<li>create a unique session ID</li>
<li>coordinate sequence of who sends first</li>
</ul>
</li>
<li>maintaining
<ul>
<li>data transfer</li>
<li>re-establish disconnected session</li>
<li>acknowledge receipt of data</li>
</ul>
</li>
<li>teardown
<ul>
<li>mutual agreement or disconnected</li>
</ul>
</li>
<li>Protocols:
<ul>
<li>H.323</li>
<li>NetBIOS</li>
</ul>
</li>
</ul>
</li>
<li>Presentation layer (OS)
<ul>
<li><a href="https://www.youtube.com/watch?v=AtITX-U2mL4">https://www.youtube.com/watch?v=AtITX-U2mL4</a></li>
<li><a href="https://www.youtube.com/watch?v=htw7DxtNlFs">https://www.youtube.com/watch?v=htw7DxtNlFs</a></li>
<li>data formatting, e.g.
<ul>
<li>HTML</li>
<li>character formatting (ASCII, UTF)</li>
<li>file formats (JPEG, PNG)</li>
</ul>
</li>
<li>encryption
<ul>
<li>SSL</li>
</ul>
</li>
</ul>
</li>
<li>Application layer (user interface–e.g. web browser)
<ul>
<li>application services</li>
<li>service discovery</li>
<li>Protocols:
<ul>
<li>HTTP</li>
<li>SMTP</li>
<li>TELNET</li>
</ul>
</li>
</ul>
</li>
</ol>
Java Primer for Python Developers2019-09-12T00:00:00+00:00https://maxmautner.com/2019/09/12/java-primer-for-python-developers<p>I took these notes while ramping up on Java, as I onboarded at <a href="https://www.personalcapital.com">Personal Capital</a> in my first Java role since <a href="https://www.cmc.edu/">college</a>.</p>
<p>There are large distinctions between the two programming languages, but I’ll try to give the most notable that I encountered–as I approached Java from a Python-heavy background.</p>
<ul>
<li><a href="#everything-is-scoped-to-a-class">Everything is scoped to a class</a></li>
<li><a href="#explicit-scopes">Explicit scopes</a></li>
<li><a href="#dependency-injection">Dependency injection (DI)</a></li>
<li><a href="#list-comprehensions-and-generators">List comprehensions & generators</a></li>
<li><a href="#testing">Testing</a></li>
<li><a href="#mocking">Mocking</a></li>
<li><a href="#conclusion">Conclusion</a></li>
</ul>
<h3 id="everything-is-scoped-to-a-class">Everything is scoped to a class</h3>
<p>In Java, every file contains 1 public class definition:</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>public class Example {
...
}
</code></pre></div></div>
<p>You cannot declare 2 classes in 1 file–and the filename <em>has</em> to match the class’s name.</p>
<p>For example, putting this in 1 file will cause a compilation error:</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>public class A {}
public class B {}
</code></pre></div></div>
<p>That doesn’t preclude you from declaring a class within a class (an “inner” class):</p>
<pre><code class="language-`">public class A {
public class B {}
}
</code></pre>
<p>Or private classes along-side your 1 public class:</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>public class A {}
private class B {}
</code></pre></div></div>
<p>This also holds for declaring “top-level” variables–all variables in your program have to be declared as fields on a class or declared within the scope of a class method.</p>
<p>For example, let’s say you want to declare a constant:</p>
<p>In Python you might say:</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">LOG_LEVEL</span> <span class="o">=</span> <span class="s">"info"</span>
</code></pre></div></div>
<p>In Java you would say:</p>
<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">public</span> <span class="kd">class</span> <span class="nc">Configuration</span> <span class="o">{</span>
<span class="kd">public</span> <span class="kd">final</span> <span class="kd">static</span> <span class="n">String</span> <span class="n">LOG_LEVEL</span> <span class="o">=</span> <span class="s">"info"</span><span class="o">;</span>
<span class="o">}</span>
</code></pre></div></div>
<p>To further illustrate the difference, let’s say the constant is read and set from an environment variable:</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">print</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">"LOG_LEVEL"</span><span class="p">))</span>
</code></pre></div></div>
<p>In Java, the idiomatic approach would be:</p>
<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">public</span> <span class="kd">class</span> <span class="nc">Configuration</span> <span class="o">{</span>
<span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="n">String</span><span class="o">[]</span> <span class="n">args</span><span class="o">)</span> <span class="o">{</span>
<span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">System</span><span class="o">.</span><span class="na">getenv</span><span class="o">(</span><span class="s">"LOG_LEVEL"</span><span class="o">));</span>
<span class="o">}</span>
<span class="o">}</span>
</code></pre></div></div>
<h3 id="explicit-scopes">Explicit scopes</h3>
<p><code class="highlighter-rouge">public</code>, <code class="highlighter-rouge">private</code>, <code class="highlighter-rouge">protected</code> are keywords that Java provides to help guide (and enforce) scope of access to variables + methods.</p>
<p>In Python, “private” scoping is indicated by prefixing your variable name with an underscore (“_”), e.g.:</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>class Example:
_x = 0
y = 0
</code></pre></div></div>
<p>In Java, this is done explictily:</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>public class Example {
private int x = 0;
public int y = 0;
}
</code></pre></div></div>
<p>I prefer the Python style, simply because it’s cleaner to read.</p>
<h3 id="dependency-injection">Dependency injection</h3>
<p>Dependency injection (DI) frameworks like <a href="https://github.com/google/guice">Guice</a> and <a href="https://spring.io">Spring</a> are highly adopted in Java software.</p>
<p>I had not encountered DI in coding Python (but had with <a href="https://docs.angularjs.org/guide/di">AngularJS</a>), so I had some learning to do on this subject in my new job.</p>
<p>A huge benefit of a strongly-typed language like Java over a dynamically-typed language like Python is that <a href="https://pchiusano.github.io/2016-09-15/static-vs-dynamic.html">type errors cannot happen at runtime</a>.</p>
<p>Using a DI framework in Java manages to introduce a new kind of fatal runtime problem (the “dependency” not found error) which can be highly frustrating and time-consuming.</p>
<p>For example in Spring, there is the famous: <a href="https://www.google.com/search?q=nosuchbeandefinition"><code class="highlighter-rouge">NoSuchBeanDefinition</code></a> exception</p>
<p>The learning curve for DI is not immense, but you will likely encounter DI frameworks with Java and it’s best to be aware.</p>
<h3 id="list-comprehensions-and-generators">List comprehensions and generators</h3>
<p>Python provides a beautifully intuitive syntax for performing operations over collections (lists, sets, key-value maps).</p>
<p>To illustrate looping over a list:</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>>> x = [1, 2, 3]
>> x = [i*i for i in x]
>> print(x)
[1, 4, 9]
</code></pre></div></div>
<p>An equivalent type of syntax was introduced in Java 8 with the concept of “<a href="https://docs.oracle.com/javase/8/docs/api/?java/util/stream/Stream.html">streams</a>” over items in a collection as well as <a href="http://tutorials.jenkov.com/java/lambda-expressions.html">lambda expressions</a>.</p>
<p>To try to be as idiomatic as I can with Java, the equivalent is:</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>List<Integer> x = Arrays.asList(1, 2, 3);
x = x.stream().map(i -> i*i).collect(Collectors.toList());
System.out.println(x);
</code></pre></div></div>
<h3 id="testing">Testing</h3>
<p>In Python, the <code class="highlighter-rouge">unittest</code> library is part of the standard library and provides an <a href="https://en.wikipedia.org/wiki/XUnit">XUnit-style</a> framework for writing class-based tests.</p>
<p>In Java, the dominant testing framework is <a href="https://junit.org/junit5/">JUnit</a>, which is also XUnit-based.</p>
<p>For all intents and purposes, they are super-similar and you should have very little learning curve coming from Python:</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>class AdditionTest:
def test_add_positive(self):
assert(2, add(1, 1))
</code></pre></div></div>
<p>To Java:</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>public class AdditionTest {
@Test
public void testAddPositive() {
assertEquals(2, add(1, 1));
}
}
</code></pre></div></div>
<h3 id="mocking">Mocking</h3>
<p>Like <code class="highlighter-rouge">unittest</code>, the <code class="highlighter-rouge">unittest.mock</code> is also provided in the Python standard library, and it’s the preferred way to mock your code in tests.</p>
<p>In Java, there are quite a few flavors of mocking libraries, but the main ones are <a href="https://site.mockito.org">Mockito</a>, <a href="https://jmockit.github.io">JMockit</a>, and <a href="http://easymock.org/">EasyMock</a>.</p>
<p>The biggest difference you’ll face with mocking in Java is dealing with how to mock <code class="highlighter-rouge">static</code> and <code class="highlighter-rouge">final</code> fields/methods.</p>
<p>If you try to mock something <code class="highlighter-rouge">final</code>/<code class="highlighter-rouge">static</code> then you’ll encounter runtime errors, and the community will tell you it’s a bad practice (which it may well be).</p>
<p>The chainsaw you can reach for in this case is <a href="https://powermock.github.io">PowerMockito</a>–a chainsaw that you might not previously have needed in Python-land.</p>
<h3 id="conclusion">Conclusion</h3>
<p>The only thing I might add is that Java <em>requires</em> using an IDE.</p>
<p>With Python I somehow managed to survive with Vim as my IDE.</p>
<p>This is not possible with Java, I do not recommend even trying.</p>
<p>If possible, use <a href="https://www.jetbrains.com/idea/">IntelliJ Ultimate</a>. If not possible, use <a href="https://www.eclipse.org/ide/">Eclipse</a>.</p>
The Morning Paper - Testing2019-08-18T01:00:00+00:00https://maxmautner.com/2019/08/18/the-morning-paper-testing<p><a href="/2019/08/18/the-morning-paper.html">Like previously with virtualization</a>, I’m reviewing paper summaries that Adrian Colyer wrote on his blog.</p>
<p>This time I was reviewing reviews of papers about software testing!</p>
<p>Here are a handful:</p>
<h2 id="qsym-a-practical-concolic-execution-engine-tailored-for-hybrid-fuzzing-2018"><a href="https://blog.acolyer.org/2018/09/12/qsym-a-practical-concolic-execution-engine-tailored-for-hybrid-fuzzing/">QSYM: a practical concolic execution engine tailored for hybrid fuzzing</a> (2018)</h2>
<p>I’m vaguely familiar with techniques for generating software tests automatically.</p>
<p>Apparently there are 2 techniques:</p>
<ul>
<li>“fuzzing”</li>
<li>“concolic execution”</li>
</ul>
<p>Fuzzing refers to messing around with the inputs to your unit under test to try and get it to break.</p>
<p>I think that this approach is very intuitive and obvious.</p>
<p>Concolic execution “uses symbolic execution to uncover constraints and pass them to a solver”–so it performs static(?) analysis of your unit-under-test’s implementation to identify important test inputs, so that you can get more comprehensive scenario coverage.</p>
<p>Fuzzing fails to get 100% scenario coverage because it performs random-sampling to try and uncover all the conditional branching that your unit under test might have.</p>
<p>Concolic execution’s main drawback is that it is slow, because the number of paths that it has to enumerate increase exponentially with every <code class="highlighter-rouge">if</code>-<code class="highlighter-rouge">else</code> block in your unit-under-test.</p>
<p>So this paper identifies a hybrid approach (both fuzzing + concolic execution) to test generation that is faster than existing published approaches.</p>
<p>The fact that it is a hybrid approach is not novel, but it uncovered some previously untested edge cases in some popular open-source libraries.</p>
<p>I’m not tremendously interested in this, but these are interesting tools that impact every human being’s quality of life (since everyone is impacted by the quality of open-source software).</p>
<p>These techniques are also interesting to me because I think they will “trickle down” to higher-level languages like JavaScript, etc. at some point.</p>
<p>Interesting? ✅✅✅☑️ ☑️ ☑️ ☑️ ☑️ ☑️ ☑️</p>
<h2 id="a-dissection-of-the-test-driven-development-process-does-it-really-matter-to-test-first-or-test-last-2017"><a href="https://blog.acolyer.org/2017/06/13/a-dissection-of-the-test-driven-development-process-does-it-really-matter-to-test-first-or-test-last/">A dissection of the test-driven development process: does it really matter to test-first or test-last?</a> (2017)</h2>
<p>I always find discussions of TDD interesting.</p>
<p>As with most “empirical software engineering” studies, this study has a small sample-size (39 practicioners).</p>
<blockquote>
<p>…the results show that the most important thing is to work in short uniform cycles with each cycle introducing a small new piece of functionality and its associated tests. The order within the cycle – i.e., test-first or test-last didn’t really seem to matter.</p>
</blockquote>
<p>Maybe this is a case of confirmation bias or a case of “you hear what you want to hear”, but this is my anecdotal experience as well.</p>
<p>This experiment design sounds like rubbish, but it’s always encouraging to see people attempting to get more empirical data on effective software engineering.</p>
<p>Interesting? ✅✅✅✅✅✅✅☑️ ☑️ ☑️</p>
<h2 id="simple-testing-can-prevent-most-critical-failures-2014"><a href="https://blog.acolyer.org/2016/10/06/simple-testing-can-prevent-most-critical-failures/">Simple testing can prevent most critical failures</a> (2014)</h2>
<p>The paper’s subtitle is: “an analysis of production failures in distributed data-intensive systems”</p>
<p>The author’s evaluated five distributable datastores:</p>
<ul>
<li>Cassandra,</li>
<li>HBase,</li>
<li>HDFS,</li>
<li>MapReduce,</li>
<li>Redis</li>
</ul>
<p>They reviewed 73 user-reported failures of these datastores, reproducing and chronicling them.</p>
<blockquote>
<p>Almost all catastrophic failures (48 in total – 92%) are the result of incorrect handling of non-fatal errors explicitly signalled in software.</p>
</blockquote>
<p>I’ve seen this at every job I’ve held in my career:</p>
<blockquote>
<p>Using <code class="highlighter-rouge">try</code>/<code class="highlighter-rouge">catch</code>, logging the error, and then swallowing it.</p>
</blockquote>
<p>So the author’s of this paper made a tool to identify cases where this is done, and conclude that “33% of the Cassandra, HBase, HDFS, and MapReduce’s catastrophic failures we studied could have been prevented”.</p>
<p>Also interesting tidbits:</p>
<blockquote>
<p>A majority of the production failures (77%) can be reproduced by a unit test.</p>
</blockquote>
<blockquote>
<p>For a majority (84%) of failures, all of their triggering events are logged. This suggests that it is possible to deterministically replay the majority of failures based on the existing log messages alone.</p>
</blockquote>
<p>Interesting? ✅✅✅✅✅✅✅✅✅☑️</p>
<h2 id="why-do-recordreplay-tests-of-web-applications-break-2016"><a href="https://blog.acolyer.org/2016/05/30/why-do-recordreplay-tests-of-web-applications-break/">Why do record/replay tests of web applications break?</a> (2016)</h2>
<p>UI-driven tests are very brittle–it seems obvious why these tests would break, as UIs change very frequently.</p>
<p>Humorously, the authors of this paper couldn’t find suitable open-source examples because few open-source projects have record/replay style tests.</p>
<p>So they made their own 🙄</p>
<blockquote>
<p>What you really need to know is your tests are breaking because the information used to locate page elements keeps breaking</p>
</blockquote>
<p>Interesting? ✅☑️ ☑️ ☑️ ☑️ ☑️ ☑️ ☑️ ☑️ ☑️</p>
<h2 id="the-art-of-testing-less-without-sacrificing-quality-2015"><a href="https://blog.acolyer.org/2015/06/25/the-art-of-testing-less-without-sacrificing-quality/">The Art of Testing Less Without Sacrificing Quality</a> (2015)</h2>
<p>The paper’s author make a tool for evaluating the value of running an automated software test based on:</p>
<ul>
<li>the time cost (i.e. how much time it takes to run)</li>
<li>the value of preventing bugs that are reported later on</li>
</ul>
<p>The author’s work at Microsoft so they were able to perform this research on legit data (Microsoft’s Office, Windows, and Dynamics products).</p>
<blockquote>
<p>At the core of the model are estimates of the probability that a given test execution will find a genuine defect (true positive), and that it will raise a false alarm (false positive).</p>
</blockquote>
<blockquote>
<p>Both probability measurements consider the entire history from the beginning of monitoring until the moment the test is about to be executed. Consequently, probability measures get more stable and more reliable the more historic information we gathered for the corresponding test.</p>
</blockquote>
<p>The authors’ model compares the estimated cost of running a test (time + test infrastucture) vs. the estimated cost of skipping the test (probability of a future defect multiplied by the cost to fix the defect in the future) to decide whether to run a test at all.</p>
<p>This model grossly simplifies the cost of maintaining test infrastructure (or hiring software engineers who know how to effectively test), and also grossly underestimates the cost of a defect making it to customers’ hands.</p>
<p>The most interesting thing about this paper to me is that it analyzed existing test result and support ticket data, so operated entirely on historical data.</p>
<p>If this research required instrumenting Microsoft’s build servers or test runners in some way, this paper would not have been produced (as it would have been too expensive).</p>
<p>The ultimate goal of adopting this kind of test-skipping criteria is to get time-savings in the product development process, to deliver product faster to customers without losing test coverage.</p>
<p>Curious to see if this finds adoption in industry (I have not seen anything like it yet, besides tests being ignored because they are too slow).</p>
<p>Interesting? ✅✅✅✅✅✅✅✅✅✅</p>
<h2 id="coverage-and-its-discontents-2014"><a href="https://blog.acolyer.org/2014/10/22/coverage-and-its-discontents/">Coverage and its Discontents</a> (2014)</h2>
<blockquote>
<p>Most experienced testers can immediately answer that measuring code coverage is not a completely adequate replacement for measuring fault detection.</p>
</blockquote>
<p>Interesting? ✅☑️ ☑️ ☑️ ☑️ ☑️ ☑️ ☑️ ☑️ ☑️</p>
<h2 id="coverage-is-not-strongly-correlated-with-test-suite-effectiveness-2014"><a href="https://blog.acolyer.org/2014/10/21/coverage-is-not-strongly-correlated-with-test-suite-effectiveness/">Coverage is not strongly correlated with test suite effectiveness</a> (2014)</h2>
<blockquote>
<p>Testing is an important part of producing high quality software, but its effectiveness depends on the quality of the test suite: some suites are better at detecting faults than others.</p>
</blockquote>
<p>This is a very interesting topic to me.</p>
<p>When you evaluate the $$$ value of a software product, the test suite contributes some non-zero value.</p>
<p>But how do you evaluate the value of a test suite?</p>
<p>The paper’s conclusion, specifically with regards to a test suite’s line-coverage:</p>
<blockquote>
<p>While coverage measures are useful for identifying under-tested parts of a program, and low coverage may indicate that a test suite is inadequate, high coverage does not indicate that a test suite is effective.</p>
</blockquote>
<p>Not a tremendously helpful conclusion–software engineers will continue to pursue this holy grail.</p>
<p>Interesting? ✅✅✅✅✅☑️ ☑️ ☑️ ☑️ ☑️</p>
The Morning Paper - Virtual Machines2019-08-18T00:00:00+00:00https://maxmautner.com/2019/08/18/the-morning-paper<p>I came across Adrian Colyer’s <a href="https://blog.acolyer.org">The Morning Paper</a> this morning.</p>
<p>I’m overwhelmed at the number of academic papers he provides summaries for.</p>
<p>Going to “tagged” topics, I narrowed down my browsing to these areas:</p>
<ul>
<li><a href="https://blog.acolyer.org/tag/virtualization/">Virtualization</a></li>
<li><a href="https://blog.acolyer.org/tag/testing/">Testing</a></li>
<li><a href="https://blog.acolyer.org/tag/operations/">Operations</a></li>
<li><a href="https://blog.acolyer.org/tag/formal-methods/">Formal Methods</a></li>
<li><a href="https://blog.acolyer.org/tag/datastores/">Datastores</a></li>
<li><a href="https://blog.acolyer.org/tag/data-science/">Data Science</a></li>
<li><a href="https://blog.acolyer.org/tag/containers/">Containers</a></li>
</ul>
<p>To make this meta: I’ll give a summary of the paper summaries that I found most interesting</p>
<p>Today I’ll just cover the Virtualization section, with an even shorter summary of each paper & some of my thoughts:</p>
<h2 id="formal-requirements-for-virtualizable-third-generation-architectures-1974"><a href="https://blog.acolyer.org/2016/02/19/formal-requirements-for-virtualizable-third-generation-architectures/">Formal Requirements for Virtualizable Third Generation Architectures</a> 1974</h2>
<p>This paper was published in 1974, and lays out the definition of a virtual machine (VM):</p>
<blockquote>
<p>A virtual machine is taken to be an efficient, isolated duplicate of the real machine.</p>
</blockquote>
<p>A VM is the environment created by what is called a “virtual machine monitor” (VMM).</p>
<p>A VMM provides a runtime environment for programs that is:</p>
<ol>
<li>efficient, because its (virtual) processor’s instructions are executed directly by the underlying computer’s processor. This is distinct from “traditional” emulators and software simulators which will never be as fast as their underlying computer because they don’t directly use the underlying computer’s processor.</li>
<li>isolated, because it operates in complete control of its system resources, including that it cannot access resources not allocated to it and can regain control over resources it’s allocated.</li>
<li>identical to the behaviors that the program would exhibit if ran directly on the underlying computer</li>
</ol>
<p>Back in 1974, computers had 2 moving parts:</p>
<ol>
<li>a processor (which processes instructions fed to it by a software program)</li>
<li>linear uniformly addressable memory</li>
</ol>
<p>The processor could operate in 2 modes: “supervisor” or “user” mode.</p>
<p>A processor performs instructions in either mode, but user mode can only perform a subset of instructions that supervisor mode can.</p>
<p>As a program’s sequence of instructions are performed by the processor, the processor may be instructed to access an address in memory that is either beyond the limits of memory, or beyond the limits of the VMM’s allocated memory.</p>
<p>Basically a computer can be virtualized if it can prevent instructions being performed in user mode that:</p>
<ol>
<li>access resources beyond its resource allowance</li>
<li>modify its environment’s resource allowance</li>
</ol>
<p>The instructions that modify resource allowance have to be a subset of instructions that can only be performed in supervisor mode, or else user mode could run amok.</p>
<p>The paper goes on to formally prove this, which I personally can’t be bothered to go read right now!</p>
<p>Interesting? ✅✅✅✅✅☑️ ☑️ ☑️ ☑️ ☑️</p>
<h2 id="one-vm-to-rule-them-all-2013"><a href="https://blog.acolyer.org/2014/11/18/one-vm-to-rule-them-all/">One VM to Rule Them All</a> 2013</h2>
<blockquote>
<p>How to make a fast VM that isn’t complex</p>
</blockquote>
<blockquote>
<p>We present a new (Virtual Machine) approach and architecture, which enables implementing a wide range of languages within a common framework, reusing many components (especially the optimizing compiler).</p>
</blockquote>
<p>The nitty gritty of how “high-performance” is achieved is by avoiding:</p>
<ul>
<li>type-uncertainty (<a href="">boxing/unboxing</a>)</li>
<li>supporting generics</li>
<li>some caching</li>
</ul>
<p>Overall, this topic didn’t interest me as much as I thought when I clicked the link</p>
<p>Interesting? ✅☑️ ☑️ ☑️ ☑️ ☑️ ☑️ ☑️ ☑️ ☑️</p>
<h2 id="my-vm-is-lighter-and-safer-than-your-container-2017"><a href="https://blog.acolyer.org/2017/11/02/my-vm-is-lighter-and-safer-than-your-container/">My VM is lighter (and safer) than your container</a> (2017)</h2>
<blockquote>
<p>Can we have the improved isolation of VMs, with the efficiency of containers?</p>
</blockquote>
<p>This topic is near and dear to me because I have spent a fair amount of my career close to devops, “spinning” up and down VMs.</p>
<p>Creating an AWS EC2 instance can take minutes.</p>
<p>This paper demonstrates that it’s possible to boot a <a href="https://en.wikipedia.org/wiki/Xen">Xen</a>-based VM in 4ms.</p>
<blockquote>
<p>For comparison, fork/exec on Linux takes approximately 1ms. On the same system, Docker containers start in about 150ms.</p>
</blockquote>
<p>This is accomplished by running the authors’ VM as a <a href="https://queue.acm.org/detail.cfm?id=2566628">“unikernel”</a>.</p>
<p>They emphasize that the size of your VM image is linearly proportional to your boot time, and since a unikernel VM is radically smaller in size than normal VM images, this is where a lot of bootup time-savings can come from.</p>
<p>How small is small? The example given is a simple TCP service that returns the current time–it is 480KB uncompressed, and runs in 3.6MB of RAM</p>
<p>Not normally realistic–especially <a href="https://www.personalcapital.com">since I work at a JVM shop</a>, but interesting to have proven.</p>
<blockquote>
<p>As we keep creating VMs, the creation time increases noticeably (note the logarithmic scale): it takes 42s, 10s and 700ms to create the thousandth Debian, Tinyx, and unikernel guest, respectively.</p>
</blockquote>
<p>Scaling up the number of VM instances on a server led them to identify interesting bottlenecks that led to super-linear growth in bootup times of each additional VM instance.</p>
<p>One source of superlinear growth was <a href="https://wiki.xen.org/wiki/XenStore">XenStore</a> and interactions with it.</p>
<blockquote>
<p>one fundamental problem with the XenStore is its centralized, filesystem-like API which is simply too slow for use during VM creation and boot, requiring tens of interrupts and privilege domain crossings</p>
</blockquote>
<blockquote>
<p>LightVM redesigns the Xen control plane with a lean driver called noxs (for ‘no XenStore’) that replaces the XenStore and allows direct communication between front-end and back-end drivers via shared memory.</p>
</blockquote>
<p>Most interestingly, they highlight how this type of lightweight VM could be used to offer an AWS Lambda type of compute hosting service.</p>
<p>Interesting? ✅✅✅✅✅✅✅☑️ ☑️ ☑️</p>
<h2 id="deconstructing-xen"><a href="https://blog.acolyer.org/2017/03/16/deconstructing-xen/">Deconstructing Xen</a></h2>
<blockquote>
<p>Unfortunately, one of the most widely-used hypervisors, Xen, is highly susceptible to attack because it employs a monolithic design (a single point of failure) and comprises a complex set of growing functionality including VM management, scheduling, instruction emulation, IPC (event channels), and memory management.</p>
</blockquote>
<p>Covers a lot of extremely low-level security concerns with Xen.</p>
<p>Too much for me to process right now.</p>
<p>Interesting? ✅☑️ ☑️ ☑️ ☑️ ☑️ ☑️ ☑️ ☑️ ☑️</p>
How to Run Pandas' Test Suite2019-06-30T07:32:13+00:00https://maxmautner.com/2019/06/30/running-pandas-test-suite<p><img alt="Running Pandas test suite" src="/public/images/pandas-tests.png" width="100%" /></p>
<p>First place I looked to start with was Pandas’ official docs:</p>
<ul>
<li><a href="https://dev.pandas.io/docs/development/contributing.html">Contributing to Pandas: Running the Test Suite</a></li>
</ul>
<p>If only it was that easy 😊</p>
<h2 id="the-list-of-steps">The List of Steps</h2>
<p>I own a Mac, but steps are probably pretty similar for the other major OSes.</p>
<p>Here’s the list of steps I took:</p>
<ul>
<li>Fork & clone <a href="https://github.com/pandas-dev/pandas">the Pandas Github repo</a></li>
<li>Obtain <a href="https://github.com/pyenv/pyenv">pyenv</a>, <a href="https://github.com/pyenv/pyenv-virtualenv">pyenv-virtualenv</a></li>
<li>Download and install Python v3.5.6 (in my case I had to re-install Xcode & specify <a href="https://github.com/pyenv/pyenv/issues/530#issuecomment-428608033">some additional build flags</a> to get this working):</li>
</ul>
<p><code class="highlighter-rouge">pyenv install 3.5.6</code></p>
<ul>
<li>Create a new Python <a href="https://realpython.com/python-virtual-environments-a-primer/">virtual environment</a> and activate it:</li>
</ul>
<p><code class="highlighter-rouge">pyenv virtualenv pandasdev && pyenv activate pandasdev</code></p>
<ul>
<li>Specify the Pyhton version to be used for subsequent commands:</li>
</ul>
<p><code class="highlighter-rouge">pyenv version 3.5.6</code></p>
<ul>
<li>Install Cython (for whatever reason this is not a stated dependency and the next step will fail if you do not perform this one):</li>
</ul>
<p><code class="highlighter-rouge">pip install cython</code></p>
<ul>
<li>Install an <a href="https://pip.pypa.io/en/stable/reference/pip_install/#editable-installs">“editable” version</a> of pandas, along with <a href="https://github.com/pypa/pip/issues/1236">its “test” dependencies</a>:</li>
</ul>
<p><code class="highlighter-rouge">pip install -e ".[test]"</code></p>
<ul>
<li>Finally, use <a href="https://docs.pytest.org/en/latest/"><code class="highlighter-rouge">py.test</code></a> to run the tests!</li>
</ul>
<p><code class="highlighter-rouge">pytest ./pandas/</code></p>
<hr />
<h2 id="so-how-did-it-turn-out">So how did it turn out?</h2>
<p>Ultimately, on my iMac it took ~1400 seconds (24 minutes) to run the test suite:</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>=============== 15 failed, 52313 passed, 3609 skipped, 826 xfailed, 15 xpassed, 3 warnings in 1428.99 seconds ================
</code></pre></div></div>
<p>Not perfect results from the head of <code class="highlighter-rouge">master</code> branch…suspicious!</p>
<p>Many (all?) of the test failures seemed to be due to logged warning messages of the type:</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>AssertionError: Did not see expected warning of class 'FutureWarning'.
</code></pre></div></div>
<h2 id="what-to-do-next">What to do next?</h2>
<p>I’ll do some more digging later to identify what might be causing them to be categorized as failures, but this looks like a good place to start:</p>
<p><a href="https://dev.pandas.io/development/contributing.html#testing-warnings">https://dev.pandas.io/development/contributing.html#testing-warnings</a></p>
Defining Runway2019-05-10T07:32:13+00:00https://maxmautner.com/2019/05/10/define-runway<p>I had an interesting conversation over lunch today with my friend Chang She.</p>
<p>He had an interesting reflection on startups and the discussion of a startup’s “runway.”</p>
<p>Usually this is discussed in terms of time.</p>
<p>It’s usually discussed in arithmetic terms:</p>
<blockquote>
<p>budget / (cost/month) = # of months in “runway”</p>
</blockquote>
<p>Chang suggested that it’s better measured as the number of experiments you can perform:</p>
<blockquote>
<p>budget / (cost/experiment) = # of experiments in “runway”</p>
</blockquote>
<p>Every product feature you put before customers or conversation you hold with a prospective customer is an experiment (albeit some experiments are more or less rigorous than others).</p>
<p>I found this a helpful insight, and a healthy way to look at your “runway.”</p>
<p>Thanks Chang 😊</p>
mypy, the Optional Static Type-Checker for Python2019-04-30T07:32:13+00:00https://maxmautner.com/2019/04/30/mypy-optional-python-static-type-checker<p>One of the valid criticisms of Python as a programming language is that it <a href="https://stackoverflow.com/questions/46388355/is-python-type-safe">lacks strict type-safety</a>.</p>
<p>In 2013, Dropbox hired <a href="https://gvanrossum.github.io">Guido Van Rossum</a>–Python’s inventor–and he created <a href="http://mypy-lang.org">mypy</a>, the optional static type-checker for Python.</p>
<p>Continuing my series of <a href="https://www.youtube.com/playlist?list=PLtLImFco1g8ZDheBwK1T_J-q9RLI4HxMf">“taking a peek” screensharing videos</a>, I took mypy for a spin and <a href="https://github.com/python/mypy/pull/6733">submitted a pull request on the mypy Github repo</a> (which <a href="https://github.com/python/mypy/pull/6733#issuecomment-487318299">Guido commented on</a> 😮):</p>
<iframe width="560" height="420" style="max-width: 100%;" frameborder="0" src="//www.youtube.com/embed/ykpZ78qZPD4?color=white&theme=light"></iframe>
<p>If you enjoyed the video then please subscribe as I plan on producing more!</p>
Make your own Google Analytics2019-04-26T07:32:13+00:00https://maxmautner.com/2019/04/26/make-your-own-google-analytics<p>There’s lots of <a href="https://developers.google.com/analytics/devguides/collection/analyticsjs/limits-quotas">constraints on the free-tier of Google Analytics</a>.</p>
<p>What if I told you that you can make your own Google Analytics, with no constraints?</p>
<p>This can be accomplished with a few Google Cloud Platform services:</p>
<ul>
<li><a href="https://cloud.google.com/storage/">Cloud Storage</a></li>
<li><a href="https://cloud.google.com/bigquery">BigQuery</a>, &</li>
<li><a href="https://datastudio.google.com/">DataStudio</a></li>
</ul>
<p>I found this out from discovering this nifty little Github project, <a href="https://github.com/Fedia/bigpapa">BigPapa Web Insights</a>.</p>
<p>For a full breakdown of how to set this up, check out my screen-recording:</p>
<iframe width="560" height="420" style="max-width: 100%;" frameborder="0" src="//www.youtube.com/embed/DS2zuAC_4Sw?color=white&theme=light"></iframe>
10 Lessons from Magic the Gathering2019-04-15T07:32:13+00:00https://maxmautner.com/2019/04/15/trading-cards<p><img src="/public/images/black-lotus.png" alt="Black Lotus" /></p>
<p>15 years ago I was a vicious little Magic the Gathering card collector.</p>
<p>I loved every aspect of it:</p>
<ul>
<li>the artwork,</li>
<li>the strategy of playing the game,</li>
<li>and most important: trading the cards themselves.</li>
</ul>
<p>Here’s a Top-10 list of life lessons I learned as a middle school Magic card trader:</p>
<h2 id="1-auction-environments-are-fun">1. Auction environments are fun</h2>
<p>Trading is exhilarating.</p>
<p>You learn a lot about what people care about, and how to get people to share with you what it is that they care about.</p>
<h2 id="2-asymmetric-information-is-your-edge">2. Asymmetric information is your edge</h2>
<p>You can conquer the market by having the most information.</p>
<p>Get info on who has which cards, how rare the cards are, and who has demand.</p>
<h2 id="3-punish-bad-actors">3. Punish bad actors</h2>
<p>No one trades with an asshole. Assholes will:</p>
<ul>
<li>“shop” their bad trades around trying to find a sucker,</li>
<li>use coercion (e.g. wedgies, tittie-twisters),</li>
<li>cry about their ill-fortune</li>
</ul>
<p>A healthy community will punish assholes by blacklisting them from trades.</p>
<p>They may have to buy their way back into good favor by taking a bad trade to prove their standing.</p>
<h2 id="4-find-secondary-market-liquidity">4. Find secondary market liquidity</h2>
<p>Lunchtime isn’t the only marketplace for trading.</p>
<p>You can meet outside of school, find new participants, and pay for new cards from the store.</p>
<h2 id="5-batch-trades-are-sometimes-easier">5. Batch trades are sometimes easier</h2>
<p>Let your counterparty feel in-control by offering to increase the deal size + scope.</p>
<p>This signals that you care about finding a trade that benefits everyone.</p>
<h2 id="6-understanding-your-counterpartys-intent">6. Understanding your counterparty’s intent</h2>
<p>At least half of trade volume arises from asking counterparties to share what it is they are seeking.</p>
<p>They can’t say “yes” if you never ask (the same is true of dating 😉).</p>
<h2 id="7-track-scarcity">7. Track scarcity</h2>
<p>Know who has which cards.</p>
<p>This makes you the fastest to be able to find counterparties for your trades.</p>
<p>This is how you capture “alpha” (risk-free profit).</p>
<h2 id="8-combinatorial-discovery">8. Combinatorial discovery</h2>
<p>Identify winning card combinations and educate other market participants on your findings.</p>
<p>They will come to you for consultation and “first look” at trades due to your reputation.</p>
<h2 id="9-price-anchoring">9. Price anchoring</h2>
<p>Sometimes yelling “NO” has a strong effect on the market’s impression of an asset’s value.</p>
<h2 id="10-visual-appeal">10. Visual appeal</h2>
<p>Some people are in the market because the artwork is cool.</p>
<p>Consider all the properties of your assets beyond the dollar-value.</p>
<h2 id="a-final-lesson">A final lesson</h2>
<p>People often confuse “competitive” with “zero-sum.”</p>
<p>In the long run, trading only happens because it’s consensual.</p>
Better than the news2019-04-14T07:32:13+00:00https://maxmautner.com/2019/04/14/there-is-better-than-the-news<p>It sounds like a TED talk.</p>
<p>A data scientist from the New York Times takes the stage to share the project they have been working on:</p>
<h2 id="project-feels"><a href="https://www.youtube.com/watch?v=sVzZmNxmWko">“Project Feels”</a></h2>
<p><a href="https://www.youtube.com/watch?v=sVzZmNxmWko" target="_blank">
<img alt="Alexander Spangher, Data Scientist at The New York Times" src="/public/images/alex-spanger.png" width="100%" />
</a></p>
<blockquote>
<p>When we look at the [NYTimes] homepage on any given day we notice a lot of stories there.</p>
</blockquote>
<blockquote>
<p>Is anyone feeling a bit tired these days?</p>
</blockquote>
<blockquote>
<p>What if we could predict the [emotional] effects that our articles would have on people?</p>
</blockquote>
<blockquote>
<p>We could recommend articles that make people feel a certain way</p>
</blockquote>
<p>That last sentence is important.</p>
<p>Because feelings are habit-forming.</p>
<p>The speaker directly references it, with respect to identifying how to drive more New York Times subscribers.</p>
<h2 id="horror-or-comedy">Horror or Comedy?</h2>
<p>In the short run, we’re masters of our own fates.</p>
<p>When you sit down and decide what screen to stare at for for this evening’s 30 minutes of free time, you are subconsciously asking yourself this question:</p>
<blockquote>
<p>How do I want to feel?</p>
</blockquote>
<p>Netflix, Amazon Prime, Hulu, and Facebook all provide this as a service.</p>
<p>The New York Times is too.</p>
<p>It’s important to remember that.</p>
<h2 id="the-good-gal-vs-the-bad-gal">The Good Gal vs. The Bad Gal</h2>
<p>News businesses write two or more versions of every article.</p>
<p>Both are factually true.</p>
<p>Both had a marginal cost of production that is <a href="https://en.wikipedia.org/wiki/Information_wants_to_be_free">falling to $0 through automation</a>.</p>
<p>Should we care if it’s factually correct if it has been weaponized to try to evoke a certain emotion?</p>
<p>What was this New York Times frontpage trying to provoke in you?</p>
<blockquote class="twitter-tweet" data-lang="en">
<p lang="en" dir="ltr">The NYTimes doesn’t mind kneecapping Dems with unflattering photos if it drives shares/clicks/ad $ <a href="https://twitter.com/hashtag/capitalismbaby?src=hash&ref_src=twsrc%5Etfw">#capitalismbaby</a> 🤘😝🤘 <a href="https://t.co/LMBy08ozMl">pic.twitter.com/LMBy08ozMl</a></p>
<p>— Max Mautner (@maxmautner) <a href="https://twitter.com/maxmautner/status/1053364922485096449?ref_src=twsrc%5Etfw">October 19, 2018</a></blockquote>
<script async="" src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></p>
<p>This weaponization may not even be <em>consciously</em> performed by the New York Times.</p>
<p>It could be that a third party <em>chooses</em> which emotion they want (or know you want) to feel.</p>
<p>That choice might be made for you by newsfeed curation algorithms like Facebook or Twitter.</p>
<h2 id="better-than-newsfeeds">Better than news(feeds)</h2>
<p>Ways to avoid emotional manipulation via content:</p>
<ul>
<li>Spend time with your family</li>
<li>Focus on your business, your job, your skills</li>
<li>Track your personal financial portfolio (use an account aggregator like Personal Capital, or Google Sheets)</li>
</ul>
<p>If I can summarize my advice in a single point:</p>
<blockquote>
<p><strong>Follow what the financial markets are doing, not what the media organizations are doing.</strong></p>
</blockquote>
<p>Stay healthy my friends.</p>
</blockquote>
Why weightlifting?2019-03-30T07:32:13+00:00https://maxmautner.com/2019/03/30/why-weightlifting<p><img src="/public/images/squat-rack.jpeg" alt="" /></p>
<p>I worked 11–12 hour days, graveyard shift.</p>
<!--more-->
<p>It was my first job out of college—for which I felt very fortunate to have!</p>
<p>I worked for a Chicago trading firm, trading European financial products.</p>
<p>It required sitting.</p>
<p><em>A lot.</em></p>
<p>I sat so much at that job, waiting.</p>
<p>Waiting for <a href="https://en.wikipedia.org/wiki/Greek_government-debt_crisis">events to happen in the markets</a>.</p>
<p>If war is a lot of waiting, interrupted by overwhelming bouts of action, then trading is similar.</p>
<p>Amidst my waiting I would read articles on my computer about human decision-making.</p>
<p>Total clickbait stuff–studies about “<a href="https://www.sciencedaily.com/releases/2010/11/101109133227.htm">whether longer ring fingers correlate with more optimal risk-taking behavior</a>.”</p>
<p>It got me reading about hormones, and their role in decision-making:</p>
<ul>
<li>Testosterone.</li>
<li>Cortisone.</li>
<li>Dopamine.</li>
</ul>
<p>Everything I read corroborated my own experiences in trading.</p>
<p>Single days in which I lost more than $100k were vivid memories seared into my brain.</p>
<p>Much more so than than the days I gained $100k.</p>
<p>The days after losing money you’re a second-guessing mess!</p>
<p>Classic <a href="https://en.wikipedia.org/wiki/Loss_aversion">loss-aversion</a>.</p>
<p>There’s a scientific basis for that:</p>
<blockquote>
<p>Cortisone inhibits testosterone and testosterone impacts your fight-or-flight behavior.</p>
</blockquote>
<p>I asked myself what seems like the obvious question:</p>
<blockquote>
<p>How can I increase my testosterone levels?</p>
</blockquote>
<p>That’s where weightlifting came in—to see whether I could observe a behavior change in myself by upping my natural T-levels.</p>
<p>It didn’t work out quite how you’d imagine—for one, I quit my job with my new-found risk-taking abilities!</p>
<p>But for another, I discovered that there’s a whole slew of factors that impact your behavior beyond testosterone’s effects:</p>
<ul>
<li>sleep</li>
<li>diet</li>
<li>sex-drive</li>
<li>age (god this one sucks—LOL!)</li>
<li>distress</li>
</ul>
<p>Ultimately, addressing these human needs is how I got into weightlifting.</p>
<p>If you’re curious about my programming (what I lifted and how often) from when I first started out—I bought the 2nd edition of Starting Strength for $30.</p>
<p>It can be summed up as: squat/bench/deadlift 3x a week, 5x5 monotonically increasing the weights you attempt. Watch your form.</p>
<p>It was only a couple years back now (2016?) that I became more observant of remaining constistent in my trainings.</p>
<p><img src="/public/images/max-weightlifting.jpeg" alt="" /></p>
<p>Now I do it less for the natural hormonal/behavior change benefits, but for the social aspect.</p>
<p>Competitive athletics brings together an amazing group of people—there are few A-holes in niche sports as small as weightlifting.</p>
<p>And I can say it’s given me some amazing friends and some extremely memorable experiences!</p>
<p><img src="/public/images/social-weightlifting.jpeg" alt="" /></p>
An Optimized Alternative to RTFM2019-01-19T07:32:13+00:00https://maxmautner.com/2019/01/19/an-rtfm-alternative<p><img src="/public/images/rtfm.jpeg" alt="RTFM ya dingus!" /></p>
<p>RTFM or “Read the Fucking Manual” is a phrase shared when new engineers ask for answers to questions that they can answer themselves.</p>
<p>The phrase implies that the person seeking help hasn’t made the effort to try and answer the question on their own.</p>
<p>As experienced engineers know, this is a reasonable assumption to make.</p>
<p>However, RTFM should be replaced.</p>
<p>It’s a put down–and an acronym that beginners can’t be expected to understand.</p>
<p>It’s used to discourage out-of-group members to pollute the conversations held by in-group members. It also signals that the person using RTFM is an in-group member, like speaking in Esperanto 🙄</p>
<p>In reality, it doesn’t encourage better behavior in the future. It often leads to <strong>more</strong> questions, because it’s so cryptic and rude.</p>
<p>Consider this alternative:</p>
<blockquote>
<p>“If you spend 5 minutes Googling this you’ll know more than me about this topic. “</p>
</blockquote>
<p>It seems so obvious, but it isn’t.</p>
<p>This phrase covers every checklist item I can imagine:</p>
<ul>
<li>It’s short (enough)</li>
<li>It flatters by suggesting they are capable of answering the question on their own</li>
<li>It demonstrates modesty</li>
<li>It demonstrates that free information is close at all times–even when a stranger isn’t online and willing to dispense guidance for free</li>
<li>It recognizes that their isn’t a single manual for information. RTFM dates from a time when compilers came with a single manual–there was no StackOverflow, etc.</li>
</ul>
<p>Much better than RTFM!</p>
Take a Break Ya Dingus!2018-10-14T07:32:13+00:00https://maxmautner.com/2018/10/14/take-a-break<p><img src="/public/images/ctrl-c-small.gif" alt="Control + C" /></p>
<!--more-->
<p>Some of the ways I take a break include:</p>
<ul>
<li><em>Take a nap</em> 😴</li>
<li>Start/stop reading <a href="https://www.reddit.com/r/coffee">Reddit</a></li>
<li>Start/stop reading <a href="https://www.quora.com/profile/Max-Mautner">Quora</a></li>
<li>Play some Call of Duty on the ol’ XBox One 🔫</li>
<li>Make a coffee–avoid energy drinks, part of the benefit of a coffee is the ritual of preparing it. I’ve found that cracking open a Red Bull/Monster energy drink and ingesting large amounts of artificial sweeteners generally doesn’t do much for me, while a black cup o’ joe does wonders.</li>
<li>Drink some water (will have the added benefit of sending you to the bathroom in 1-2 hours for a bonus break)</li>
<li>Do some heavy weightlifting. I’ve found that stressing my body’s central nervous system makes me sleep better and focus for longer periods of time</li>
<li>Socialize, you dingus!</li>
</ul>
<p>Can’t be productive at all times 😉</p>
The Zero-Indexed Stock Market2018-10-14T07:32:13+00:00https://maxmautner.com/2018/10/14/zero-indexed-stock-market<p>The major pop finance websites (Yahoo Finance, Google Finance, The Motley Fool) purposefully lie to you.</p>
<p>What’s their lie?</p>
<p>They lie by using this chart:</p>
<p><img src="/public/images/SP500-2014-2018.png" alt="Non-zero-indexed S&P 500 returns" /></p>
<p>Instead of this chart:</p>
<!--more-->
<p><img src="/public/images/SP500-2014-2018-zero-indexed.png" alt="Zero-indexed S&P 500 returns" /></p>
<h3 id="can-you-tell-the-difference">Can you tell the difference?</h3>
<ul>
<li>in the first chart, the Y-axis (vertical) in the initial chart is chosen arbitrarily</li>
<li>in the second chart, the Y-axis starts at 0</li>
</ul>
<p><img src="/public/images/SP500.gif" alt="S&P 500 returns animated GIF" /></p>
<h3 id="why-does-this-matter">Why does this matter?</h3>
<p>This matters because these pop finance websites are trying to fool you.</p>
<p>They are trying to mislead you into believing that there has been a bigger <em>magnitude</em> change in the
index or stock price–by skewing your visual perception of the price change over time to make it looker <em>bigger</em>.</p>
<h3 id="why-would-they-do-that">Why would they do that?</h3>
<p>Because you will react more emotionally when you perceive a higher magnitude change than
an honest representation of the price change over time.</p>
<p>Looking at historical prices, <em>always look at zero-indexed charts</em>.</p>
<p>This will <a href="https://en.wikipedia.org/wiki/Priming_(psychology)">prime</a> you for
rational decision-making.</p>
<p>You will make decisions with a more honest representation of price history–the exact
goal of using data visualizations in the first place!</p>
Software engineer? Start a podcast.2018-07-24T09:32:13+00:00https://maxmautner.com/2018/07/24/podcast-storytelling<p><img src="/public/images/storytelling.png" alt="Storytelling" /></p>
<p>What should a software engineer do to maximize their career from a position of being in a full-time role?</p>
<ul>
<li>Study for whiteboarding interviews?</li>
<li>Brush up the Github profile with make-work?</li>
<li>Start a blog to quietly publicize your achievements in your full-time role?</li>
<li>Cynically job hop every 2 years?</li>
</ul>
<p>I’d suggest an alternative (or an additional option):</p>
<p>Invest in your personal network, showcase your personal brand and practice your storytelling skills by…</p>
<!--more-->
<h1 id="starting-a-podcast">starting a podcast.</h1>
<p>Here is a handful of realizations I’ve had in running my podcast <a href="https://theaccidentalengineer.com">The Accidental Engineer</a> over the past year:</p>
<ul>
<li><em>Promotion is everything</em>. If you don’t promote then you won’t have an audience or learn how to grow one.</li>
<li>Guests agree to come on because they’re curious and <em>optimistic that you’ll present them in a positive light</em>. If you consider Late Night shows, guests are promoting their personal brand <em>and</em> a new piece of content (e.g. a book, a movie, a TV show). The best guests are effective self-promoters, because they will help you promote your show.</li>
<li><em>Slow down your speaking</em>–your speech will improve. Filler words can be hugely diminished by thinking before you speak: “You know”, “So”, “Like.” Editing transcripts yourself will make this painfully evident.</li>
<li><em>People really want jobs</em>. No shit, right? Well, it became apparent that this was case based on the Google search terms by which people were finding <a href="https://theaccidentalengineer.com">the Accidental Engineer</a>: “<company name> interview”</li>
<li><em>Try out video in addition to audio.</em> It’s fun–you can learn a ton about cameras, audio, and color treatment of your video to make your stuff look really professional.</li>
<li><em>Raw text transcripts are unreadable</em>. People speak in a grammar that’s unreadable–cleanup the transcripts you make (I’ve used services like Rev, Speechpad–about equal quality for ~$1/minute)</li>
<li><em>What is your goal</em>? Optimize toward goals. I found metrics to be best:
<ul>
<li>number of views,</li>
<li>average time on site,</li>
<li>email list signups, etc.</li>
</ul>
</li>
</ul>
<p>A big takeaway for me has been recognizing the effectiveness of storytelling–that everyone has a story and needs practice telling it to a listening audience.</p>
<p>Listening to people’s stories and styles of storytelling is a great way to develop and <strong>inform your own</strong>.</p>
<p>Here’s my original post, announcing my podcast:</p>
<p><strong><a href="/2017/07/15/the-accidental-engineer.html">The Accidental Engineer</a></strong></p>
<p>Curious about how to start a podcast? <a href="/about/">Hit me up!</a></p>
How to Survive the Graveyard Shift2018-07-23T07:32:13+00:00https://maxmautner.com/2018/07/23/graveyard-shift<p>So you have a job that pays you to come to the office outside of 9-5.</p>
<p>May god have mercy on your soul, your bodily health, and your sanity!</p>
<p>I’ve been there–heed my advice:</p>
<p><img src="/public/images/nighttime.png" alt="Tired Max Mautner" /></p>
<!--more-->
<p>Let’s review the effects of sleep deprivation:</p>
<ul>
<li>volatile emotions</li>
<li>degraded decision-making abilities</li>
<li>lower baseline energy levels</li>
<li>slower metabolism, leading to obesity and ultimately Type II diabetes</li>
<li>lower natural testosterone levels</li>
</ul>
<h3 id="how-to-cope">How to cope:</h3>
<p><img src="/public/images/eyeballs.png" alt="Sleep mask is clutch" /></p>
<ol>
<li><em>Adopt a sleep schedule</em>: sleep after work, sleep before work. In my case, that meant leaving work at noon and arriving home at 1pm. Aim for 8 hours–never go below 6, especially if you are older than 25 (because your body will be beginning its decline to agedness 😝). In order to get sleep, buy a sleep mask. Light inhibits your body from beginning and achieving “deep sleep.” Be conscious of your sleep quality–even consider earplugs.</li>
<li><em>Go to the gym</em>: your body’s natural hormone production will tank as it is deprived of regular sleeping, sunlight and socializing. Get in the gym–whether it’s to walk/run on the treadmill, or (ideally) do some heavy weightlifting. Educate yourself and find something that’s enjoyable (and perhaps even social!) 🧗♀️🏋🏻♂️🧘♀️🏊🏻♀️🚴♀️</li>
<li><em>Socialize</em>: graveyard shift will kill your social life. You need to make extra effort to initiate and develop relationships that “ordinary shift” people take for granted. Make sure you go out to dinner with friends–even if it requires adapting your sleep schedule from #1 🥂</li>
<li><em>Quit your job</em>: no graveyard shift is sustainable. You are suffering from Stockholm Syndrome if you think this is a good job. Get the fuck out of there ASAP. <strong>Whatever “premium” you’re being paid to suffer through off hours can be recouped by your higher productivity as a day-time employee.</strong></li>
</ol>
<p>Starting a graveyard shift is like going into prison–however in some ways you’ll be free of some of the peer surveillance your daytime peers might fear!</p>
<p>Much like prison (I would imagine), use your free time to learn.</p>
<p>You can learn an incredible amount, uninterrupted–and for free online.</p>
<p>Learn about your job, learn about the job you’d like to have!</p>
<p>Use Quora, use Reddit–find communities of professionals in your desired area of profession.</p>
<p>If you’d like advice for your situation then reach out–especially specific to software engineering or finance.</p>
<p><a href="/about/">I’m happy to listen to your quandaries</a> 🧖♂️</p>
Making Markets, Pawn Shops, and Farmer Joe2018-07-20T07:32:13+00:00https://maxmautner.com/2018/07/20/financial-products<p>My first full-time job out of college was at a small (<100 employee) Chicago finance firm.</p>
<p>It was crazy.</p>
<p><img src="/public/images/crazy-mang.png" alt="Crazy Mang" /></p>
<!--more-->
<p>The company I worked for was a <strong>market maker</strong>.</p>
<p>The function of a market maker is someone that publicly shares their willingness to buy or sell a given asset.</p>
<p>Without a market maker buyers cannot find sellers and sellers cannot find buyers.</p>
<p>Without market makers, markets are…</p>
<p><img alt="Chaos!" src="/public/images/chaos.png" width="100%" /></p>
<p>A pawn shop is a market maker.</p>
<p>You could bring a bike to their store and they’d offer you $50–you could ask to buy the bike and they would offer you it for $100.</p>
<p>In the time between buying and selling the bike (and capturing a $50 profit), the pawn shop loses money.</p>
<p>They have to:</p>
<ul>
<li>pay rent,</li>
<li>pay their employees,</li>
<li>pay utilities,</li>
<li>and bear the stress of haggling with customers (because no one does that voluntarily!)</li>
</ul>
<p>Another hidden cost that the pawn shop faces is that they may not ever be able to sell the bike to anyone for more than $50!</p>
<p><img alt="Pawn Shop" src="/public/images/pawn-shop.png" width="100%" /></p>
<h3 id="can-a-pawn-shop-protect-itself-from-that-difficult-situation">Can a pawn shop protect itself from that difficult situation?</h3>
<p>They can buy insurance.</p>
<p>But what kind of insurance?</p>
<p>Well–what if someone didn’t really need a bike?</p>
<p>You could offer the pawnshop a deal:</p>
<blockquote>
<p>if the pawnshop hasn’t sold the bike in 6 months, then they can decided to sell it to me for $60</p>
</blockquote>
<p>but if they fail to sell it in the next 6 months for $50 profit they can at least recoup $10.</p>
<p>They don’t have to sell it to me–but they’ll have the <em>option</em> to.</p>
<p>This type of agreement frees individuals to take risks they would not otherwise–since they have re-assurance that their ass is covered.</p>
<p>This type of agreement (contract) is called an “option”.</p>
<p>It important to many businesses in the world–perhaps the oldest is agriculture and food production.</p>
<h3 id="farmer-joe">Farmer Joe</h3>
<p><img src="/public/images/farmer-joe.png" alt="Farmer Joe" /></p>
<p>Farmer Joe cannot know exactly how much crops his land will yield in 6 months (if any!).</p>
<p>Nor can he know what the price of apples will be in 6 months.</p>
<p>Risk factors that can affect the price of apples 6 months in the future include:</p>
<ul>
<li>weather events (droughts/floodings)</li>
<li>insect pests</li>
<li>plant diseases</li>
<li>fluctuating market demand</li>
<li>fluctuating market supply (other farmers’ decisionmaking and luck)</li>
</ul>
<p>Our farmer can benefit tremendously from being able to enter into a contract to optionally sell their apples.</p>
<p>It can prevent a farmer from going bankrupt in good years and bad!</p>
<p>I’ll be creating a follow on blogpost to share how you can evaluate an insurance contract’s price.</p>
<p>Interested in insurance? <a href="https://stress.maxmautner.com/">Manage your stress.</a></p>
The Declaration of Independence2018-07-06T07:32:13+00:00https://maxmautner.com/2018/07/06/declaration-of-independence<p>The 4th of July is the anniversary of the adoption of the Declaration of Independence–a document adopted by the <a href="https://en.wikipedia.org/wiki/Continental_Congress">Continental Congress</a> to declare political independence from the <a href="https://en.wikipedia.org/wiki/British_Empire">British Empire</a>.</p>
<p>I have a murky awareness of the series of events and the group of individuals who began (and finished) the Revolutionary War.</p>
<p>American schools tend to focus on specific events to avoid the murkiness, including the authoring and signing of the Declaration of Independence.</p>
<p><img alt="Independence" src="/public/images/independence.gif" width="100%" /></p>
<!--more-->
<h3 id="what-was-it">What was it?</h3>
<p>It was a document–signed by a group of like-minded separatists–that asserted that the <a href="https://en.wikipedia.org/wiki/Thirteen_Colonies">13 Colonies</a> would govern themselves without rule from the British Empire’s government which was a monarchy + parliament at the time.</p>
<p>The document reads less like a persuasive essay and more like a list of the separatists’ grievances with the Empire’s government.</p>
<p>Here is the document’s introductory sentences:</p>
<blockquote>
<p>When in the Course of human events, it becomes necessary for one people to dissolve the political bands which have connected them with another, and to assume among the powers of the earth, the separate and equal station to which the Laws of Nature and of Nature’s God entitle them, a decent respect to the opinions of mankind requires that they should declare the causes which impel them to the separation.</p>
</blockquote>
<blockquote>
<p>We hold these truths to be self-evident, that all men are created equal, that they are endowed by their Creator with certain unalienable Rights, that among these are Life, Liberty and the pursuit of Happiness.</p>
</blockquote>
<p>Powerful stuff.</p>
<p>On this 4th of July it’s worth reflecting on how durable an independence 242 years has been.</p>
Querying Access Logs on AWS2018-06-05T07:32:13+00:00https://maxmautner.com/2018/06/05/query-s3-access-logs<p>My favorite type of webapp is <a href="/2018/01/16/static-site-hosting-on-aws.html">a static one</a>.</p>
<p>Here are a few reasons:</p>
<ul>
<li>Your costs are your domain name + file-hosting, and maybe a CDN (which for most sites amounts to pennies a month),</li>
<li>Your site up-time is hard to beat,</li>
<li>and ultimately, your analytics is easy.</li>
</ul>
<p>“How easy, Max?”</p>
<p>Very easy, I’ll show you how!</p>
<!--more-->
<p>To take an example, <a href="https://maxmautner.com">maxmautner.com</a> is hosted on Amazon S3 behind Cloudfront.</p>
<p>In order to track the amount of traffic your website receives you can use a 3rd party analytics provider like <a href="https://analytics.google.com/analytics/web/">Google Analytics</a>.</p>
<p>Tools like Google Analytics suffer from a couple big problems:</p>
<ul>
<li>they under-count your real traffic due to client-side tampering (e.g. adblockers)</li>
<li>they impede you from accessing your raw data–imposing limitations on how you can use your traffic data</li>
</ul>
<p>However there is an approach that is even easier/more accurate.</p>
<ul id="markdown-toc">
<li><a href="#enabling-cloudfront-access-logs" id="markdown-toc-enabling-cloudfront-access-logs">Enabling Cloudfront Access Logs</a></li>
<li><a href="#using-athena-to-query-access-logs" id="markdown-toc-using-athena-to-query-access-logs">Using Athena to Query Access Logs</a></li>
<li><a href="#using-redshift-to-query-access-logs" id="markdown-toc-using-redshift-to-query-access-logs">Using Redshift to Query Access Logs</a></li>
<li><a href="#a-demo-with-maxmautnercom-data" id="markdown-toc-a-demo-with-maxmautnercom-data">A demo with maxmautner.com data</a></li>
</ul>
<h3 id="enabling-cloudfront-access-logs">Enabling Cloudfront Access Logs</h3>
<p>I’ve enabled a feature of Cloudfront to log all requests to logfiles on S3:</p>
<p><img alt="Enable Access Logs to S3 for a Cloudfront Distribution" src="/public/images/enable-cloudfront-logs.gif" width="100%" /></p>
<p>Log files will appear in your designated location on S3:</p>
<p><img alt="View Access Logs on S3" src="/public/images/view-access-logs.gif" width="100%" /></p>
<p>There are a couple techniques for making use of the data that you are now collecting:</p>
<ul>
<li>query the data as it is</li>
<li>performing <a href="https://en.wikipedia.org/wiki/Extract,_transform,_load">Extract-Transform-Load</a> of the data to a query data format that’s more optimal for certain types of queries, e.g. Elasticsearch or Redshift (AKA shared, columnar Postgres)</li>
</ul>
<p>I’ll be showing how to perform both approaches:</p>
<h3 id="using-athena-to-query-access-logs">Using Athena to Query Access Logs</h3>
<ul>
<li>What is it? <a href="https://aws.amazon.com/athena/">“…a serverless, interactive query service that makes it easy to analyze big data in S3 using standard SQL.”</a>
<ul>
<li>What is it really? <a href="https://prestodb.io/">hosted Presto</a>, an open source distributed SQL query engine for running interactive analytic queries on data where it is located (e.g. on S3)</li>
</ul>
</li>
<li>How to use it?
<ul>
<li><a href="https://console.aws.amazon.com/athena/home?force&region=us-east-1#query">AWS Console</a></li>
<li><a href="https://github.com/laughingman7743/PyAthena/">PyAthena client lib</a></li>
</ul>
</li>
<li>Pricing: <a href="https://aws.amazon.com/athena/pricing/">$5 per TB of data scanned (by query)</a></li>
<li>When does it make sense? When you have an infrequent and predictable query load, or you a small dataset (e.g. <50TB–e.g. a full-table scan would be 50 x $5 = $250)</li>
</ul>
<h3 id="using-redshift-to-query-access-logs">Using Redshift to Query Access Logs</h3>
<ul>
<li>What is it? <a href="https://aws.amazon.com/redshift/">“…a fast, fully managed data warehouse that makes it simple and cost-effective to analyze all your data using standard SQL”</a>
<ul>
<li>What is it really? <a href="https://en.wikipedia.org/wiki/Amazon_Redshift">A sharded relational database, storing its data in a columnar format that is optimized for read queries, based on PostgreSQL</a></li>
</ul>
</li>
<li>How to use it?
<ul>
<li>ETL (Glue?)</li>
<li>Lambdas (to perform ETL)</li>
</ul>
</li>
<li>Pricing: <a href="https://aws.amazon.com/redshift/pricing/">$180+/month (on-demand), $113+/month (12-month reserve pricing)</a></li>
<li>When does it make sense? When you have frequent or undpredictable query load, and you have a large dataset</li>
</ul>
<h3 id="a-demo-with-maxmautnercom-data">A demo with maxmautner.com data</h3>
<ul>
<li>Querying using Athena - forthcoming….</li>
<li>Querying using Redshift - forthcoming….</li>
</ul>
<p>Want me to complete the blog post? <a href="/about/">Let me know!</a></p>
Entry-Level Software Engineering QnA2018-05-04T07:32:13+00:00https://maxmautner.com/2018/05/04/entry-level<p>A close friend of mine who has no background in software engineering recently asked me a series of rapid-fire questions about how to get a foothold in a software engineering career.</p>
<p>Here’s their questions and my answers:</p>
<!--more-->
<h3 id="physical-bootcamp-or-online-course-if-bootcamp-which-bootcamp">Physical bootcamp or online course? If Bootcamp, which bootcamp?</h3>
<p>Well, let’s review your alternatives: you could apply for jobs right now–with whatever programming knowledge you have.</p>
<p>The worst they can do is say “no”–the absolute minimum they’ll do is give you very explicit, direct guidance about how you can come back next time with a better shot at getting the job</p>
<ul>
<li>Would having proof that you’ve learned with Python have helped?</li>
<li>Are there non-“engineer” job titles that will help you get in the door and on the track to leap-frogging to an “engineer” job title after this one?</li>
</ul>
<p>I’m dodging the question, but online/physical bootcamps are chasing your money.</p>
<p>Unless they can prove that they’ll place you into a job and have a track record that proves it, I would be skeptical that they can do anything for you that you can’t do yourself.</p>
<p>When it comes to paid online content, spend 5 more minutes on Google trying to find a free version of what the paid online content advertises offering you.</p>
<p>You will be blown away at how much free content there is.</p>
<p>Go to <a href="https://reddit.com/r/programming">Reddit</a>, <a href="https://stackoverflow.com/">StackOverflow</a>, <a href="https://www.quora.com/">Quora</a>, and jobs listings to get a sense for what the job market is looking to pay people for knowing.</p>
<h3 id="which-languages-to-start-with">Which languages to start with?</h3>
<p>Totally depends on what you discover you would like to work on.</p>
<ul>
<li>Frontend development? JavaScript.</li>
<li>Backend development? Python is a great, easier to learn language.</li>
</ul>
<h3 id="i-looked-up-frontend-vs-backend-and-frontend-seems-much-more-interesting-to-me--backend-seems-a-little-dull---is-this-the-case--with-frontend-you-get-to-see-a-pretty-visual-of-what-youve-created-right--python-is-backend">I looked up frontend vs backend and frontend seems much more interesting to me. Backend seems a little dull - is this the case? With frontend you get to see a pretty visual of what you’ve created right? Python is backend?</h3>
<p>Your intuition is right—frontend you get to see visual results very quickly, although there is some tediousness to the work after a while as much of the work can come down to your site looking right on iPhone but not on Android—that type of thing. Frontend also can encompass making native mobile iOS and Android apps (not websites) and building their user interfaces. This can be a good route—usually starting with specializing in one of the two (iOS or Android).</p>
<p>That being said, I think building native mobile apps is harder than building websites (to start with). Anyone hiring for iOS/Android apps will definitely want to see/listen to you describe what you’ve worked on before—worth looking into what that process looks like! And perhaps reaching out to people in your network who do that to find out what their day-to-day looks like</p>
<h3 id="how-much-experience-do-you-really-need">How much experience do you really need?</h3>
<p>To get a first engineering job?</p>
<h3 id="portfolio">Portfolio?</h3>
<p>Not tremendously helpful nor a requirement–references have a bigger effect on your getting the job.</p>
<h3 id="what-roles-to-apply-for">What roles to apply for?</h3>
<p>What companies do you want to work for? Send me a link to a jobs listings page and we can look at them together</p>
<h3 id="good-resource-for-getting-some-practice-to-see-if-its-something-id-enjoy">Good resource for getting some practice to see if it’s something I’d enjoy?</h3>
<p><a href="https://www.khanacademy.org/computing/computer-programming">Khan Academy</a> actually has some great stuff</p>
<p>Coursera/EdX tend to not be as good–professors are not super great at teaching skills that will be valuable on-the-job immediately</p>
<h3 id="developer-vs-engineer-vs-programmer">Developer vs Engineer vs Programmer?</h3>
<p>Developer and programmer job titles tend to be paid a bit less engineer–not exactly sure why.</p>
<h3 id="what-is-full-stack--most-versatile">What is full stack? Most versatile?</h3>
<p>It just means “familiar with multiple software technologies”–e.g. you can make nice-looking webpages as well as store/retrieve data from a database, two very different engineering skills.</p>
<h3 id="do-you-need-to-be-good-at-math">Do you need to be good at Math?</h3>
<p>Nope. You really don’t–it only helps for a small segment of the software engineering job market.</p>
<h3 id="any-on-the-job-learning-opportunities-youve-heard-of">Any on the job learning opportunities you’ve heard of?</h3>
<p>DEFINITELY.</p>
<p>Don’t filter for job titles that have the word “engineer” in it–my first programming job was as a “technical analyst.”</p>
<p>I know tons of stories like this (of people being paid to learn to code in their job, but not necessarily as a “Software Engineer”).</p>
<p>A lot of job titles with “growth” in them will also pay you to learn to code.</p>
<p>Lots of things that can be automated and you can see immediate value from knowing how to code in that kind of role (since it’s your own time you are saving!).</p>
<h3 id="do-you-think-i-could-or-would-enjoy-coding">Do you think I could or would enjoy coding?</h3>
<p>Only one way to find out :) I think that you will</p>
<p>There’s usually an “ah-hah” moment when you build your first “thing”</p>
<p>It could be a webpage, it could be something that automatically updates SalesForce.</p>
<p>It’s pretty neat to realize what is possible once you aren’t relying on someone else to write software for you.</p>
<h3 id="when-applying-for-jobs-do-you-think-self-taught-is-less-valuable-to-employers-than-official-training">When applying for jobs, do you think self taught is less valuable to employers than “official” training?</h3>
<p>Self taught is <em>more</em> valuable to employers, under many circumstances—I’ll elaborate more in a little when I’m back at a keyboard</p>
<hr />
<p>If you’re interested to hear more about the topic of software engineering careers then check out the <a href="https://theaccidentalengineer.com/">interviews at the Accidental Engineer</a>, hosted by yours truly!</p>
Some more iPad weightlifting sketches2018-03-12T07:32:13+00:00https://maxmautner.com/2018/03/12/more-weightlifting<p>Like <a href="/2018/02/11/weightlifting-traces.html">last time</a>, some more sketches of my weightlifting teammates:</p>
<p><img alt="Jo and Jessie" src="/public/images/jo-and-jessie.gif" width="100%" /></p>
<p><img alt="Karina" src="/public/images/karina.jpg" width="100%" /></p>
Static Websites on Google Cloud2018-03-09T07:32:13+00:00https://maxmautner.com/2018/03/09/google-cloud-static-site-hosting<p>Goals:</p>
<ul>
<li><a href="#install-gsutil">install gsutil</a></li>
<li><a href="#create-bucket">create a bucket</a></li>
<li><a href="#push-files">upload your static site content to the bucket</a></li>
<li><a href="#setup-custom-domain">setup custom domain</a></li>
<li><a href="#access-logs">logging requests</a></li>
<li><a href="#query-logs">query access logs</a></li>
<li><a href="#setup-ssl">setup SSL on custom domain</a></li>
</ul>
<!--more-->
<h3 id="install-gsutil">Install gsutil</h3>
<p><a href="https://cloud.google.com/storage/docs/gsutil_install">Install <code class="highlighter-rouge">gsutil</code></a>, the Google Cloud command line tool:</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ curl https://sdk.cloud.google.com | bash
$ exec -l $SHELL
$ gcloud init
</code></pre></div></div>
<h3 id="create-bucket">Create “bucket”</h3>
<p>Created a bucket through the web interface, or using the <code class="highlighter-rouge">gsutil</code> command line tool:</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ gsutil mb gs://mentor.maxmautner.com
</code></pre></div></div>
<h3 id="push-files">Push files</h3>
<p><a href="https://www.youtube.com/watch?v=o1Go-2xv2JU">Set the bucket permissions & settings using <code class="highlighter-rouge">gsutil</code> instead of through the web console</a>:</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ gsutil acl ch -u AllUsers:R gs://mentor.maxmautner.com
$ gsutil defacl set public-read gs://mentor.maxmautner.com
$ gsutil web set -m index.html -e 404.html gs://mentor.maxmautner.com
</code></pre></div></div>
<p>Created a dummy index.html, 404.html file:</p>
<p>Upload the files to our bucket:</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ gsutil rsync -R ./ gs://mentor.maxmautner.com
</code></pre></div></div>
<p>Verify file uploaded:</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ gsutil ls -a gs://mentor.maxmautner.com
</code></pre></div></div>
<h3 id="setup-custom-domain">Setup Custom Domain</h3>
<p>Create a CNAME record for your subdomain (e.g. www) to point to <code class="highlighter-rouge">c.storage.googleapis.com.</code></p>
<h3 id="access-logs">Access Logs</h3>
<p><a href="https://cloud.google.com/storage/docs/access-logs">Setting up log delivery</a>:</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ gsutil mb gs://maxmautner-logs-bucket
$ gsutil acl ch -g cloud-storage-analytics@google.com:W gs://maxmautner-logs-bucket
$ gsutil defacl set project-private gs://maxmautner-logs-bucket
$ gsutil logging set on -b gs://maxmautner-logs-bucket -o mentor gs://mentor.maxmautner.com
</code></pre></div></div>
<p><a href="https://cloud.google.com/storage/docs/access-logs#status">Checking that logging is successfully setup for your bucket</a>:</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ gsutil logging get gs://mentor.maxmautner.com
{"logBucket": "maxmautner-logs", "logObjectPrefix": "mentor"}
</code></pre></div></div>
<p>Requests logs are created hourly (<a href="https://cloud.google.com/storage/docs/access-logs">source</a>)</p>
<p>I figured I would/should copy the official docs on this topic as this is critical information (March 10th 2018):</p>
<blockquote>
<p>Usage logs are generated hourly when there is activity to report in the monitored bucket. Usage logs are typically created 15 minutes after the end of the hour.</p>
</blockquote>
<blockquote>
<p>Note:</p>
<ul>
<li>Any log processing of usage logs should take into account the possibility that they may be delivered later than 15 minutes after the end of an hour.</li>
<li>Usually, hourly usage log object(s) contain records for all usage that occurred during that hour. Occasionally, an hourly usage log object contains records for an earlier hour, but never for a later hour.</li>
<li>Cloud Storage may write multiple log objects for the same hour.</li>
<li>Occasionally, a single record may appear twice in the usage logs. While we make our best effort to remove duplicate records, your log processing should be able to remove them if it is critical to your log analysis. You can use the s_request_id field to detect duplicates.</li>
</ul>
</blockquote>
<h3 id="query-logs">Query Logs</h3>
<p><a href="https://cloud.google.com/storage/docs/access-logs#queryBigQuery">Query access logs using SQL (BigQuery?)</a></p>
<p><a href="https://storage.googleapis.com/pub/cloud_storage_usage_schema_v0.json">Download this JSON manifest for mapping the log file format into BigQuery</a></p>
<p>Run this command to load our log files into the bigquery <code class="highlighter-rouge">usage</code> table::</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ bq load --skip_leading_rows=1 storageanalysis.usage gs://maxmautner-logs/* ./cloud_storage_usage_schema_v0.json
</code></pre></div></div>
<p>From the official docs:</p>
<blockquote>
<p>When using wildcards, you might want to move logs already uploaded to BiqQuery to another directory (e.g., gs://example-logs-bucket/processed) to avoid uploading data from a log more than once.</p>
</blockquote>
<p>For now, let’s not sweat it :)</p>
<p>Now open your SQL shell:</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ bq shell
> show storageanalysis.usage
Last modified Schema Total Rows Total Bytes Expiration Time Partitioning Labels kmsKeyName
----------------- ------------------------------- ------------ ------------- ------------ ------------------- -------- ------------
11 Mar 01:44:27 |- time_micros: integer 38 15518
|- c_ip: string
|- c_ip_type: integer
|- c_ip_region: string
|- cs_method: string
|- cs_uri: string
|- sc_status: integer
|- cs_bytes: integer
|- sc_bytes: integer
|- time_taken_micros: integer
|- cs_host: string
|- cs_referer: string
|- cs_user_agent: string
|- s_request_id: string
|- cs_operation: string
|- cs_bucket: string
|- cs_object: string
</code></pre></div></div>
<p>This is the schema of the table we can now query, for example:</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>> select cs_uri, count(*) from [storageanalysis.usage] group by cs_uri;
</code></pre></div></div>
<p>Will give us the number of requests grouped by the URI–including query parameters.</p>
<p>Stripping query parameters is left <a href="https://www.quora.com/What-is-the-most-ridiculous-example-of-the-proof-is-left-as-an-exercise-to-the-reader-in-a-mathematics-book">as an exercise for the reader</a>.</p>
<h3 id="setup-ssl">Setup SSL</h3>
<p><a href="https://cloud.google.com/appengine/docs/standard/python/securing-custom-domains-with-ssl">In order to use SSL on our Google Cloud Storage static site we need to use a load balancer</a>.</p>
<p><a href="https://cloud.google.com/compute/docs/load-balancing/http/adding-a-backend-bucket-to-content-based-load-balancing">Adding a Cloud Storage bucket to content-based load balancing</a></p>
<p><a href="https://www.youtube.com/watch?v=_o1d62KT-yo">Creating a load balancer</a></p>
<p>Options for obtaining a certificate:</p>
<ul>
<li>LetsEncrypt, <a href="https://github.com/certbot/certbot">certbot</a>–<a href="https://stackoverflow.com/questions/49217393/gsutil-copying-letsencrypt-domain-verification-not-working">is it even possible on Google Cloud?</a></li>
<li>paid SSL certificate vendor</li>
</ul>
Weightlifting sketches2018-02-11T07:32:13+00:00https://maxmautner.com/2018/02/11/weightlifting-traces<p>I am loving the iPad Pro + ProCreate app.</p>
<p>Here are some of my gym mates:</p>
<p><img alt="Laura" src="/public/images/laura.jpg" width="100%" /></p>
<p><img alt="Petar" src="/public/images/petar.png" width="100%" /></p>
Why use Docker locally?2018-01-22T07:32:13+00:00https://maxmautner.com/2018/01/22/why-docker<p>Reproducibility. Much of humanity’s problems with software comes down to reproducibility.</p>
<p><img src="/public/images/worked-for-me.png" alt=""It worked on my laptop" Syndrome" /></p>
<p>For example, let’s say a customer of yours encounters a bug when using your software. In order to fix the bug you’ll need to identify how to reproduce it so you can verify that a fix you come up with makes the bug <em>no longer reproducible</em>. That is inherently what <em>solving a bug means!</em></p>
<!--more-->
<p>The ideal software development environment strives for “dev-prod parity”—short for “development-production parity.” <sup id="fnref:1"><a href="#fn:1" class="footnote">1</a></sup></p>
<p>If your production environment behaves differently than your development environment, then <strong>how do you know the code that works on your laptop will work in production?</strong> By eliminating room for deviations between your environments you reduce cases of “it-worked-on-my-laptop.”</p>
<p>Another illustrative example of this problem of reproducibility in software is that your coworkers (or contractors) who are trying to contribute to your software might have to follow a 6-page document about how to setup their laptop on their first day on the job! What if your contractor has a Windows laptop and you have a Mac laptop? Good GRIEF! Isn’t software supposed to automate this process??</p>
<p>Docker is one solution to both these scenarios (bug-fixing, local development). It eliminates deviations between your development and production environments because it offers a <em>standard</em> for how to package together an operating system + 3rd party dependencies + your own source code—that can be ran from any Docker-supported operating system. <sup id="fnref:2"><a href="#fn:2" class="footnote">2</a></sup></p>
<div class="footnotes">
<ol>
<li id="fn:1">
<p><a href="https://12factor.net/dev-prod-parity">“Dev-Prod Parity” & The Twelve-Factor App</a> <a href="#fnref:1" class="reversefootnote">↩</a></p>
</li>
<li id="fn:2">
<p><a href="https://www.docker.com/community-edition">Operating systems with Docker clients: Community Edition</a> <a href="#fnref:2" class="reversefootnote">↩</a></p>
</li>
</ol>
</div>
Static Site Hosting on AWS2018-01-16T07:32:13+00:00https://maxmautner.com/2018/01/16/static-site-hosting-on-aws<p>Exciting times on the Internet–costs of hosting are as low as every yet people find ways to spend more money than ever on hosting.</p>
<p>I myself host <a href="https://maxmautner.com/">maxmautner.com</a> on AWS with a simple combination of their services for <$0.10/month.</p>
<p>Here’s how it works:</p>
<p><img src="/public/images/aws-static-site-hosting.png" alt="Static Site Hosting on AWS drawing" /></p>
The Net Present Value of Content2017-12-17T10:32:13+00:00https://maxmautner.com/2017/12/17/net-present-value-of-content<p>In order to reflect on the value of content (audio, video, images, text), we’ll take a short tutorial in how to estimate the value of a business.</p>
<p>Too impatient? <a href="#the-value-of-content">Jump to estimating the value of content.</a></p>
<h3 id="the-value-of-a-business">The Value of a Business</h3>
<p>The concept of “net-present value” is at the center of global finance.</p>
<p>Imagine that you have a business that makes these revenues over 4 years:</p>
<table>
<thead>
<tr>
<th>Year</th>
<th style="text-align: right">Revenue</th>
<th style="text-align: center">Years in Business</th>
</tr>
</thead>
<tbody>
<tr>
<td>2017</td>
<td style="text-align: right">$100</td>
<td style="text-align: center">0</td>
</tr>
<tr>
<td>2018</td>
<td style="text-align: right">$200</td>
<td style="text-align: center">1</td>
</tr>
<tr>
<td>2019</td>
<td style="text-align: right">$100</td>
<td style="text-align: center">2</td>
</tr>
<tr>
<td>2020</td>
<td style="text-align: right">$0</td>
<td style="text-align: center">3</td>
</tr>
</tbody>
</table>
<p><img src="/public/images/revenue.jpg" alt="Chart of Revenue" /></p>
<p>Why no more revenues in 2020? Let’s say we go out of business in the 4th year :)</p>
<p>All businesses’ revenues <em>eventually</em> go to zero as markets trend towards perfect competition over time.</p>
<p>If I asked you how much our company is worth you might say “this is easy: <code class="highlighter-rouge">$100 + $200 + $100 = $400</code>–our business should be worth $400!”</p>
<p>It’s not that simple :)</p>
<!--more-->
<p>The catch is that the value of $100 in 2 years from now is <em>less</em> than the value of possessing $100 today.</p>
<p>What if you had $100 today and were able to lend it to someone at a non-zero, positve rate of interest (let’s say 1% per year)?</p>
<p>That $100 in 2 years from now would be more than $100:</p>
<p><code class="highlighter-rouge">$100.00 * 1.01 * 1.01 = $102.01</code></p>
<p>The math works in reverse as well, by dividing the numbers from the amount of money we make in a future year ($100 in 2019):</p>
<p><code class="highlighter-rouge">$100.00 (in 2019) / (1.01 ^ (2019 - 2017)) = $100 / (1.01 x 1.01) = $98.03</code></p>
<p><code class="highlighter-rouge">$98.03</code> is what is called the <em>net-present value</em> of <code class="highlighter-rouge">$100</code> in 2019, assuming an interest rate of <code class="highlighter-rouge">1%</code>.</p>
<p>So a crude financial model to value the business off of the net-present value of its future revenues would be:</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$100
$200 / 1.01
$100 / (1.01^2)
= $396.05
</code></pre></div></div>
<p>As you can imagine, that <code class="highlighter-rouge">1%</code> interest rate is imporant–it has a huge effect on our estimate of the business’s value!</p>
<p>Consider if we could lend our $100 we make in 2017 at a <code class="highlighter-rouge">3%</code> interest rate instead of <code class="highlighter-rouge">1%</code>:</p>
<p><code class="highlighter-rouge">$100.00 * 1.03 * 1.03 = $106.09</code></p>
<p>While we’ve estimated the value of a fictional business, this methodology is used in reality–by Goldman Sachs, JP Morgan Chase.</p>
<p>It’s even used by executives at tech companies who are seeking to sell their businesses and cash out for the big bucks!</p>
<hr />
<h3 id="the-value-of-content">The Value of Content</h3>
<p>The value of a business is a lot like the value of a piece of content.</p>
<p>Two reasons:</p>
<ol>
<li>the number of times that a piece of content is seen or listened to is roughly proportional to the revenue of a business</li>
<li>like a business whose revenue goes to zero, the views that our YouTube video gets will eventually go to zero over time</li>
</ol>
<p>To illustrate, we might have a YouTube video with the following forecasted number of views:</p>
<table>
<thead>
<tr>
<th>Year</th>
<th style="text-align: right">Views</th>
<th style="text-align: center">Time Delta (years)</th>
</tr>
</thead>
<tbody>
<tr>
<td>2017</td>
<td style="text-align: right">1,000</td>
<td style="text-align: center">0</td>
</tr>
<tr>
<td>2018</td>
<td style="text-align: right">2,000</td>
<td style="text-align: center">1</td>
</tr>
<tr>
<td>2019</td>
<td style="text-align: right">1,000</td>
<td style="text-align: center">2</td>
</tr>
<tr>
<td>2020</td>
<td style="text-align: right">0</td>
<td style="text-align: center">3</td>
</tr>
</tbody>
</table>
<p><img src="/public/images/views.jpg" alt="Chart of Views" /></p>
<p>So how do we determine the “interest rate” at which we can <em>“lend out”</em> an impression today versus an impression two years from now?</p>
<p>Great question–I’m not sure.</p>
<p>But I’d conservatively estimate that the interest rate of content is as high as 50% per year–with the advent of the internet people’s attention has become a finite commodity and we are in the midst of a massive landgrab for <em>brand awareness</em>.</p>
<p>Adopting my estimated interest rate for the sake of though experiment we can estimate the value of making and publishing your video today:</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>1000
2000 / 1.50
1000 / (1.50^2)
2777 views
</code></pre></div></div>
<p>However if you were to wait a year to publish your video, the net-present value of those 4000 views would be:</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>1000 / 1.50
2000 / (1.50^2
1000 / (1.50^3)
1851 views
</code></pre></div></div>
<p>That’s <code class="highlighter-rouge">2777 - 1851 = 926</code> views or 33% less views in terms of the <em>net-present value</em> of those views!</p>
<p>My point is…get off your ass and publish your content!</p>
<p>You will be leaving your competitors in the dust, and by churning out content you’ll start down the road to learning <strong>what is good content</strong>!</p>
<p>Improving the quality of your content will increase the number of views your content receives over its lifetime–which pays even more dividends by virtue of the <em>net-present value of those views</em>.</p>
<p>And if you have any ideas about how to estimate the interest rate of content, <a href="/about/">please get in touch</a>!</p>
<p>Interested?</p>
<p>We’re working on these hard problems–<a href="https://theaccidentalengineer.com/careers/">come and help us make videos for software engineers</a>!</p>
Information Asymmetries and Paying it Forward2017-12-15T10:32:13+00:00https://maxmautner.com/2017/12/15/information-assymetries-and-paying-it-forward<p>The Internet and the scale of transparency it has brought to human civilization has changed everything.</p>
<p>Near-free information flow between all humans on earth has brought light to the corners of the earth where human-on-human atrocities have been performed for millenia.</p>
<p>Light being shown on evil acts is a pre-requisite to justice being served.</p>
<!--more-->
<p>One of my favorite quotes is from <a href="https://quoteinvestigator.com/2012/11/15/arc-of-universe/">a Civil War-era abolitionist</a>:</p>
<blockquote>
<p>Look at the facts of the world. You see a continual and progressive triumph of the right. I do not pretend to understand the moral universe, the arc is a long one, my eye reaches but little ways. I cannot calculate the curve and complete the figure by the experience of sight; I can divine it by conscience. But from what I see I am sure it bends towards justice.</p>
</blockquote>
<blockquote>
<p>Things refuse to be mismanaged long. Jefferson trembled when he thought of slavery and remembered that God is just. Ere long all America will tremble.</p>
</blockquote>
<p><img src="/public/images/theodore-parker.jpg" alt="Theodore Parker" /></p>
<p>I agree–and there are <a href="https://www.edge.org/conversation/mc2011-history-violence-pinker">empirical signs</a> that Theodore Parker is right.</p>
<p>However there is another type of injustice that becomes more pervasive and harder to eliminate than physical violence.</p>
<p>This is a type of injustice caused by the existince of “information asymmetries.”</p>
<p>An information asymmetry is where two parties to a transaction do not have the same factual information on hand.</p>
<p>A great example is purchasing a car:</p>
<ul>
<li>The salesperson knows what they paid for the car last week (and all sales made at their car dealership in the past month).</li>
<li>The buyer does not know any of that information–he or she knows what the car’s advertised prices is and what comparable cars on the lot are being priced at.</li>
</ul>
<p>The salesperson preys on the buyer’s ignorance and obtains an immmoral advantage in negotiation:</p>
<p><img src="/public/images/asymmetric-info.png" alt="Asymmetric Information" /></p>
<p>I believe that eliminating this type of information asymmetry will become the next piece of the “arc” towards justice.</p>
<p>Education in its various forms has helped me out of more predatory situations than I can count.</p>
<p>For this reason I try to <a href="https://www.youtube.com/user/maxmautner/videos">share information that I’ve learned</a> (and <a href="https://theaccidentalengineer.com/">solicit it from others</a>) to pay it forward.</p>
<p>You don’t have to be a formal K-12 school teacher, but please, pay it forward!</p>
Tumblr to Jekyll2017-07-20T10:32:13+00:00https://maxmautner.com/2017/07/20/tumblr-to-jekyll<p>Since migrating <a href="https://maxmautner.com/">my site</a> from <a href="https://www.tumblr.com/">Tumblr</a> to <a href="https://jekyllrb.com/">Jekyll</a>, I found it difficult to convert all of the URLs and preserve the post contents.</p>
<p>I used this janky <a href="http://import.jekyllrb.com/docs/tumblr/">Tumblr exporter to Jekyll-style markdown</a>, that left much to be desired.</p>
<p>Apologies for those of you trying to access these posts that no longer exist!</p>
<p>If you’re still curious about who I am and what I’m interested in (and how to get ahold of me)
check out <a href="/about">my “about me” page</a>.</p>
The Accidental Engineer2017-07-15T10:32:13+00:00https://maxmautner.com/2017/07/15/the-accidental-engineer<p>tl;dr: I’ve started a new project called <a href="https://theaccidentalengineer.com/">The Accidental Engineer</a>.</p>
<p>I plan on writing a lengthier explanation for what it is and why I’m doing it, but that will have to wait.</p>
<p><a href="https://theaccidentalengineer.com/"><img src="/public/images/tae.png" alt="The Accidental Engineer" /></a></p>
Generative Text Models2016-12-25T13:02:41+00:00https://maxmautner.com/2016/12/25/generative-text-models<p>Here are a couple Google blogposts from the last year that are indicative of the future of text-based communication:</p>
<ul>
<li><a href="https://research.googleblog.com/2015/11/computer-respond-to-this-email.html">Smart Reply</a></li>
<li><a href="https://research.googleblog.com/2016/05/chat-smarter-with-allo.html">Allo</a></li>
</ul>
<p>Additional links:</p>
<ul>
<li><a href="http://karpathy.github.io/2015/05/21/rnn-effectiveness/">The Unreasonable Effectiveness of Recurrent Neural Networks</a></li>
<li><a href="https://arxiv.org/abs/1409.3215">Sequence to Sequence Learning with Neural Networks</a></li>
<li><a href="http://colah.github.io/posts/2015-08-Understanding-LSTMs/">Understanding LSTM Networks</a></li>
<li><a href="https://www.slideshare.net/SessionsEvents/anjuli-kannan-software-engineer-google-at-mlconf-sf-2016">Smart Reply: Learning a Model from Conversational Data</a></li>
</ul>
github-email-thief2015-12-28T01:13:31+00:00https://maxmautner.com/2015/12/28/github-email-thief<p>Github (and Bitbucket as well) expose the vast majority of their users’ email addresses via commit metadata.</p>
<p>As a proof-of-concept, I made a single page app using Angular + the Github API to demonstrate how browse-able/scrape-able this contact information is.</p>
<p><a href="http://github.maxmautner.com/">Live demo here.</a></p>
<p><img src="/public/images/github-email.png" alt="Github Email Thief" /></p>
<p>You can check <a href="http://github.maxmautner.com/search/users">if your Github username is affected</a>.</p>
<p>You can read about <a href="https://help.github.com/articles/setting-your-commit-email-address-on-github/">how to hide your email address here</a>.</p>
<p>The project is non-commercial and MIT-licensed.</p>
Make Your Own Gmail2015-12-24T04:42:55+00:00https://maxmautner.com/2015/12/24/make-your-own-gmail<p>I made a frontend for Gmail prototype called “<a href="https://github.com/mmautner/make-your-own-gmail">make-your-own-gmail</a>”, that can be skinned as you see fit.</p>
<p><img src="/public/images/make-your-own-gmail.png" alt="Make Your Own Gmail" /></p>
<p>I hope this might help you wrap your minds around single page apps, and also <em>empower you to believe that you can improve email even if you aren’t employed by Google or a major email provider</em>.</p>
<p>It’s entirely AngularJS, using <a href="https://developers.google.com/api-client-library/javascript/start/start-js">the Google JavaScript SDK for Gmail</a>.</p>
<p>If you’d like to host this at your own domain you’ll need to obtain a Google Developer’s key from the Developer’s Console.</p>
<p>I’d also highly recommend that you host it over HTTPS.</p>
<p><em>NB</em>: email composition “kind of” works–there is some road to cover if you want to reproduce <em>all</em> of the features available to users at mail.google.com.</p>
Modern anti-spam and E2E crypto2015-12-22T22:15:18+00:00https://maxmautner.com/2015/12/22/messaging-modern-anti-spam-and-e2e-crypto<p>Critical insight into the anti-spam and abuse efforts at Google:</p>
<blockquote>
<p><a href="https://moderncrypto.org/mail-archive/messaging/2014/000780.html">“[messaging] Modern anti-spam and E2E crypto”</a></p>
</blockquote>
<p>It is rare to hear from the horse’s mouth.</p>