<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://tiffanyqian.github.io/blog/feed.xml" rel="self" type="application/atom+xml" /><link href="https://tiffanyqian.github.io/blog/" rel="alternate" type="text/html" /><updated>2026-04-05T19:26:22+00:00</updated><id>https://tiffanyqian.github.io/blog/feed.xml</id><title type="html">figs &amp;amp; figures</title><subtitle>o_O</subtitle><author><name>Tiffany Qian</name></author><entry><title type="html">Recent Puzzle Finds</title><link href="https://tiffanyqian.github.io/blog/20260401-recent-puzzle-finds.html" rel="alternate" type="text/html" title="Recent Puzzle Finds" /><published>2026-04-01T00:00:00+00:00</published><updated>2026-04-01T00:00:00+00:00</updated><id>https://tiffanyqian.github.io/blog/recent-puzzle-finds</id><content type="html" xml:base="https://tiffanyqian.github.io/blog/20260401-recent-puzzle-finds.html"><![CDATA[<p>They’re always asking me “do you have games on your phone” but they’re never asking me “HOW are the games on your phone”!! The answer: it’s puzzles all the way down. Aside from NYT games, ken-ken’s, and zachtronics solitaire, I’ve found some other fun puzzles lately that I wanted to share!</p>

<h4 id="minesweeper-plus"><a href="https://jorel-simpson.itch.io/minesweeper-plus">MINESWEEPER PLUS</a></h4>
<!-- ![image-left](https://img.itch.zone/aW1hZ2UvMzY4MDI3OC8yMTg5NzQ4MS5wbmc=/original/9UUR3X.png){: .align-left} -->
<p>Another fun minesweeper variant! It’s pay what you want on itch.io and very scalable in difficulty. The boss fights with the 9 and 10 mine squares are very creative. The stages themselves are also pretty creative in design too- as you get up in difficulty, the board becomes all different sorts of non-quadrilateral shapes. This does mean there it becomes more RNG based, as you may have to guess a lot on the segmented stages.</p>

<p>Unfortunately, I can’t play this (frequently) anymore because the boss fights throw me into an IRL rage.</p>

<h4 id="cryptic-sudokus"><a href="https://www.youtube.com/c/CrackingTheCryptic">Cryptic Sudokus</a></h4>
<p>Recommended to me by Michael! The two British (?) guys behind “Cracking the Cryptic” Youtube channel are so unbelivably cracked and they kind of do anything from crosswords to crazy puzzles. The sudoku variants are the main focus here- . We played so much of this around the holidays- they can range from easy to insanely hard but they’re so addicting to do.
Here are some of my favorite puzzles:</p>
<ul>
  <li><a href="https://sudokupad.app/1ru4mm2uq3">Minesweeper Sudoku</a></li>
  <li><a href="https://sudokupad.app/uojuxaw1qw">Space Invaders</a></li>
  <li><a href="https://sudokupad.app/bg5cxr23it">Cookie Crime Pt. 2</a></li>
</ul>

<h4 id="full-circle-friday"><a href="https://fullcirclefriday.com/">Full Circle Friday</a></h4>
<p>For anyone who enjoys doing the NYT connections- it’s that but crazier! 6 words, every word is connected to two other words via two different categories, and you have to find the “circle” of connections. Then once you get that, there’s a super special secret word (the omnigram) that fits every category. Granted, because each “category” only has 2 words, sometimes it’s quite a stretch. Nonetheless, still super fun and VERY creative</p>

<h4 id="catfishing"><a href="https://catfishing.net/">catfishing</a></h4>
<p>Guessing wikipedia articles by tags! I love this concept but I am too dumb to play it frequently- I think my all-time best is like a 4/10 :’)</p>

<h4 id="cryptickle"><a href="https://cryptickle.com/">cryptickle</a></h4>
<p>Another game recommended to me by Michael. Mini Cryptics for beginners! This has been pretty fun as I’m still learning the indicators and intricacies of cryptics.</p>

<h4 id="orbits"><a href="https://jaimes.games/orbits/">orbits</a></h4>
<p>Reverse minesweeper from the same guy who made cryptickle! Pretty easy but a fun thing to do to pass the time.</p>]]></content><author><name>Tiffany Qian</name></author><category term="posts" /><category term="games" /><category term="puzzles" /><category term="opinions" /><summary type="html"><![CDATA[They’re always asking me “do you have games on your phone” but they’re never asking me “HOW are the games on your phone”!! The answer: it’s puzzles all the way down. Aside from NYT games, ken-ken’s, and zachtronics solitaire, I’ve found some other fun puzzles lately that I wanted to share!]]></summary></entry><entry><title type="html">Books and Reviews - 2026 Q1</title><link href="https://tiffanyqian.github.io/blog/20260330-q1-book-reviews.html" rel="alternate" type="text/html" title="Books and Reviews - 2026 Q1" /><published>2026-03-30T00:00:00+00:00</published><updated>2026-03-30T00:00:00+00:00</updated><id>https://tiffanyqian.github.io/blog/books-and-reviews</id><content type="html" xml:base="https://tiffanyqian.github.io/blog/20260330-q1-book-reviews.html"><![CDATA[<p>I’ve read a lot at the start of this year! Yippee literacy! Shout out StoryGraph, you are the coolest thing ever. I love data collection.</p>

<p>Anyways- in an attempt to regain creativity and my ability to better communicate my feelings/thoughts outside of “vibes”, I have been really trying to critically reflect on what I consume entertainment wise. On the reading side, this has resulted in writing book reviews! Here’s what I’ve read / reread in Jan-March of 2026 so far:</p>

<h2 id="new-reads">NEW READS</h2>

<h4 id="the-night-circus-by-erin-morgenstern--35--5-stars"><strong>The Night Circus</strong> by Erin Morgenstern – <em>(3.5 / 5 Stars)</em></h4>
<p><img src="https://cdn.thestorygraph.com/zxx9wgz76k4e9jqvotukpb28btsr" alt="image-left" class="align-left" />
I got this book in a white elephant book exchange. I was a little skeptical of the romance/YA vibes, but Tara said I would like it, and I mostly did!</p>

<p>dreamy &amp; fun! i think it’s a shame that the book markets itself so heavily on the Celia / Marco love story front- the emphasis on that almost lost me in the middle, but i came back around on it a little at the end. what i actually ended up finding most meaningful were the relationships between the wider cast and how the circus both tied people together and changed them. the non linear story telling, changing perspectives, and the love for dreaming (for lack of better words) that many characters in the story inspire in each other and the world give the book a nice ambience that slowly unfolds as you read.</p>

<h4 id="blindsight-by-peter-watts--425--5-stars"><strong>Blindsight</strong> by Peter Watts – <em>(4.25 / 5 Stars)</em></h4>
<p><img src="https://cdn.thestorygraph.com/7h3xyocxvr9bc1ty2qv3c5braehi" alt="image-left" class="align-left" />
loved it- a book heavy with psychology and consciousness explored through aliens, body/biological horror, and high-functioning autism. what happens when you are forced to explain the unexplainable? what is the difference between communicating and understanding? siri’s very role as a “synthesist” is a delicious way to explore these questions, and the story as a whole is a played out discussion of our understanding of otherness and humanity. there are lots of horrors both within and beyond my comprehension. shoutout space vampires- it’s so silly but still taken seriously as a concept.</p>

<p>in the end, maybe the real siri keeton was the friends we made along the way</p>

<h4 id="the-language-of-the-night-essays-on-fantasy-and-science-fiction-by-ursula-k-le-guin--5--5-stars"><strong>The Language of the Night: Essays on Fantasy and Science Fiction</strong> by Ursula K. Le Guin – <em>(5 / 5 Stars)</em></h4>
<p><img src="https://cdn.thestorygraph.com/vokvbutw22w78witeox4axj4qnfn" alt="image-left" class="align-left" />
Ursula Le Guin, the woman that you are!!</p>

<p>I think the greatest strength in these essays is that Le Guin speaks both passionately and academically. She presents her arguments with humor and eloquence in a way that just… makes sense. Not that the ideas are shallow or there aren’t words I had to look up- but Le Guin has a way of putting words to the things that are so intuitive that I have never had the right words to explain without dipping into sentimentality and emotion.</p>

<p>I wish I had a more cohesive overview to give as a review or hook, but there’s a lot to chew on in these essays that can’t be easily shared without dumping my 50+ highlights. I’m sure I will be rereading these for years to come and will still find new takeaways.</p>

<p>As of my first read through, I have only in the past year read “A Wizard of Earthsea” despite meaning to read anything by Le Guin for years. While I’m sure that having read the works she mentions in these essays would have made them more meaningful, I think that these essays do stand on their own if you’re willing to give them the chance. If you love sci-fi and fantasy, if you love art, and if you want to better understand why these stories call to you, there is all that and more in these essays along with some essays on otherness and intersectional feminism. Some ideas do get repeated pretty exactly between essays, but that is just the nature of compiling years of writing, speeches, and introductions on a topic in one place.</p>

<h2 id="re-reads">RE-READS</h2>
<h4 id="a-thousand-nights-by-ek-johnston--4--5-stars"><strong>A Thousand Nights</strong> by E.K. Johnston – <em>(4 / 5 Stars)</em></h4>
<p><img src="https://cdn.thestorygraph.com/e44htrvoq5pxjfg301k44l9nc3i5" alt="image-left" class="align-left" /></p>
<blockquote>
  <p>“The story will mean different things to every person who hears it. That is how she meant for it to be. I can tell you of the meaning I found, the new purpose and direction for my life, but it will be nothing to you if you do not understand why she told it in the first place.”</p>
</blockquote>

<p>a feminist retelling of a thousand and one nights with mystical elements, strength in community, and the unseen labor/power of women. i first read this book in middle school and loved it. while i’ve reread it many times and found flaws since, the story is still very comforting to me.</p>

<p>i’ve seen so many complaints about the writing style…. do NOT read this if you’re looking for a romance or a typical YA story- you’d be doing the book AND ME a horrible injustice. the prose is passive but very pretty, and it will bore you if you aren’t the type of person to enjoy it. personally, i like that aside from the king, no one, not even our main character is ever named. i think it’s the whole point, actually. women in patriarchal societies are invisible, and so is she. she is any girl, truly, in all her strength and love. there’s a lot of symbolism and things left unsaid, but if you take your time, you’ll find that that’s all that matters.</p>

<h4 id="the-emperors-soul-by-brandon-sanderson--5--5-stars"><strong>The Emperor’s Soul</strong> by Brandon Sanderson – <em>(5 / 5 Stars)</em></h4>
<p>(no image- it’s busting the html for some reason)</p>

<p>my all time brandy sandy rec- great world building and intrigue despite the novella length.</p>

<h2 id="currently-reading">Currently Reading</h2>
<ul>
  <li><strong>A Gentleman in Moscow</strong> by Amor Towles, buddy reading with Wanjiku</li>
  <li><strong>I Am Legend</strong> by Richard Matheson, buddy reading with Chloe</li>
</ul>

<p>Excited to finish these and write about them!! I’m liking both so far even though they’re very different vibes.</p>

<p>I’m also quite liking this format :) Maybe I’ll go back and backlog reviews for books I read in 2025.</p>]]></content><author><name>Tiffany Qian</name></author><category term="posts" /><category term="book reviews" /><category term="reading" /><category term="opinions" /><summary type="html"><![CDATA[I’ve read a lot at the start of this year! Yippee literacy! Shout out StoryGraph, you are the coolest thing ever. I love data collection.]]></summary></entry><entry><title type="html">Film Dump [20260323]</title><link href="https://tiffanyqian.github.io/blog/20260323-sf-film.html" rel="alternate" type="text/html" title="Film Dump [20260323]" /><published>2026-03-23T00:00:00+00:00</published><updated>2026-03-23T00:00:00+00:00</updated><id>https://tiffanyqian.github.io/blog/film-dump</id><content type="html" xml:base="https://tiffanyqian.github.io/blog/20260323-sf-film.html"><![CDATA[<p><strong>Life in SF + France Trip, August 2025 - March 2026</strong></p>

<p><em>Shot on Pentax Zoom 60x with Kodak Gold 200</em></p>

<figure class="half ">
  
    
      <img src="https://lh3.googleusercontent.com/pw/AP1GczMba4hQmRwJfGiZVGcP5VwBQL_9EzVcuU3Qv1sdgG_fWKqYAS91xt_D-aKlUl7JhJKel8hwBklFgpQ2Z9cj0QoDrU4RNk18mZHUBSD0jXg5TBuUPnqy55U02FBPRrc86v_l7EY-494-BtHdWZ1Z30JB=w627-h945-s-no-gm?authuser=0" alt="FILM 000" />
    
  
    
      <img src="https://lh3.googleusercontent.com/pw/AP1GczNYC8hCK9KI98jyWgvXWloKKXbwEizSo5_6JRXiyLNGFyTH2qCTTbJ_Z-8hEtxsOblhhmV99uORZm4YKvi7d2ozj-V4CCn_fYuEJN6N9hQMIw-aHLRHq4xhfJ6WxhoWfCc2_9HwzLGkulHVLSwU9Qwp=w627-h945-s-no-gm?authuser=0" alt="FILM 000" />
    
  
    
      <img src="https://lh3.googleusercontent.com/pw/AP1GczMMserM3zW_jEK060rTqPc_idjp3oVaOyh_ziQFYQTy05iSvcd5cYhb9qrRGNCb3lNNkAR2PFVRQtAuLf-kxcMgPcU8szCBDmTJQ71gnhyQtdTqfZMYOa8wdhgxbYMQHzZC0CLUX8GZ_ZWBqmnRLTNr=w627-h945-s-no-gm?authuser=0" alt="FILM 000" />
    
  
    
      <img src="https://lh3.googleusercontent.com/pw/AP1GczPk6xfiJWD8rE8am9-dBawUZdmTRODICrGuDQdh8s2UFfw3GKmrfkfQf3z18XAdL42oGtpdmmMP_Baqi7FGMIKI2HD_VvSjTgZI3CI9g_qUPHktjzwZ_bKd4c6PoV5IOABvF__uo2ka4L23UpWTigmG=w627-h945-s-no-gm?authuser=0" alt="FILM 000" />
    
  
    
      <img src="https://lh3.googleusercontent.com/pw/AP1GczOzFYE9VRU047qJeKn2xdNds-P-eFPXHDn0m8uEWyEyJCzps2F4ejwsVY63-A-Wm6X3h5u6elB18Pc0LDmOSiWdnSBOl0qOtA64bzhgdB-9mco0HQq3ysVssfmN9nOUDowCv9Aue67VHuGtOfLaLSkD=w627-h945-s-no-gm?authuser=0" alt="FILM 000" />
    
  
    
      <img src="https://lh3.googleusercontent.com/pw/AP1GczONXuHD8rScmWuERovtPOe2TLBwHHRHLrvwSk4ghHKfnB-D0hUxkmQAWa_0wzsN9t1xaF3bDHD3jPIegJ4YTMWjBWD_PEve6xc5pv_l9MlRHJy4ml9SleinGwrWeBnKlN7-KEUo8Uzeoe9o_m4DqPm8=w627-h945-s-no-gm?authuser=0" alt="FILM 000" />
    
  
    
      <img src="https://lh3.googleusercontent.com/pw/AP1GczPfDcDqLsq1-KmIWjsiv0oKyqAJkWmQgOTRP7UZoZ6sIp9gxwnCwKYEpF9hHoF1AXjwrAW_tFp59Bzt8Zey7OEh1QDYhkehxylT6zdA90ZOxo7feQOmZGVEWr8Ky5geDypxIosdUoqZyA3T813CF-0P=w957-h635-s-no-gm?authuser=0" alt="FILM 000" />
    
  
    
      <img src="https://lh3.googleusercontent.com/pw/AP1GczOeTVKMzxfrigcs-QCGIxSU4wrjmIAgXx8Q1fwueBaE-YG8yoOa2yZQeHGXXgkyDcGa_1wSeRHukwyaxnZAQ4RYI-5C6fUSPlXhDgr-dhoKK8LVxpvbNlYHSuMjpez7BSARcn0ZRJdM30UcyO5dQ9L4=w957-h635-s-no-gm?authuser=0" alt="FILM 000" />
    
  
    
      <img src="https://lh3.googleusercontent.com/pw/AP1GczPea8uQFmnG6hPlrCU6FdIO4sN_2-fTperS-4MLsvmgQ6IQGGm9BFcE66_7mlyl6dt07LOkHgqUj3qjr9kbGvJjx81LK3Z6RYwKPjtKIa8WVzYl0lU0YCwhfVZO58pGMX9-0Bl2UJny9h0iwseWnx2s=w957-h635-s-no-gm?authuser=0" alt="FILM 000" />
    
  
    
      <img src="https://lh3.googleusercontent.com/pw/AP1GczPktW2qxZ9_FZnx4nGDQVe59wGidt7dhC6BSKz4QJaEbk9hTrfyErkSrJ4ZVz4fa0YzJ4E5w9ETbysGVZoMrfWjZ0fUap9NFNkH5LXZmx60O9WWqlDG9sqT5wPcvfDTda7xrNaiz7sEI_KCrIX4MQtD=w957-h635-s-no-gm?authuser=0" alt="FILM 000" />
    
  
    
      <img src="https://lh3.googleusercontent.com/pw/AP1GczPuFN_wvleDKuzqmQx7yS_nixU3WTvj9tLIE5_Ye4322umyLghpJnvI_TzZo1REely5BqJ5tTFtIsdDVli7zph006OnRkDADZ6qVUPpdjO65CRGov3AdViXcb5Jr0nTuSJ0NdPfl_y5kez67RHXtDrD=w957-h635-s-no-gm?authuser=0" alt="FILM 000" />
    
  
    
      <img src="https://lh3.googleusercontent.com/pw/AP1GczPlELeEGSwn_c9mgSLqByAkRAEPxNSijitDH0vRNK47Vrd9xvWxJd_7hABg6ETYf5NgBA5NfwX4GFftgPJf9V2gHR3wFVR9YplYfdlidwQUErtCPkHW_s1WAlMSe4hy3MnChXlQgsL0ErZ--3HTlQ09=w957-h635-s-no-gm?authuser=0" alt="FILM 000" />
    
  
    
      <img src="https://lh3.googleusercontent.com/pw/AP1GczMOpPEM5DdyZqcusFVrEaqwZjYYDNQ1H7Hvh1zQTa-R6J51q2KK82RMDowXtCBsV1ii3z8dNZafycQfERuXqX9fVk4vv76AKFMlhM1ac0CfBZN9j14hDVf5wkSFDw6UpiMZ58U0uIk7nK5AK8iSYTzs=w957-h635-s-no-gm?authuser=0" alt="FILM 000" />
    
  
    
      <img src="https://lh3.googleusercontent.com/pw/AP1GczPNqu_D4kcjj7Kt7Xyl46A4_2pzth_AreGVbkOswGd--fuRKwXJPFwdMNpWg9SVXMYV50GDfeNepO0VB6aLvWFAzriNjhjarEgJb6fi0qIzcwMI4ujV6lht3EQGlAErXcf6r6i3FSaaWp7a9q1qY8Yg=w957-h635-s-no-gm?authuser=0" alt="FILM 000" />
    
  
    
      <img src="https://lh3.googleusercontent.com/pw/AP1GczMNctDkhgVCRQu6ljnDnnqnSFpKno0lvLz8AdtYCZAHlWY3zWPpJKVMOijnr11RZ72_ezP6fQ1C-2h5NUFR9ZimHMVmE56NtZGsbeATqcBwo-k4bnhjwrG8Eg4LdPFwPiGjiI-qTHY-KEJPVgs9L3VG=w957-h635-s-no-gm?authuser=0" alt="FILM 000" />
    
  
    
      <img src="https://lh3.googleusercontent.com/pw/AP1GczNu-BAq8z05Aiv1YV9h2ALfhF-tras7pXuPxhUn4f1znKeFcqnrrTS5osAHn8F-ZR9P77HsS_w3_cIFw8hWAgEJlPiQWMP79FbP0nsQS-EKghYXUTwGIeWiiaU3iaOmxLJnzcb47Mw-hzZJ3ArFUrU-=w957-h635-s-no-gm?authuser=0" alt="FILM 000" />
    
  
    
      <img src="https://lh3.googleusercontent.com/pw/AP1GczPCIQ16jeCGCQuglBOw960SIkaWUhoHlzk7tkc2PQyHNpP__i63oYM98eb5sCioKMOQm2XSrPQLnuL1cX52FTrfB2szxDEMprzGdql0_Qr6oZswFt7yRHtgdfGTuYEWLOPnSwukQsTy9cv3v4-4Cfcw=w627-h945-s-no-gm?authuser=0" alt="FILM 000" />
    
  
    
      <img src="https://lh3.googleusercontent.com/pw/AP1GczPn6aeZgjtMaABZNFNwroCS4kfXUCAa_4nS6OU3T7vPgfHTDtcS3IE3vUxso-5gcEsjvtDuMro2LF87FmavMZul_-cQaaVrsDUWiMDCregULhnIatpO0IV7uRpii18YyM9X3CU7sQSsYV7DbQsaV0fL=w627-h945-s-no-gm?authuser=0" alt="FILM 000" />
    
  
    
      <img src="https://lh3.googleusercontent.com/pw/AP1GczMH-4lNbziiluTm4rQP1pdBjaYAKCcwaA41_Ny2ma3_D4qNTEXdLMuZ68OJGPFOU5LEVNncdkK36CIGCM5DanlA9BIV31pu2uIBvCpzLshx_Qi1A8drm-ff-H5bRsYGrL2GNTleriUARgdzhV6eZdMU=w957-h635-s-no-gm?authuser=0" alt="FILM 000" />
    
  
    
      <img src="https://lh3.googleusercontent.com/pw/AP1GczNFCP0MJhpCxsjhVkQeqAPSqZUiz092liHSbNHB_vwbBviWcbqph-TGT-b5SvseDVm2VDXD_IpABCbmXbhZtPOAw2ybzpvEOzVMjaw2QnCd6REUMZ0wajd7UyotXFL-BVx4UR1hxeo9ejYKKaWPcF76=w957-h635-s-no-gm?authuser=0" alt="FILM 000" />
    
  
  
</figure>]]></content><author><name>Tiffany Qian</name></author><category term="art" /><category term="film" /><category term="personal" /><category term="photography" /><summary type="html"><![CDATA[Life in SF + France Trip, August 2025 - March 2026]]></summary></entry><entry><title type="html">Train Schedule Display</title><link href="https://tiffanyqian.github.io/blog/20251017-train-schedule-display.html" rel="alternate" type="text/html" title="Train Schedule Display" /><published>2025-10-17T00:00:00+00:00</published><updated>2025-10-17T00:00:00+00:00</updated><id>https://tiffanyqian.github.io/blog/train-schedule-display</id><content type="html" xml:base="https://tiffanyqian.github.io/blog/20251017-train-schedule-display.html"><![CDATA[<p>public transportation lovers wya!!</p>

<p>Here’s my process-ramble / semi-tutorial on a SF MUNI and Caltrain schedule display! Spoiler: this project functions but is still a WIP. My general inspiration was the schedule displays at train/bus stops as decor. I was also motivated by the fact that my morning commute varied wildly depending on bus delays… I had multiple routes to get to work and every morning I’d have to check transit multiple times to see when I’d have to leave and which bus had the best transfer. Annoying! Thus, train schedule display: two birds fixed with one API request!</p>
<h4 id="hardware">Hardware</h4>
<p>There were a lot of LED displays that I looked at, but I ended up ordering an <a href="https://www.adafruit.com/product/4745?srsltid=AfmBOoqwtRpDSj4NJvido4vmpxAwRZZqTwkYBUnV2wESGgkPBtI68oB-">Adafruit MatrixPortal kit</a> to save myself some time on misc. hardware issues and soldering time. There are some cons to this that I’ll get into later- but overall the convenience got me started on the project much sooner than if I had to do all the wiring by myself.</p>
<h4 id="code">Code</h4>
<p>This was baby’s first API request foray!! I used <a href="https://511.org/open-data/transit">511 Open Data</a> to make my API calls. I believe this is what literally everyone uses, even SFMTA, and you can get a free API token to make 60 requests per 3600 seconds (AKA 1 call every minute). The data exchange protocol is documented pretty well <a href="https://511.org/media/407/show">here</a>.</p>

<p>I decided to code on the MatrixPortal with CircuitPython since I’ve been doing much more in Python than C++ lately. I spent a while just figuring out the basics of API requesting and parsing JSON into what I needed in VS Code. I ended up writing a wrapper function to make API requests for specific transit agency / stop IDs.</p>

<p>There were some difficulties transferring my code onto the MatrixPortal… I had never used CircuitPython before and didn’t realize how restrictive it was. The first major problem was that the 511 API gave me data with a SIRI format that freaked out typical JSON unpackers. The way I had been parsing it on my computer didn’t work on the M4 processor, but I did manage to find a workaround that was slightly bulkier. Surely that won’t cause any problems!</p>

<p>I used a lot of the <a href="https://learn.adafruit.com/rgb-led-matrices-matrix-panels-with-circuitpython/matrixportal">Adafruit CircuitPython tutorials</a> and <a href="https://docs.circuitpython.org/en/latest/shared-bindings/displayio/">CircuitPython Core Module References</a> to get the screen connected and code translated. The layout process wasn’t anything super crazy- mostly following documentation, making point changes, and displaying changes to the screen until I was satisfied. Bitmap Label is what I used for all the text displayed.</p>

<p>I followed the <a href="https://learn.adafruit.com/adafruit-matrixportal-m4/circuitpython-setup">Adafruit MatrixPortal M4 Setup Guide</a> to connect to the internet and get my pins set-up. You should have your own wi-fi network / password in settings.toml. In the lib folder, you should have this set-up:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>\adafruit_bitmap_font
\adafruit_bus_device
\adafruit_display_shapes
\adafruit_display_text
\adafruit_esp32spi
\adafruit_io
\adafruit_matrixportal
\adafruit_minimqtt
\adafruit_portalbase
adafruit_debouncer.mpy
adafruit_fakerequests.mpy
adafruit_fingerprint.mpy
adafruit_lis3dh.mpy
adafruit_requests.mpy
adafruit_ticks.mpy
nepoixel.mpy
</code></pre></div></div>

<p>The main code can be seen <a href="#full-code">here</a>.</p>

<h4 id="errors--future-updates">Errors &amp; Future Updates</h4>

<p>I had a lot of ambitions and had a lot of them shot down due to hardware or software limitations. Sucks, but that’s life. Here are some of my grievances and future to-dos:</p>
<ul>
  <li>I want to build a case for this- TBD if I want to 3D print it or cut it out of wood…</li>
  <li>The colors didn’t match as closely as I wanted to, unavoidable unfortunately.</li>
  <li>I wanted to have scrolling images or other fun things in-between the MUNI and Caltrain screens using a BitMap pixel drawing, but I ran into memory issues with that… so it was scrapped (for now).</li>
  <li>I wanted to implement an overnight shut-off that would, based on call request time, stop making requests between 1 AM and 6 AM (since MUNI / Caltrain doesn’t run during this time ) unless a side button was pressed. This semi-works, but fails here and there and I need to do some further debugging.</li>
  <li>Memory. Fragmentation. Issues. Galore. This is due to the workaround to the SIRI JSON format from the 511 API creating crazy chunks of data, and apparently CIRCUITPYTHON LABEL REALLOCATES THE LABEL’S MEMORY EVERY TIME THE TEXT IN THE LABEL IS UPDATED. HELLO? THAT IS SOOOO STUPID. THE TEXT CHANGES EVERY MINUTE FOR 3 DIFFERENT THINGS???
    <ul>
      <li>This means the code fragments after a while and the program stops. It will rerun just fine if you reboot it, but that’s why this project is a WIP still.</li>
      <li>You can read more about this memory error on the Adafruit website <a href="https://learn.adafruit.com/memory-saving-tips-for-circuitpython/reducing-memory-fragmentation">here</a> as it seems to be a pretty known issue. I’ve tried pretty much every single fix mentioned at the above link other than manually assigning chunks of data for each variable. Sadly, that’ll probably what I have to do in the future to fully fix this.</li>
    </ul>
  </li>
</ul>

<h4 id="final-thoughts--product">Final Thoughts / Product</h4>
<p>Currently, as I’m writing this on 03/30/2026, the code is in a weird position. It runs just fine, but may need to be restarted every once in a while due to memory allocation weirdness. Blargh. I’ll turn it occasionally when I have people over and they need to take the bus, and it still looks pretty cool:</p>

<p><img src="https://tiffanyqian.github.io/blog/assets/images/posts/tsd.gif" alt="Transit Schedule Display" /></p>

<p>Here’s the code- good luck! One day I will get around to making this readable / workable.</p>

<h4 id="full-code">Full Code</h4>

<h5 id="import--set-up">Import / Set Up</h5>
<p>The set-up / importing is below. This should be in the code.</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="nn">os</span> <span class="kn">import</span> <span class="n">getenv</span>
<span class="kn">import</span> <span class="nn">json</span>
<span class="kn">import</span> <span class="nn">gc</span>
<span class="kn">import</span> <span class="nn">adafruit_requests</span>
<span class="kn">import</span> <span class="nn">adafruit_connection_manager</span>
<span class="kn">import</span> <span class="nn">alarm</span>
<span class="kn">import</span> <span class="nn">board</span>
<span class="kn">import</span> <span class="nn">time</span>
<span class="kn">import</span> <span class="nn">displayio</span>
<span class="kn">import</span> <span class="nn">busio</span>
<span class="kn">import</span> <span class="nn">terminalio</span>
<span class="kn">import</span> <span class="nn">rgbmatrix</span>
<span class="kn">import</span> <span class="nn">framebufferio</span>
<span class="kn">import</span> <span class="nn">zlib</span>
<span class="kn">from</span> <span class="nn">adafruit_display_text.label</span> <span class="kn">import</span> <span class="n">Label</span>
<span class="kn">from</span> <span class="nn">adafruit_matrixportal.network</span> <span class="kn">import</span> <span class="n">Network</span>
<span class="kn">from</span> <span class="nn">adafruit_bitmap_font</span> <span class="kn">import</span> <span class="n">bitmap_font</span>
<span class="kn">from</span> <span class="nn">adafruit_display_shapes.roundrect</span> <span class="kn">import</span> <span class="n">RoundRect</span>
<span class="kn">from</span> <span class="nn">adafruit_esp32spi</span> <span class="kn">import</span> <span class="n">adafruit_esp32spi</span>
<span class="kn">from</span> <span class="nn">digitalio</span> <span class="kn">import</span> <span class="n">DigitalInOut</span>

<span class="c1"># Get wifi details and more from a settings.toml file
# tokens used by this Demo: CIRCUITPY_WIFI_SSID, CIRCUITPY_WIFI_PASSWORD
</span><span class="n">ssid</span> <span class="o">=</span> <span class="n">getenv</span><span class="p">(</span><span class="s">"CIRCUITPY_WIFI_SSID"</span><span class="p">)</span>
<span class="n">password</span> <span class="o">=</span> <span class="n">getenv</span><span class="p">(</span><span class="s">"CIRCUITPY_WIFI_PASSWORD"</span><span class="p">)</span>
<span class="n">api_key</span> <span class="o">=</span> <span class="n">getenv</span><span class="p">(</span><span class="s">"transit_api_key"</span><span class="p">)</span>

<span class="n">esp32_cs</span> <span class="o">=</span> <span class="n">DigitalInOut</span><span class="p">(</span><span class="n">board</span><span class="p">.</span><span class="n">ESP_CS</span><span class="p">)</span>
<span class="n">esp32_ready</span> <span class="o">=</span> <span class="n">DigitalInOut</span><span class="p">(</span><span class="n">board</span><span class="p">.</span><span class="n">ESP_BUSY</span><span class="p">)</span>
<span class="n">esp32_reset</span> <span class="o">=</span> <span class="n">DigitalInOut</span><span class="p">(</span><span class="n">board</span><span class="p">.</span><span class="n">ESP_RESET</span><span class="p">)</span>

<span class="n">spi</span> <span class="o">=</span> <span class="n">busio</span><span class="p">.</span><span class="n">SPI</span><span class="p">(</span><span class="n">board</span><span class="p">.</span><span class="n">SCK</span><span class="p">,</span> <span class="n">board</span><span class="p">.</span><span class="n">MOSI</span><span class="p">,</span> <span class="n">board</span><span class="p">.</span><span class="n">MISO</span><span class="p">)</span>
<span class="n">esp</span> <span class="o">=</span> <span class="n">adafruit_esp32spi</span><span class="p">.</span><span class="n">ESP_SPIcontrol</span><span class="p">(</span><span class="n">spi</span><span class="p">,</span> <span class="n">esp32_cs</span><span class="p">,</span> <span class="n">esp32_ready</span><span class="p">,</span> <span class="n">esp32_reset</span><span class="p">)</span>

<span class="n">pool</span> <span class="o">=</span> <span class="n">adafruit_connection_manager</span><span class="p">.</span><span class="n">get_radio_socketpool</span><span class="p">(</span><span class="n">esp</span><span class="p">)</span>
<span class="n">ssl_context</span> <span class="o">=</span> <span class="n">adafruit_connection_manager</span><span class="p">.</span><span class="n">get_radio_ssl_context</span><span class="p">(</span><span class="n">esp</span><span class="p">)</span>
<span class="n">requests</span> <span class="o">=</span> <span class="n">adafruit_requests</span><span class="p">.</span><span class="n">Session</span><span class="p">(</span><span class="n">pool</span><span class="p">,</span> <span class="n">ssl_context</span><span class="p">)</span>

<span class="c1"># ===== DRAWING STUFF =====
</span>
<span class="n">displayio</span><span class="p">.</span><span class="n">release_displays</span><span class="p">()</span>
<span class="n">matrix</span> <span class="o">=</span> <span class="n">rgbmatrix</span><span class="p">.</span><span class="n">RGBMatrix</span><span class="p">(</span>
    <span class="n">width</span><span class="o">=</span><span class="mi">64</span><span class="p">,</span> <span class="n">bit_depth</span><span class="o">=</span><span class="mi">4</span><span class="p">,</span>
    <span class="n">rgb_pins</span><span class="o">=</span><span class="p">[</span>
        <span class="n">board</span><span class="p">.</span><span class="n">MTX_R1</span><span class="p">,</span>
        <span class="n">board</span><span class="p">.</span><span class="n">MTX_G1</span><span class="p">,</span>
        <span class="n">board</span><span class="p">.</span><span class="n">MTX_B1</span><span class="p">,</span>
        <span class="n">board</span><span class="p">.</span><span class="n">MTX_R2</span><span class="p">,</span>
        <span class="n">board</span><span class="p">.</span><span class="n">MTX_G2</span><span class="p">,</span>
        <span class="n">board</span><span class="p">.</span><span class="n">MTX_B2</span>
    <span class="p">],</span>
    <span class="n">addr_pins</span><span class="o">=</span><span class="p">[</span>
        <span class="n">board</span><span class="p">.</span><span class="n">MTX_ADDRA</span><span class="p">,</span>
        <span class="n">board</span><span class="p">.</span><span class="n">MTX_ADDRB</span><span class="p">,</span>
        <span class="n">board</span><span class="p">.</span><span class="n">MTX_ADDRC</span><span class="p">,</span>
        <span class="n">board</span><span class="p">.</span><span class="n">MTX_ADDRD</span>
    <span class="p">],</span>
    <span class="n">clock_pin</span><span class="o">=</span><span class="n">board</span><span class="p">.</span><span class="n">MTX_CLK</span><span class="p">,</span>
    <span class="n">latch_pin</span><span class="o">=</span><span class="n">board</span><span class="p">.</span><span class="n">MTX_LAT</span><span class="p">,</span>
    <span class="n">output_enable_pin</span><span class="o">=</span><span class="n">board</span><span class="p">.</span><span class="n">MTX_OE</span>
<span class="p">)</span>
<span class="n">display</span> <span class="o">=</span> <span class="n">framebufferio</span><span class="p">.</span><span class="n">FramebufferDisplay</span><span class="p">(</span><span class="n">matrix</span><span class="p">)</span>

<span class="n">group</span> <span class="o">=</span> <span class="n">displayio</span><span class="p">.</span><span class="n">Group</span><span class="p">()</span>  <span class="c1"># Create a Group
</span><span class="n">bitmap</span> <span class="o">=</span> <span class="n">displayio</span><span class="p">.</span><span class="n">Bitmap</span><span class="p">(</span><span class="mi">64</span><span class="p">,</span> <span class="mi">32</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span>  <span class="c1"># Create a bitmap object,width, height, bit depth
</span><span class="n">color</span> <span class="o">=</span> <span class="n">displayio</span><span class="p">.</span><span class="n">Palette</span><span class="p">(</span><span class="n">color_count</span><span class="o">=</span><span class="mi">5</span><span class="p">)</span>  <span class="c1"># Create a color palette
</span><span class="n">color</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="mh">0x000000</span>  <span class="c1"># black
</span><span class="n">color</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="mh">0xFFFFFF</span>  <span class="c1"># white
</span><span class="n">color</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="o">=</span> <span class="mh">0xFF4400</span>  <span class="c1"># muni 19 orange FF4400
</span><span class="n">color</span><span class="p">[</span><span class="mi">3</span><span class="p">]</span> <span class="o">=</span> <span class="mh">0x0024C2</span>  <span class="c1"># muni 48 blue
</span><span class="n">color</span><span class="p">[</span><span class="mi">4</span><span class="p">]</span> <span class="o">=</span> <span class="mh">0xE80000</span>  <span class="c1"># caltrain red
## You can update these colors to whatever you'd like! This is specific to me.
</span>
<span class="c1"># Create a TileGrid using the Bitmap and Palette
</span><span class="n">tile_grid</span> <span class="o">=</span> <span class="n">displayio</span><span class="p">.</span><span class="n">TileGrid</span><span class="p">(</span><span class="n">bitmap</span><span class="p">,</span> <span class="n">pixel_shader</span><span class="o">=</span><span class="n">color</span><span class="p">)</span>
<span class="n">group</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">tile_grid</span><span class="p">)</span>  <span class="c1"># Add the TileGrid to the Group
</span><span class="n">display</span><span class="p">.</span><span class="n">root_group</span> <span class="o">=</span> <span class="n">group</span>
</code></pre></div></div>
<p>The drawing / display elements are below. This will differ depending on what you want to display, but my use case is here as an example.</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># The display groups
</span><span class="n">muni_group</span> <span class="o">=</span> <span class="n">displayio</span><span class="p">.</span><span class="n">Group</span><span class="p">(</span><span class="n">x</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">y</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span>
<span class="n">ct_group</span> <span class="o">=</span> <span class="n">displayio</span><span class="p">.</span><span class="n">Group</span><span class="p">(</span><span class="n">x</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">y</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span>

<span class="c1"># 19 Display
</span><span class="n">muni_19_box</span> <span class="o">=</span> <span class="n">RoundRect</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">18</span><span class="p">,</span> <span class="mi">12</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="n">fill</span><span class="o">=</span><span class="n">color</span><span class="p">[</span><span class="mi">2</span><span class="p">],</span> <span class="n">stroke</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span>
<span class="n">muni_19_box</span><span class="p">.</span><span class="n">x</span> <span class="o">=</span> <span class="mi">6</span>
<span class="n">muni_19_box</span><span class="p">.</span><span class="n">y</span> <span class="o">=</span> <span class="mi">3</span>
<span class="n">muni_group</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">muni_19_box</span><span class="p">)</span>

<span class="n">muni_19_label</span> <span class="o">=</span> <span class="n">Label</span><span class="p">(</span><span class="n">terminalio</span><span class="p">.</span><span class="n">FONT</span><span class="p">,</span> <span class="n">text</span><span class="o">=</span><span class="s">"19"</span><span class="p">,</span> <span class="n">color</span><span class="o">=</span><span class="n">color</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
<span class="n">muni_19_label</span><span class="p">.</span><span class="n">x</span> <span class="o">=</span> <span class="mi">9</span>
<span class="n">muni_19_label</span><span class="p">.</span><span class="n">y</span> <span class="o">=</span> <span class="mi">9</span>
<span class="n">muni_group</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">muni_19_label</span><span class="p">)</span>

<span class="n">eta_19_label</span> <span class="o">=</span> <span class="n">Label</span><span class="p">(</span><span class="n">terminalio</span><span class="p">.</span><span class="n">FONT</span><span class="p">,</span> <span class="n">text</span><span class="o">=</span><span class="s">"---"</span><span class="p">,</span> <span class="n">color</span><span class="o">=</span><span class="n">color</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>
<span class="n">eta_19_label</span><span class="p">.</span><span class="n">x</span> <span class="o">=</span> <span class="mi">29</span>
<span class="n">eta_19_label</span><span class="p">.</span><span class="n">y</span> <span class="o">=</span> <span class="mi">9</span>
<span class="n">muni_group</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">eta_19_label</span><span class="p">)</span>

<span class="c1"># 48 Display
</span><span class="n">muni_48_box</span> <span class="o">=</span> <span class="n">RoundRect</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">18</span><span class="p">,</span> <span class="mi">12</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="n">fill</span><span class="o">=</span><span class="n">color</span><span class="p">[</span><span class="mi">3</span><span class="p">],</span> <span class="n">stroke</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span>
<span class="n">muni_48_box</span><span class="p">.</span><span class="n">x</span> <span class="o">=</span> <span class="mi">6</span>
<span class="n">muni_48_box</span><span class="p">.</span><span class="n">y</span> <span class="o">=</span> <span class="mi">17</span>
<span class="n">muni_group</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">muni_48_box</span><span class="p">)</span>

<span class="n">muni_48_label</span> <span class="o">=</span> <span class="n">Label</span><span class="p">(</span><span class="n">terminalio</span><span class="p">.</span><span class="n">FONT</span><span class="p">,</span> <span class="n">text</span><span class="o">=</span><span class="s">"48"</span><span class="p">,</span> <span class="n">color</span><span class="o">=</span><span class="n">color</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
<span class="n">muni_48_label</span><span class="p">.</span><span class="n">x</span> <span class="o">=</span> <span class="mi">9</span>
<span class="n">muni_48_label</span><span class="p">.</span><span class="n">y</span> <span class="o">=</span> <span class="mi">23</span>
<span class="n">muni_group</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">muni_48_label</span><span class="p">)</span>

<span class="n">eta_48_label</span> <span class="o">=</span> <span class="n">Label</span><span class="p">(</span><span class="n">terminalio</span><span class="p">.</span><span class="n">FONT</span><span class="p">,</span> <span class="n">text</span><span class="o">=</span><span class="s">"---"</span><span class="p">,</span> <span class="n">color</span><span class="o">=</span><span class="n">color</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>
<span class="n">eta_48_label</span><span class="p">.</span><span class="n">x</span> <span class="o">=</span> <span class="mi">29</span>
<span class="n">eta_48_label</span><span class="p">.</span><span class="n">y</span> <span class="o">=</span> <span class="mi">23</span>
<span class="n">muni_group</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">eta_48_label</span><span class="p">)</span>

<span class="c1"># CT Display
</span><span class="n">ct_box</span> <span class="o">=</span> <span class="n">RoundRect</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">17</span><span class="p">,</span> <span class="mi">12</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="n">fill</span><span class="o">=</span><span class="n">color</span><span class="p">[</span><span class="mi">4</span><span class="p">],</span> <span class="n">stroke</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span>
<span class="n">ct_box</span><span class="p">.</span><span class="n">x</span> <span class="o">=</span> <span class="mi">6</span>
<span class="n">ct_box</span><span class="p">.</span><span class="n">y</span> <span class="o">=</span> <span class="mi">10</span>
<span class="n">ct_group</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">ct_box</span><span class="p">)</span>

<span class="n">ct_label</span> <span class="o">=</span> <span class="n">Label</span><span class="p">(</span><span class="n">terminalio</span><span class="p">.</span><span class="n">FONT</span><span class="p">,</span> <span class="n">text</span><span class="o">=</span><span class="s">"CT"</span><span class="p">,</span> <span class="n">color</span><span class="o">=</span><span class="n">color</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>
<span class="n">ct_label</span><span class="p">.</span><span class="n">x</span> <span class="o">=</span> <span class="mi">9</span>
<span class="n">ct_label</span><span class="p">.</span><span class="n">y</span> <span class="o">=</span> <span class="mi">16</span>
<span class="n">ct_group</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">ct_label</span><span class="p">)</span>

<span class="n">eta_ct_label</span> <span class="o">=</span> <span class="n">Label</span><span class="p">(</span><span class="n">terminalio</span><span class="p">.</span><span class="n">FONT</span><span class="p">,</span> <span class="n">text</span><span class="o">=</span><span class="s">"---"</span><span class="p">,</span> <span class="n">color</span><span class="o">=</span><span class="n">color</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>
<span class="n">eta_ct_label</span><span class="p">.</span><span class="n">x</span> <span class="o">=</span> <span class="mi">28</span>
<span class="n">eta_ct_label</span><span class="p">.</span><span class="n">y</span> <span class="o">=</span> <span class="mi">16</span>
<span class="n">ct_group</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">eta_ct_label</span><span class="p">)</span>

<span class="n">group</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">muni_group</span><span class="p">)</span>
<span class="n">muni_group</span><span class="p">.</span><span class="n">hidden</span> <span class="o">=</span> <span class="bp">True</span>
<span class="n">group</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">ct_group</span><span class="p">)</span>
<span class="n">ct_group</span><span class="p">.</span><span class="n">hidden</span> <span class="o">=</span> <span class="bp">True</span>

<span class="c1"># ==============
</span>
<span class="n">eta_list_19</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">eta_list_48</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">muni_time</span> <span class="o">=</span> <span class="mi">0</span>

<span class="n">ct_list</span> <span class="o">=</span> <span class="p">[]</span>

<span class="c1"># ==============
</span></code></pre></div></div>
<p>This is the method to call the API to get transit times.</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># Make call to 511 API using "agency" and "stopCode", in this program, SF MUNI / CalTrain
</span><span class="k">def</span> <span class="nf">call_Transit</span><span class="p">(</span><span class="n">agency</span><span class="p">,</span> <span class="n">stopCode</span><span class="p">):</span>
    <span class="n">gc</span><span class="p">.</span><span class="n">collect</span><span class="p">()</span>

    <span class="k">try</span><span class="p">:</span>
        <span class="k">with</span> <span class="n">requests</span><span class="p">.</span><span class="n">get</span><span class="p">(</span><span class="s">"http://api.511.org/transit/StopMonitoring?&amp;format=JSON&amp;agency={}&amp;stopCode={}&amp;api_key={}"</span><span class="p">.</span><span class="nb">format</span><span class="p">(</span><span class="n">agency</span><span class="p">,</span> <span class="n">stopCode</span><span class="p">,</span> <span class="n">api_key</span><span class="p">))</span> <span class="k">as</span> <span class="n">response</span><span class="p">:</span>
            <span class="n">gc</span><span class="p">.</span><span class="n">collect</span><span class="p">()</span>
            <span class="k">print</span><span class="p">(</span><span class="s">"MEM pre CALL: "</span><span class="p">,</span><span class="n">gc</span><span class="p">.</span><span class="n">mem_free</span><span class="p">())</span>
            <span class="n">response_data</span> <span class="o">=</span> <span class="n">json</span><span class="p">.</span><span class="n">loads</span><span class="p">(</span><span class="n">zlib</span><span class="p">.</span><span class="n">decompress</span><span class="p">(</span><span class="n">response</span><span class="p">.</span><span class="n">content</span><span class="p">,</span><span class="mi">31</span><span class="p">)[</span><span class="mi">3</span><span class="p">:].</span><span class="n">decode</span><span class="p">(</span><span class="s">"utf-8"</span><span class="p">))</span>
            <span class="k">print</span><span class="p">(</span><span class="s">"MEM post CALL: "</span><span class="p">,</span><span class="n">gc</span><span class="p">.</span><span class="n">mem_free</span><span class="p">())</span>
            <span class="n">gc</span><span class="p">.</span><span class="n">collect</span><span class="p">()</span>
            <span class="n">response</span><span class="p">.</span><span class="n">close</span><span class="p">()</span>

            <span class="k">return</span> <span class="n">response_data</span>
    <span class="k">except</span> <span class="nb">OSError</span> <span class="k">as</span> <span class="n">error</span><span class="p">:</span>
        <span class="k">print</span><span class="p">(</span><span class="n">error</span><span class="p">)</span>

<span class="c1"># Changing UTC time to Pacific Time
</span><span class="k">def</span> <span class="nf">time_Handling</span><span class="p">(</span><span class="n">t</span><span class="p">):</span>
    <span class="n">gc</span><span class="p">.</span><span class="n">collect</span><span class="p">()</span>

    <span class="n">yr</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">t</span><span class="p">[</span><span class="mi">0</span><span class="p">:</span><span class="mi">4</span><span class="p">])</span>
    <span class="n">mon</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">t</span><span class="p">[</span><span class="mi">5</span><span class="p">:</span><span class="mi">7</span><span class="p">])</span>
    <span class="n">day</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">t</span><span class="p">[</span><span class="mi">8</span><span class="p">:</span><span class="mi">10</span><span class="p">])</span>
    <span class="n">hr</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">t</span><span class="p">[</span><span class="mi">11</span><span class="p">:</span><span class="mi">13</span><span class="p">])</span>

    <span class="k">if</span> <span class="n">hr</span> <span class="o">-</span> <span class="mi">7</span> <span class="o">&gt;=</span> <span class="mi">0</span><span class="p">:</span>
        <span class="n">hr</span> <span class="o">=</span> <span class="n">hr</span> <span class="o">-</span> <span class="mi">7</span>
    <span class="k">else</span><span class="p">:</span>
        <span class="n">hr</span> <span class="o">=</span> <span class="n">hr</span> <span class="o">+</span> <span class="mi">17</span>
        <span class="k">if</span> <span class="n">day</span> <span class="o">-</span> <span class="mi">1</span> <span class="o">&gt;=</span> <span class="mi">1</span><span class="p">:</span>
            <span class="n">day</span> <span class="o">=</span> <span class="n">day</span> <span class="o">-</span> <span class="mi">1</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="k">if</span> <span class="n">mon</span> <span class="o">-</span> <span class="mi">1</span> <span class="o">&gt;=</span> <span class="mi">1</span><span class="p">:</span>
                <span class="n">mon</span> <span class="o">=</span> <span class="n">mon</span> <span class="o">-</span> <span class="mi">1</span>
                <span class="k">if</span> <span class="n">mon</span> <span class="ow">in</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">7</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">10</span><span class="p">,</span> <span class="mi">12</span><span class="p">]:</span>
                    <span class="n">day</span> <span class="o">=</span> <span class="mi">31</span>
                <span class="k">else</span><span class="p">:</span>
                    <span class="n">day</span> <span class="o">=</span> <span class="mi">30</span>
            <span class="k">else</span><span class="p">:</span>
                <span class="n">mon</span> <span class="o">=</span> <span class="mi">12</span>
                <span class="n">day</span> <span class="o">=</span> <span class="mi">31</span>
                <span class="n">yr</span> <span class="o">=</span> <span class="n">yr</span> <span class="o">-</span> <span class="mi">1</span>
    <span class="k">return</span> <span class="n">time</span><span class="p">.</span><span class="n">struct_time</span><span class="p">((</span><span class="n">yr</span><span class="p">,</span> <span class="n">mon</span><span class="p">,</span> <span class="n">day</span><span class="p">,</span> <span class="n">hr</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">t</span><span class="p">[</span><span class="mi">14</span><span class="p">:</span><span class="mi">16</span><span class="p">]),</span> <span class="nb">int</span><span class="p">(</span><span class="n">t</span><span class="p">[</span><span class="mi">17</span><span class="p">:</span><span class="o">-</span><span class="mi">1</span><span class="p">]),</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">))</span>

<span class="k">def</span> <span class="nf">get_MUNI_Times</span><span class="p">():</span>
    <span class="n">gc</span><span class="p">.</span><span class="n">collect</span><span class="p">()</span>
    <span class="k">try</span><span class="p">:</span>
        <span class="n">muni_data</span> <span class="o">=</span> <span class="n">call_Transit</span><span class="p">(</span><span class="s">"SF"</span><span class="p">,</span> <span class="s">"15227"</span><span class="p">)</span>
    <span class="k">except</span><span class="p">:</span>
        <span class="n">alarm</span><span class="p">.</span><span class="n">exit_and_deep_sleep_until_alarms</span><span class="p">(</span> <span class="n">alarm</span><span class="p">.</span><span class="n">time</span><span class="p">.</span><span class="n">TimeAlarm</span><span class="p">(</span><span class="n">monotonic_time</span><span class="o">=</span><span class="n">time</span><span class="p">.</span><span class="n">monotonic</span><span class="p">()</span> <span class="o">+</span> <span class="mi">30</span><span class="p">)</span> <span class="p">)</span>
    <span class="n">gc</span><span class="p">.</span><span class="n">collect</span><span class="p">()</span>
    <span class="n">muni_response_t</span> <span class="o">=</span> <span class="n">time_Handling</span><span class="p">(</span><span class="n">muni_data</span><span class="p">[</span><span class="s">"ServiceDelivery"</span><span class="p">][</span><span class="s">"ResponseTimestamp"</span><span class="p">])</span>

    <span class="k">for</span> <span class="n">bus</span> <span class="ow">in</span> <span class="n">muni_data</span><span class="p">[</span><span class="s">"ServiceDelivery"</span><span class="p">][</span><span class="s">"StopMonitoringDelivery"</span><span class="p">][</span><span class="s">"MonitoredStopVisit"</span><span class="p">]:</span>
        <span class="n">line</span> <span class="o">=</span> <span class="n">bus</span><span class="p">[</span><span class="s">"MonitoredVehicleJourney"</span><span class="p">][</span><span class="s">"LineRef"</span><span class="p">]</span>
        <span class="k">if</span> <span class="n">line</span> <span class="o">==</span> <span class="s">"19"</span><span class="p">:</span>
            <span class="n">arr_t</span> <span class="o">=</span> <span class="n">time_Handling</span><span class="p">(</span><span class="n">bus</span><span class="p">[</span><span class="s">"MonitoredVehicleJourney"</span><span class="p">][</span><span class="s">"MonitoredCall"</span><span class="p">][</span><span class="s">"ExpectedArrivalTime"</span><span class="p">])</span>
            <span class="n">eta</span> <span class="o">=</span> <span class="n">time</span><span class="p">.</span><span class="n">mktime</span><span class="p">(</span><span class="n">arr_t</span><span class="p">)</span> <span class="o">-</span> <span class="n">time</span><span class="p">.</span><span class="n">mktime</span><span class="p">(</span><span class="n">muni_response_t</span><span class="p">)</span>
            <span class="n">eta_list_19</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">eta</span><span class="o">/</span><span class="mi">60</span><span class="p">))</span>

        <span class="k">if</span> <span class="n">line</span> <span class="o">==</span> <span class="s">"48"</span><span class="p">:</span>
            <span class="n">arr_t</span> <span class="o">=</span> <span class="n">time_Handling</span><span class="p">(</span><span class="n">bus</span><span class="p">[</span><span class="s">"MonitoredVehicleJourney"</span><span class="p">][</span><span class="s">"MonitoredCall"</span><span class="p">][</span><span class="s">"ExpectedArrivalTime"</span><span class="p">])</span>
            <span class="n">eta</span> <span class="o">=</span> <span class="n">time</span><span class="p">.</span><span class="n">mktime</span><span class="p">(</span><span class="n">arr_t</span><span class="p">)</span> <span class="o">-</span> <span class="n">time</span><span class="p">.</span><span class="n">mktime</span><span class="p">(</span><span class="n">muni_response_t</span><span class="p">)</span>
            <span class="n">eta_list_48</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">eta</span><span class="o">/</span><span class="mi">60</span><span class="p">))</span>

    <span class="k">del</span> <span class="n">muni_data</span>
    <span class="n">gc</span><span class="p">.</span><span class="n">collect</span><span class="p">()</span>

    <span class="k">return</span> <span class="n">eta_list_19</span><span class="p">,</span> <span class="n">eta_list_48</span><span class="p">,</span> <span class="n">muni_response_t</span>

<span class="k">def</span> <span class="nf">get_CT_Times</span><span class="p">():</span>
    <span class="n">gc</span><span class="p">.</span><span class="n">collect</span><span class="p">()</span>
    <span class="k">try</span><span class="p">:</span>
        <span class="n">ct_data</span> <span class="o">=</span> <span class="n">call_Transit</span><span class="p">(</span><span class="s">"CT"</span><span class="p">,</span> <span class="s">"70022"</span><span class="p">)</span>
    <span class="k">except</span><span class="p">:</span>
        <span class="n">alarm</span><span class="p">.</span><span class="n">exit_and_deep_sleep_until_alarms</span><span class="p">(</span> <span class="n">alarm</span><span class="p">.</span><span class="n">time</span><span class="p">.</span><span class="n">TimeAlarm</span><span class="p">(</span><span class="n">monotonic_time</span><span class="o">=</span><span class="n">time</span><span class="p">.</span><span class="n">monotonic</span><span class="p">()</span> <span class="o">+</span> <span class="mi">30</span><span class="p">)</span> <span class="p">)</span>
    <span class="n">gc</span><span class="p">.</span><span class="n">collect</span><span class="p">()</span>
    <span class="n">ct_response_t</span> <span class="o">=</span> <span class="n">time_Handling</span><span class="p">(</span><span class="n">ct_data</span><span class="p">[</span><span class="s">"ServiceDelivery"</span><span class="p">][</span><span class="s">"ResponseTimestamp"</span><span class="p">])</span>

    <span class="k">for</span> <span class="n">train</span> <span class="ow">in</span> <span class="n">ct_data</span><span class="p">[</span><span class="s">"ServiceDelivery"</span><span class="p">][</span><span class="s">"StopMonitoringDelivery"</span><span class="p">][</span><span class="s">"MonitoredStopVisit"</span><span class="p">]:</span>
        <span class="n">line</span> <span class="o">=</span> <span class="n">train</span><span class="p">[</span><span class="s">"MonitoredVehicleJourney"</span><span class="p">][</span><span class="s">"LineRef"</span><span class="p">]</span>
        <span class="n">arr_t</span> <span class="o">=</span> <span class="n">time_Handling</span><span class="p">(</span><span class="n">train</span><span class="p">[</span><span class="s">"MonitoredVehicleJourney"</span><span class="p">][</span><span class="s">"MonitoredCall"</span><span class="p">][</span><span class="s">"ExpectedArrivalTime"</span><span class="p">])</span>
        <span class="n">eta</span> <span class="o">=</span> <span class="n">time</span><span class="p">.</span><span class="n">mktime</span><span class="p">(</span><span class="n">arr_t</span><span class="p">)</span> <span class="o">-</span> <span class="n">time</span><span class="p">.</span><span class="n">mktime</span><span class="p">(</span><span class="n">ct_response_t</span><span class="p">)</span>
        <span class="n">ct_list</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">eta</span><span class="o">/</span><span class="mi">60</span><span class="p">))</span>

    <span class="k">del</span> <span class="n">ct_data</span>
    <span class="n">gc</span><span class="p">.</span><span class="n">collect</span><span class="p">()</span>

    <span class="k">return</span> <span class="n">ct_list</span>

<span class="k">def</span> <span class="nf">display_Transit_Time</span><span class="p">(</span><span class="n">eta_list</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
    <span class="n">gc</span><span class="p">.</span><span class="n">collect</span><span class="p">()</span>

    <span class="n">offset</span> <span class="o">=</span> <span class="n">kwargs</span><span class="p">.</span><span class="n">get</span><span class="p">(</span><span class="s">"offset"</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
    <span class="n">new_eta</span> <span class="o">=</span> <span class="p">[]</span>
    <span class="n">display_str</span> <span class="o">=</span> <span class="s">"---"</span>

    <span class="c1"># print(eta_list)
</span>
    <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">eta_list</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">:</span>
        <span class="k">if</span> <span class="n">offset</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">:</span>
            <span class="k">for</span> <span class="n">t</span> <span class="ow">in</span> <span class="n">eta_list</span><span class="p">:</span>
                <span class="k">if</span> <span class="n">t</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="ow">and</span> <span class="n">t</span> <span class="o">&lt;</span> <span class="mi">60</span><span class="p">:</span>
                    <span class="n">new_eta</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">t</span> <span class="o">-</span> <span class="n">offset</span><span class="o">/</span><span class="mi">60</span><span class="p">))</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="k">for</span> <span class="n">t</span> <span class="ow">in</span> <span class="n">eta_list</span><span class="p">:</span>
                <span class="k">if</span> <span class="n">t</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="ow">and</span> <span class="n">t</span> <span class="o">&lt;</span> <span class="mi">60</span><span class="p">:</span>
                    <span class="n">new_eta</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">t</span><span class="p">)</span>

        <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">new_eta</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">2</span><span class="p">:</span>
            <span class="n">new_eta</span> <span class="o">=</span> <span class="n">new_eta</span><span class="p">[</span><span class="mi">0</span><span class="p">:</span><span class="mi">2</span><span class="p">]</span>

        <span class="n">display_str</span> <span class="o">=</span> <span class="s">","</span><span class="p">.</span><span class="n">join</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">new_eta</span><span class="p">))</span>

        <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">display_str</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">8</span><span class="p">:</span>
            <span class="n">display_str</span> <span class="o">=</span> <span class="n">display_str</span><span class="p">[</span><span class="mi">0</span><span class="p">:</span><span class="o">-</span><span class="mi">3</span><span class="p">]</span>

        <span class="k">del</span> <span class="n">new_eta</span>
        <span class="k">del</span> <span class="n">offset</span>
        <span class="n">gc</span><span class="p">.</span><span class="n">collect</span><span class="p">()</span>

        <span class="k">return</span> <span class="n">display_str</span>
    <span class="k">else</span><span class="p">:</span>
        <span class="k">return</span> <span class="s">"---"</span>
</code></pre></div></div>
<p>The main loop starts here:</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">while</span> <span class="bp">True</span><span class="p">:</span>
    <span class="c1"># Connecting to Wifi
</span>    <span class="k">while</span> <span class="ow">not</span> <span class="n">esp</span><span class="p">.</span><span class="n">is_connected</span><span class="p">:</span>
        <span class="k">try</span><span class="p">:</span>
            <span class="n">esp</span><span class="p">.</span><span class="n">connect_AP</span><span class="p">(</span><span class="n">ssid</span><span class="p">,</span> <span class="n">password</span><span class="p">)</span>
        <span class="k">except</span> <span class="nb">OSError</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">"could not connect to AP, retrying: "</span><span class="p">,</span> <span class="n">e</span><span class="p">)</span>
            <span class="n">time</span><span class="p">.</span><span class="n">sleep</span><span class="p">(</span><span class="mi">60</span><span class="p">)</span>
            <span class="k">continue</span>

    <span class="n">gc</span><span class="p">.</span><span class="n">collect</span><span class="p">()</span>
    <span class="n">muni_19_data</span><span class="p">,</span> <span class="n">muni_48_data</span><span class="p">,</span> <span class="n">muni_time</span> <span class="o">=</span> <span class="n">get_MUNI_Times</span><span class="p">()</span>
    <span class="n">gc</span><span class="p">.</span><span class="n">collect</span><span class="p">()</span>
    <span class="n">ct_data</span> <span class="o">=</span> <span class="n">get_CT_Times</span><span class="p">()</span>
    <span class="n">gc</span><span class="p">.</span><span class="n">collect</span><span class="p">()</span>
    <span class="k">print</span><span class="p">(</span><span class="n">muni_time</span><span class="p">.</span><span class="n">tm_hour</span><span class="p">)</span>

    <span class="n">eta_19_label</span><span class="p">.</span><span class="n">text</span> <span class="o">=</span> <span class="n">display_Transit_Time</span><span class="p">(</span><span class="n">muni_19_data</span><span class="p">)</span>
    <span class="n">eta_48_label</span><span class="p">.</span><span class="n">text</span> <span class="o">=</span> <span class="n">display_Transit_Time</span><span class="p">(</span><span class="n">muni_48_data</span><span class="p">)</span>
    <span class="n">eta_ct_label</span><span class="p">.</span><span class="n">text</span> <span class="o">=</span> <span class="n">display_Transit_Time</span><span class="p">(</span><span class="n">ct_data</span><span class="p">)</span>
    <span class="n">gc</span><span class="p">.</span><span class="n">collect</span><span class="p">()</span>

    <span class="n">muni_group</span><span class="p">.</span><span class="n">hidden</span> <span class="o">=</span> <span class="bp">False</span>
    <span class="n">ct_group</span><span class="p">.</span><span class="n">hidden</span> <span class="o">=</span> <span class="bp">True</span>

    <span class="n">time</span><span class="p">.</span><span class="n">sleep</span><span class="p">(</span><span class="mi">10</span><span class="p">)</span>

    <span class="n">muni_group</span><span class="p">.</span><span class="n">hidden</span> <span class="o">=</span> <span class="bp">True</span>
    <span class="n">ct_group</span><span class="p">.</span><span class="n">hidden</span> <span class="o">=</span> <span class="bp">False</span>

    <span class="n">time</span><span class="p">.</span><span class="n">sleep</span><span class="p">(</span><span class="mi">10</span><span class="p">)</span>

    <span class="n">waiting_offset</span> <span class="o">=</span> <span class="mi">20</span>
    <span class="k">while</span> <span class="n">waiting_offset</span> <span class="o">&lt;</span> <span class="mi">101</span><span class="p">:</span>
        <span class="n">gc</span><span class="p">.</span><span class="n">collect</span><span class="p">()</span>
        <span class="n">eta_19_label</span><span class="p">.</span><span class="n">text</span> <span class="o">=</span> <span class="n">display_Transit_Time</span><span class="p">(</span><span class="n">muni_19_data</span><span class="p">,</span> <span class="n">offset</span><span class="o">=</span><span class="n">waiting_offset</span><span class="p">)</span>
        <span class="n">eta_48_label</span><span class="p">.</span><span class="n">text</span> <span class="o">=</span> <span class="n">display_Transit_Time</span><span class="p">(</span><span class="n">muni_48_data</span><span class="p">,</span> <span class="n">offset</span><span class="o">=</span><span class="n">waiting_offset</span><span class="p">)</span>
        <span class="n">eta_ct_label</span><span class="p">.</span><span class="n">text</span> <span class="o">=</span> <span class="n">display_Transit_Time</span><span class="p">(</span><span class="n">ct_data</span><span class="p">,</span> <span class="n">offset</span><span class="o">=</span><span class="n">waiting_offset</span><span class="p">)</span>
        <span class="n">gc</span><span class="p">.</span><span class="n">collect</span><span class="p">()</span>

        <span class="n">muni_group</span><span class="p">.</span><span class="n">hidden</span> <span class="o">=</span> <span class="bp">False</span>
        <span class="n">ct_group</span><span class="p">.</span><span class="n">hidden</span> <span class="o">=</span> <span class="bp">True</span>

        <span class="n">time</span><span class="p">.</span><span class="n">sleep</span><span class="p">(</span><span class="mi">10</span><span class="p">)</span>

        <span class="n">muni_group</span><span class="p">.</span><span class="n">hidden</span> <span class="o">=</span> <span class="bp">True</span>
        <span class="n">ct_group</span><span class="p">.</span><span class="n">hidden</span> <span class="o">=</span> <span class="bp">False</span>

        <span class="n">time</span><span class="p">.</span><span class="n">sleep</span><span class="p">(</span><span class="mi">10</span><span class="p">)</span>

        <span class="n">waiting_offset</span> <span class="o">+=</span> <span class="mi">20</span>

    <span class="n">gc</span><span class="p">.</span><span class="n">collect</span><span class="p">()</span>
</code></pre></div></div>]]></content><author><name>Tiffany Qian</name></author><category term="posts" /><category term="project" /><category term="coding" /><category term="how-to" /><category term="engineering" /><category term="transit" /><summary type="html"><![CDATA[public transportation lovers wya!!]]></summary></entry><entry><title type="html">对牛弹琴 - playing music to a cow</title><link href="https://tiffanyqian.github.io/blog/20250829-playing-music-to-a-cow.html" rel="alternate" type="text/html" title="对牛弹琴 - playing music to a cow" /><published>2025-08-29T00:00:00+00:00</published><updated>2025-08-29T00:00:00+00:00</updated><id>https://tiffanyqian.github.io/blog/playing-music-to-a-cow</id><content type="html" xml:base="https://tiffanyqian.github.io/blog/20250829-playing-music-to-a-cow.html"><![CDATA[<p>“对牛弹琴” (duì niú tán qín) is probably one of my favorite Chinese idioms / ChengYu of all-time. Quite literally, it translates to “playing music to a cow”. Historically, the “琴” (qín) in this phrase is the Guqin (古琴), a traditional Chinese string instrument. However, many modern translations (including the one I originally learned) tend to translate the “琴” (qín) to piano, as the Chinese word for piano is 钢琴 (gāng <em>qín</em>) and shares the same last character<sup id="fnref:1" role="doc-noteref"><a href="#fn:1" class="footnote" rel="footnote">1</a></sup>.</p>

<p>And now, I’m going to go a rant on how <a href="https://beatricebaker.com/wp-content/uploads/2021/06/post2.jpg">the curtains aren’t just blue</a><sup id="fnref:2" role="doc-noteref"><a href="#fn:2" class="footnote" rel="footnote">2</a></sup> and tie this ChengYu into some other thoughts I’ve been turning over in my head… Stick with me here as I am about to embark on some Roland Barthes and the Death of the Author shenangians.</p>

<p>The phrase itself is supposed to be a little condescending- it’s used to imply that the speaker (the person playing the qín) is explaining something too sophisticated or profound for the listener (the cow) to appreciate or understand. Sometimes it’s also used to imply that the speaker is wasting their time. It’s very similar to idiom “do not cast your pearls before swine” from the Bible.</p>

<p>You may ask, Tiffany, how come this phrase is your favorite ChengYu? Are you implying that you think you’re so esoteric that the people reading this aren’t on your level?</p>

<p>Quite the opposite- not only do I love to find meaning in inane and meaningless things, but I love cows! Some of my favorite pieces of media are ones that are surface level silly but have much deeper elements if you look closer. Also, many of my friends will know that in college I had a period of time where I was obsessed with cow print. I’ve had cow print on a bag, on my bed sheets, and even painted cow print on my nails pretty frequently.</p>

<p>Back when I had first learned this phrase, I would imagine it while practicing piano. I’d be be bored, trying to hit my 1 hour daily practice quota, and zone off imagining that I was playing for a herd of cows that were equally as empty-minded as I was. It was a little inside joke between me and the imaginary cows in my head. So, as much as I logically knew that the phrase was condescending (my mom also loves using this phrase offhandedly), I always found a certain sense of whimsy and irony in it.</p>

<p>Finding out that cows actually <em>love</em> music and react very positively to music also added to this sense of irony. Music, in fact, can make cows feel more relaxed and enrich their living environment<sup id="fnref:3" role="doc-noteref"><a href="#fn:3" class="footnote" rel="footnote">3</a></sup>. There are also many videos online of people playing music for cows in an open field, and the cows will run over and listen intently with their tails swaying. Here’s one of the first few I ever saw and personally enjoy:</p>

<!-- Courtesy of embedresponsively.com -->

<div class="responsive-video-container">
    <iframe src="https://www.youtube-nocookie.com/embed/lXKDu6cdXLI" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe>
  </div>

<!-- https://www.youtube.com/watch?v=lXKDu6cdXLI&ab_channel=newhot5 -->

<p>To me, the irony is that “对牛弹琴” is also something delightful. To be the cow is not a bad thing. You can be explaining something that someone else doesn’t fully understand, but they are still happy to be there and enjoy listening. To not understand and to be unengaged are the distinctions here. There are things that people will talk to me about that go right over my head, but I will still happily ask more about. There are things that I enjoy sharing with people that are willing to listen, even if they don’t fully understand as well.</p>

<p>In fact, I think this concept is an undercurrent in many aspects of my life. I happen to be lucky enough to have friends with a wide range of interests that I know barely anything about (#DEI win). I love hearing about any and all of these things even if I’m not personally well-versed in the subject- what matters is that I care about the person and the aspect of their life they are willing to let me in to see. I love that! It makes a person interesting and fun and just a joy to be around.</p>

<p>Even on the flip side, sharing things that other people don’t fully understand can be fulfilling, and I am really coming around on that. I would consider myself more of a jack-of-all-trades kind of person, and I have a bajillion different side projects I am always picking at. But, I’ve been putting off compiling these threads into this blog between a lack of drive, work, and sometimes just the worry that a single side project isn’t substantial enough for a post. I’m sure there’s some part of my brain that’s going: “who even cares about this nonsense you’ve been doing in your free time, go do real work or something”.</p>

<p>But, I’ve been inspired by a lot of things recently: one of my friends is getting more into pottery, another is making mead and other alcoholic brews, another is making a Medium blog to start writing more about political events, and so so much more. I ask them to share the effort they put into these things with me because I love to hear about what my friends are getting into, so why would I not do the same back? It finally made me sit down and write out my thoughts about this ChengYu, as silly and ironic as it is.</p>

<p>All that is to say, I am piano player and I am the cow. There is music everywhere you care to look. Thank you for listening, and I hope you found some enjoyment out of it all!</p>

<hr />

<div class="footnotes" role="doc-endnotes">
  <ol>
    <li id="fn:1" role="doc-endnote">
      <p>Actually, 古琴 (gū qín) used to be just referred to as 琴 (qín). The first character 古 (gū) was added for clarity as other stringed instruments like pianos (钢琴, gāng qín) and violins (小提琴, xiǎo tí qín) used the character 琴 (qín) as part of their names. <a href="#fnref:1" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:2" role="doc-endnote">
      <p>There was this meme (circa 2016 or so) that poked fun at English teacher’s overanalysis of literature, specifically that many teachers would over-interpret the “blue curtains” as an indication of sadness. The meme is that the curtains are actually blue. My personal opinion is that most things do have meaning, even if it was not intended, but it is a fun callback. <a href="#fnref:2" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:3" role="doc-endnote">
      <p>Ciborowska P, Michalczuk M, Bień D. <a href="https://pmc.ncbi.nlm.nih.gov/articles/PMC8698046/">The Effect of Music on Livestock: Cattle, Poultry and Pigs.</a> Animals (Basel). 2021 Dec 16;11(12):3572. doi: 10.3390/ani11123572. PMID: 34944347; PMCID: PMC8698046. <a href="#fnref:3" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
  </ol>
</div>]]></content><author><name>Tiffany Qian</name></author><category term="posts" /><category term="ramblings" /><category term="silly" /><summary type="html"><![CDATA[“对牛弹琴” (duì niú tán qín) is probably one of my favorite Chinese idioms / ChengYu of all-time. Quite literally, it translates to “playing music to a cow”. Historically, the “琴” (qín) in this phrase is the Guqin (古琴), a traditional Chinese string instrument. However, many modern translations (including the one I originally learned) tend to translate the “琴” (qín) to piano, as the Chinese word for piano is 钢琴 (gāng qín) and shares the same last character1. Actually, 古琴 (gū qín) used to be just referred to as 琴 (qín). The first character 古 (gū) was added for clarity as other stringed instruments like pianos (钢琴, gāng qín) and violins (小提琴, xiǎo tí qín) used the character 琴 (qín) as part of their names. &#8617;]]></summary></entry><entry><title type="html">Zachtronics Fortune’s Foundation - Data Collection</title><link href="https://tiffanyqian.github.io/blog/20250226-zachtronics-data-collection.html" rel="alternate" type="text/html" title="Zachtronics Fortune’s Foundation - Data Collection" /><published>2025-02-26T00:00:00+00:00</published><updated>2026-03-30T00:00:00+00:00</updated><id>https://tiffanyqian.github.io/blog/zachtronics-fortunes-foundation-tracking</id><content type="html" xml:base="https://tiffanyqian.github.io/blog/20250226-zachtronics-data-collection.html"><![CDATA[<p>As you all know, I love solitaire and minesweeper so much that my favorite games are modified versions of them. Zachtronics has a bunch of solitaire variants, and one of my favorites is Fortune’s Foundation. It’s “fortress style solitaire” that has another suit made of the Major Arcana tarot cards. I call it tarot solitaire!</p>

<p>This may not make much sense if you’ve never played, but I’ll try to explain the important points to know for this data collection I’ve been doing. The tarot cards ranging from 0 to 21 are their own special suit, and notably they can only stack from 0 or from 21. Whatever tarot card is the last card that gets put up into the stack is the “reading” that you get from that game. Super cute. After a while of playing, I started wondering if there was any pattern to the tarot cards you can win with. My initial theory was that the card wins would result in a Bimodal distribution due to 0 and 21 being the starting points. However, because of the challenge, I know that I sometimes try to go for as close to 0 and 21 as possible… thus, data tracking of wins to see if there actually is a pattern or if it can be affected by play style.</p>

<p>I started tracking my tarot solitaire wins around October 2024. As of 03/30/26, the win spread looks like this:
<img src="https://tiffanyqian.github.io/blog/assets/images/posts/zachtronics_ff_wins.jpg" alt="Zachtronics Fortune's Foundation Wins" /></p>

<p>As of right now I’m not seeing much. As expected, 0 and 21 aren’t as low as expected because I enjoy trying to make myself go for them. This will continue to be updated with further wins, including data from other friends that are willing to indulge me!</p>]]></content><author><name>Tiffany Qian</name></author><category term="posts" /><category term="bigdata" /><category term="puzzles" /><summary type="html"><![CDATA[As you all know, I love solitaire and minesweeper so much that my favorite games are modified versions of them. Zachtronics has a bunch of solitaire variants, and one of my favorites is Fortune’s Foundation. It’s “fortress style solitaire” that has another suit made of the Major Arcana tarot cards. I call it tarot solitaire!]]></summary></entry><entry><title type="html">Film Dump [20240730]</title><link href="https://tiffanyqian.github.io/blog/20240730-japan-film.html" rel="alternate" type="text/html" title="Film Dump [20240730]" /><published>2024-07-30T00:00:00+00:00</published><updated>2024-07-30T00:00:00+00:00</updated><id>https://tiffanyqian.github.io/blog/film-dump</id><content type="html" xml:base="https://tiffanyqian.github.io/blog/20240730-japan-film.html"><![CDATA[<p><strong>Japan Trip - June to July, 2024</strong></p>

<p><em>Shot on Pentax Zoom 60x with Fujifilm 400</em></p>

<figure class="half ">
  
    
      <img src="https://lh3.googleusercontent.com/pw/AP1GczNu6vxFVPPlHWV1KCvW5wEq7zTbfBMJfwpK5FN_80pdm8IlcTRvDn28-loR5HXxVVTILW2FfXGvwe9VZroP0exu9GpXmXFR1cKvQW-I06HDrID-QEgS4i0qs9eU401jaDBPj3sDNM6URtCrrXfRaHU9=w957-h635-s-no-gm?authuser=0" alt="FILM 000" />
    
  
    
      <img src="https://lh3.googleusercontent.com/pw/AP1GczMPqPC3fxk29uo-nCtzAqxSkLDkjrTHb1IOVEzicu25hdosl0i4bwgJ9T1t0f6JlMgisz3yqt12eryAiU9Z223iv75mA9oPmRJouiI6v0270GEZ8FdF2IvwDhmn5APDrUYlb5XywamAptBg0BRjQA0L=w957-h635-s-no-gm?authuser=0" alt="FILM 000" />
    
  
    
      <img src="https://lh3.googleusercontent.com/pw/AP1GczNqbhzGedruljNvQa0Dfhgr8FwkexlQh-uDy1q44W5y_Zpzh79EhkBb9dtV2zrWIuu5UMmTUAufqTnw_2UCLNGEkfAPJrsssga8dCkolAMapGKuOs8hdMqA2pb1AijvsT0m12NdhTqw-FKVDO3q3rxo=w957-h635-s-no-gm?authuser=0" alt="FILM 000" />
    
  
    
      <img src="https://lh3.googleusercontent.com/pw/AP1GczMo-hX-jxAkcwakot6lRmZiCdWhB6N8CApskl4AHXneezJgTfhg2twgMVFE3uh7l-Rn8rzdQgAoXNQapLyg3xALbaG2W8GUyWL7ji1GHufhmuxvpZIy3bqzN5by2Ex8rVmpGITBCozk1h_Ya32stFku=w957-h635-s-no-gm?authuser=0" alt="FILM 000" />
    
  
    
      <img src="https://lh3.googleusercontent.com/pw/AP1GczOGXeiWL-nswWiL7mP4miklupmccSX-SlC2Cxrk3GC6OXDQ2Ojps5rq3KrkjKR7O1GV7_P2ycr8HQ33BKQRhWXUdLl9zkcGlkfqjeGe8O7bv-fRwO-sI5nGyyRZy5JU4gCimZVYzb9brD5rj4eAyQfZ=w957-h635-s-no-gm?authuser=0" alt="FILM 000" />
    
  
    
      <img src="https://lh3.googleusercontent.com/pw/AP1GczMWgZT9RUmm0b9M4WGDOPHzF2UaWzVtVxM8tQRX5za0pM1j7NANmJH5eGujpUUe8imGfVCNuUppFkeIKqn8b2T4IefGI1IasQT_4zT3vZsilrS8QL_5ULAXu6Dn5ZvD_MRewG_xL5evV3MdT_wpH3Lr=w957-h635-s-no-gm?authuser=0" alt="FILM 000" />
    
  
    
      <img src="https://lh3.googleusercontent.com/pw/AP1GczMs5ZYlako1LdkaaDRLTZYywPUshNP2HObuOSJnqGIr8kwrYnayMYoyrcefxFZHVFAtsGdAwSteWjAPX8YSx1pvdnDGiGUo6HAe182lgTN8jrc8LZoBO1ykjXprggJ0GW460erFMlKxSXpYSBSCFLbE=w957-h635-s-no-gm?authuser=0" alt="FILM 000" />
    
  
    
      <img src="https://lh3.googleusercontent.com/pw/AP1GczNqbhzGedruljNvQa0Dfhgr8FwkexlQh-uDy1q44W5y_Zpzh79EhkBb9dtV2zrWIuu5UMmTUAufqTnw_2UCLNGEkfAPJrsssga8dCkolAMapGKuOs8hdMqA2pb1AijvsT0m12NdhTqw-FKVDO3q3rxo=w957-h635-s-no-gm?authuser=0" alt="FILM 000" />
    
  
    
      <img src="https://lh3.googleusercontent.com/pw/AP1GczM5FWqTozD2l0WiTt2eYs8HY8ZBx5bWu1R2m60wyc2zI5Tc2BQNYlgduTrRLfgdLO0gJ3KG_oBioK3tvwcjBVSCKUL3VKXcQlIStTBKeZbEvrP9MuPpHUtUlT_ylFtCw4gPdG1J8_Ozs2h0wHwNiwnA=w957-h635-s-no-gm?authuser=0" alt="FILM 000" />
    
  
    
      <img src="https://lh3.googleusercontent.com/pw/AP1GczPrZSaeSXUHoRhvt8ycud03raBYF9j2v3_gM-BHrlr6OoWSXvmAq3GVUhpzgkjMi-I93e0PK2OKizss3FoLv1eIR3U91zDoREouClIBmnnb6Xb3pUQXAJKqxjniGE2UwSxb09osd5tShWIjd2NeZnkA=w957-h635-s-no-gm?authuser=0" alt="FILM 000" />
    
  
    
      <img src="https://lh3.googleusercontent.com/pw/AP1GczPT4Yw_3_0FSaNmPMzMdkhDyx3vKq65VzM_Eij_gWSXYFG41aEzOKw7mZON5BTqw7okLAYiWa-24nf8Sn3nWUHBonibsormL8zB_bb2Gg4eiL-ia-7H-neTr3TpQhiBudaGppEO-RYwEhcka3Ye7FBa=w627-h945-s-no-gm?authuser=0" alt="FILM 000" />
    
  
    
      <img src="https://lh3.googleusercontent.com/pw/AP1GczOgxEjVhbTcKMV4ZMITxh8YbxvhE09iVOVLubxniTKYtlK1gfbWNyUeGayQ1NkikwDblTspOOcg0dcZZauM-YOvVQ4-h2QU4_Am-nsoYpcOF9tQ6Ecko2-Brd5Ep8Ve06SUN0pVdWYHW8-uVFj-EeSt=w627-h945-s-no-gm?authuser=0" alt="FILM 000" />
    
  
    
      <img src="https://lh3.googleusercontent.com/pw/AP1GczNnAAIANE4M4pZYj1fv-eIuWjPYPyAv-RAYpmLSjOhB5k7--y0AVWGyTjUxJsmQemJiOzpZ00dTEO89J6y-gZ6sAYlDpdJKFLpjHKF1BiWzx-BrpjTXIkU8YwLxxsZUNtOZbdiMngN-_jttF--sK5PL=w626-h945-s-no-gm?authuser=0" alt="FILM 000" />
    
  
    
      <img src="https://lh3.googleusercontent.com/pw/AP1GczOJB0VSuicU7hIPMIc30vVyd2wAiT7JSOWEWuh9oJDkrUJq7FDdBeMpW2Pd_FuQJVsL8sAR4ygLpFzOOtdTijPujfu9zjV50ttY6Rr-GMH65yDPdlCv9METq1Mrb3ILxraGfmDtDo3Mpx4Ns4GJHw9M=w626-h945-s-no-gm?authuser=0" alt="FILM 000" />
    
  
    
      <img src="https://lh3.googleusercontent.com/pw/AP1GczNxQbH--fneXjFQ2MgTJAWpyA0SPS8-KhlWXC0TdippHSFvVN-iOaA3ZaDgL5F5XFQkbiMpUexMGNTNe1MjqqE6gcjY7QOxzaXMk2wAGmSOsnHDgrTBUZFNxYojl4E-SmdPxFtn7lzYNJABmL6-XrNn=w626-h945-s-no-gm?authuser=0" alt="FILM 000" />
    
  
    
      <img src="https://lh3.googleusercontent.com/pw/AP1GczP-WQ8Pgu7_qm_FGnrshJk5ukoovOZOrUK2jEy7TX7U2bfbqL-jUga3boVwJTQN3UBBhfH6k9kdIHvpOxuw1WMGliRzCsYKt4-zdkt9jbRHG2b4e-_w1_dTrqNWOjCtNs1Ov7cu_BG5RzI4ywB_Wd_i=w626-h945-s-no-gm?authuser=0" alt="FILM 000" />
    
  
    
      <img src="https://lh3.googleusercontent.com/pw/AP1GczOYXvc4VGYvMuRG03aTEVbggcgGwTPVTC3MCL9_g4TAfhkFb5RKQ7nLdakxnT79FTY-Vil2u7Fmo2C1oUr649b8DSbwqI08ocYVlyzehKnRkMsX75lxHmzkSNQOBKw4-Jf7sSgUyoQQXLolInIJwBuT=w626-h945-s-no-gm?authuser=0" alt="FILM 000" />
    
  
    
      <img src="https://lh3.googleusercontent.com/pw/AP1GczPY9nd2w28MizJLUkG6Dh6rJQTSkOj_uc0flJDfWsFuf0jPrhFHvwzoKfvSMeExFfgmSV02PAvDTdpQy5eB6uK7fIoDNT0uZtEHeAsi2ld7pn2HXLmDcR-HZbsjEB0vph-E2W51FQyVVTvHgbkMwRK5=w626-h945-s-no-gm?authuser=0" alt="FILM 000" />
    
  
    
      <img src="https://lh3.googleusercontent.com/pw/AP1GczNLFI9pvqQYFvgmlVNAJ-UOr_qdm0kX7meFaLy-tY5x5r6WAUkOPSiGADoF3LC8KHtjqiRuW3_dhPVoycOUgEY_e6kOWhHyA7-zqWelsoBkTBF3_FLViv12Yj835PdqgOccd8qmfy7Ve_rtPDe5KwAA=w627-h945-s-no-gm?authuser=0" alt="FILM 000" />
    
  
    
      <img src="https://lh3.googleusercontent.com/pw/AP1GczPqVbUmZq-7tYZUKa9YyBbDysMp8L0kuNFxJiEutiZ_xIKEd8SDaYRzXDO8xowE_Po2IAfu1Yh6msmwzK44wNtIsVgHx_5dq4HYFes2ZDy8zjljo5fmR9ovPrZNlKwwyTM4A8nL6AEeRd9kp17kn7mR=w627-h945-s-no-gm?authuser=0" alt="FILM 000" />
    
  
    
      <img src="https://lh3.googleusercontent.com/pw/AP1GczNwJEZjE0Dtv-6sNZdVsrdUR710LMQyuEUVdOKik6ZFUncGRjkLyhlb_-9m0T5Dg5smaOiYlmz4MRWa0AKJN7XiylwQMrdlDh9y4BksJydup3h75J8MslgRuPA-HwrNsts7CofxUP4qYMsuQfhIkFek=w627-h945-s-no-gm?authuser=0" alt="FILM 000" />
    
  
    
      <img src="https://lh3.googleusercontent.com/pw/AP1GczNQxIHT_FV91_YJazgcvTiNcirMzxssxkKsV8TScMfQDrLGjDs-xMiln5zh1kMTQ5vfXcFsTCtu7Z9FVNTGZOZwZa54eVuvFnTcDesY_oBso153DCnJYm-axIM-dhidxxoiL7MpmRZDzA8Fa_SO2ltl=w627-h945-s-no-gm?authuser=0" alt="FILM 000" />
    
  
    
      <img src="https://lh3.googleusercontent.com/pw/AP1GczPN0PivEEoe40bPqQrAFBm9wd1aqtFJxtC_1QbD8qxWVFRskiPOD-S_tCgV3Oa0qbFdtDckRNXSuzjNhuu9-t6SUmaDsiahr0VIkPG_d4y4-6aKXM_daXg-7NeSjo_75GZH7qASmde3fjFKsn1zYQRl=w627-h945-s-no-gm?authuser=0" alt="FILM 000" />
    
  
    
      <img src="https://lh3.googleusercontent.com/pw/AP1GczP34ibk-ilXXxbQJeCIfxVKaP-N0CxIFZJbRzx8USE_3mmPT_sJkgpIVl8lehL6GzNJ_LM2Qy49KWcP3M7UVk7yNIRhMn_YbJJTeSPxxTKLMGtZnzBn6upcaE0599XKImdj8if5aHJ9dp3k_b9so5gx=w627-h945-s-no-gm?authuser=0" alt="FILM 000" />
    
  
    
      <img src="https://lh3.googleusercontent.com/pw/AP1GczN_bGDiY6EnyiqOKGWICxFqmeZvm-fvHmXiSeeceSw1u2AwyZDnbeUDHrLRKudWSSJvUosn7VLTN-5jFEliHtO4GpdxbM4JONy2X4t1j1KozTopWFltHUERVsM5g7HHXz5uxg2loqPX469KPfSuaeYq=w957-h635-s-no-gm?authuser=0" alt="FILM 000" />
    
  
    
      <img src="https://lh3.googleusercontent.com/pw/AP1GczNtscO-WO0n9ShJjDNwBBoasMcz0-hFIJR-AuQEPH8OWuSwiIoVmHnRYqmtJvz4Il_ZnH245NvSG59tF1cuD4C4fW7SMdodPM1ghvQ6WaoSYzL_-Rey11QYA0QgQnXOYWFN-xdnEJwFOSV50ss4Wfqx=w957-h635-s-no-gm?authuser=0" alt="FILM 000" />
    
  
    
      <img src="https://lh3.googleusercontent.com/pw/AP1GczNQ_Xp4Rgjer2rVoViTTNbbll-VS45aiIros3Ez8yFdZRuggJ0aVFseAZp70ZEa2x0PsCkVskEO5oUrPIML_4Smm3TuDDh91HpdYmWbMQ2AtfJUGRfQTBGsPxZzhsTDEBWB_cx8fRr-XtdtINPzx1Kr=w957-h635-s-no-gm?authuser=0" alt="FILM 000" />
    
  
    
      <img src="https://lh3.googleusercontent.com/pw/AP1GczMIcMBufaSvPFa1qkZiCqUzlLJfpkfdP3sPPEA_jEZaoBLaiVOwkTOV11IMlhipzQ0a5V-I3wHQW-4mDHIfAKj2w8ABFH9ZQwNQK0oGhddVKTJCls9BUqAi1e31LnSz_zykcxrfcHOlr617DqGb2Z32=w957-h635-s-no-gm?authuser=0" alt="FILM 000" />
    
  
    
      <img src="https://lh3.googleusercontent.com/pw/AP1GczNbNvwC55A2PNiu77Yr9bhEUOeLfo8-zwl-zCD9ViGyYa1Mzxxg4Ci5rU3ZSOMZVzHww4bRDwQZoXRN6oeJDIJ9VgyVMbpvG_Te_aaPCA35ogC19z0zKBvNSJqEZCOsdwJrN37L3kALRrVWXWoA38gL=w957-h635-s-no-gm?authuser=0" alt="FILM 000" />
    
  
    
      <img src="https://lh3.googleusercontent.com/pw/AP1GczPf7NQHf32xdqO02J6v40CWlYHBZLbh7eGfrXw6PiCt5npvvuz-KR_kSqAPuRZ_aLkadn8PGiP5BvoL_kyBCdx6B8mDoZLkD_e_PN7BjC8zJ4r2Dd2DMY4ObYqnexZ4EfNdz-hlvx4dVftOitsk6Hqc=w957-h635-s-no-gm?authuser=0" alt="FILM 000" />
    
  
  
</figure>]]></content><author><name>Tiffany Qian</name></author><category term="art" /><category term="film" /><category term="personal" /><category term="photography" /><summary type="html"><![CDATA[Japan Trip - June to July, 2024]]></summary></entry><entry><title type="html">Film Dump [20240607]</title><link href="https://tiffanyqian.github.io/blog/20240607-may-june-film.html" rel="alternate" type="text/html" title="Film Dump [20240607]" /><published>2024-06-07T00:00:00+00:00</published><updated>2024-06-07T00:00:00+00:00</updated><id>https://tiffanyqian.github.io/blog/film-dump</id><content type="html" xml:base="https://tiffanyqian.github.io/blog/20240607-may-june-film.html"><![CDATA[<p><strong>Minnesota Summer, May to June, 2024</strong></p>

<p><em>Shot on Pentax Zoom 60x with Fujifilm 400</em></p>

<figure class="half ">
  
    
      <img src="https://lh3.googleusercontent.com/pw/AP1GczOdN2GeRSgUC4QB43NGnpbeCEVJIsC3IaG2wGOvNrlzzwholhLjWnbGVR7s5LiXlHXBB-vr_uDezTZgNJb9CfWXytwGxURdch5CWHXPlh-LRrEgtA5rfT236X-ctX_sdA8cy8ePLBwUfXIHKi2ZgNh1=w1428-h947-s-no-gm?authuser=0" alt="FILM 1.001" />
    
  
    
      <img src="https://lh3.googleusercontent.com/pw/AP1GczOUt0oxsSRK7Al1b3iUqNXYGILKRMmtQLzPOYWvEA45NqfFAbV38jIdGecBLeVMejWYbM2q5odUEg2lXMu1BIdA8-UAwmJWbAsXBZN_7zK_IRRcV4qaGykhYWPpIUnBkWIWRXU9bTr7K52FPVwlJTOR=w957-h635-s-no-gm?authuser=0" alt="FILM 1.002" />
    
  
    
      <img src="https://lh3.googleusercontent.com/pw/AP1GczPPj8CWL--0nQa_okBxc8cwkFt6UiQZ-MvCcw6-QmDCRto1y4483YL8MaYA3cmCoMv-KZbSJyBOvL6bIMDNrC4gO__rvivjLZYw1azNnoypSTf3jwaPfrojp6cCIHwXENC4CSALWSJA-d7aPBeBJsHI=w957-h635-s-no-gm?authuser=0" alt="FILM 1.003" />
    
  
    
      <img src="https://lh3.googleusercontent.com/pw/AP1GczMGFaxfZSEuo7pe1fO8ZwoEgO4eqtKBI5P1ic2QWEkjFbUAR4_toM8mAih5-yEEhhL43Q29qOOCRV3Kf8c6b5HOzYwEFtUETPLLnY3844by3cIPiohPSEATaf5ScbFU9c0YcHWCdZ9s9aT-H00ThYG3=w957-h635-s-no-gm?authuser=0" alt="FILM 1.004" />
    
  
    
      <img src="https://lh3.googleusercontent.com/pw/AP1GczOUMJpFE3UKByoqQ5ktoi7wDLditDicWtyBDfciEzkGqZ4gFgiSLs0iLEjRf5opPRDmmfz9CyLxvCec9QvMqhfpymPb-eg5dysAqArPm0MBDRvA5CQxqCCw9ibY0V1pDwZ9vWHyWgrsL5s46Wi6ryxV=w957-h635-s-no-gm?authuser=0" alt="FILM 1.005" />
    
  
    
      <img src="https://lh3.googleusercontent.com/pw/AP1GczPhc83zFiu7rn3nPRB5LKBTF-iF-PwSHMJ7gGG0MOeXi_FTGLzznADcSM3pUSml4llQcOrze7bXHUUtyRt4ByJAiUulL42Q49PuA3fJl_5QPoV9t-5bR6eBBrdlISxbx6_P9nlpt7uiIP5vJaX8C_Lw=w957-h635-s-no-gm?authuser=0" alt="FILM 1.006" />
    
  
    
      <img src="https://lh3.googleusercontent.com/pw/AP1GczMMP7XuDWM8szwjCFzqqTrd2j8Cdl20VutSilZF-avrymOCGi-0lZBCJ8kmCwiGweK3nP60x-PbmpEn31-N_3WjjVP9Y5OPf51h9EfeDOunizl1KGwtzou_156yAV5ZEwUb4V37Mpelq0sHLdMVcWMS=w957-h635-s-no-gm?authuser=0" alt="FILM 1.007" />
    
  
    
      <img src="https://lh3.googleusercontent.com/pw/AP1GczNmioEmvmp0rBRRjiu8w4UG_TiaSm5VHda7Q1UAQu7VYRpxdia7jZZTFgm4jItOVEhncHQFbYaAVtHj-FeMkmch8a3nmlKt2xZFOlSVkyadw2_kPL8inQLm5KztG6wlMojsJrdyWu250nbP_Mhu8v8O=w957-h635-s-no-gm?authuser=0" alt="FILM 1.008" />
    
  
    
      <img src="https://lh3.googleusercontent.com/pw/AP1GczNXfuy3A0RqegSAxwlJ0XGAAK57aH4PsmEr_o1IWvtYw6Bp1LGsNLBUbtu7IocKhw3XkeQZ43wscnysj9xsIexl9Chp589VY5ZPseVPnDy2lpBvMFAXPFucIeNCTJ37nJ3hTbmFFUA1UsEPjsDxcW6-=w957-h635-s-no-gm?authuser=0" alt="FILM 1.009" />
    
  
    
      <img src="https://lh3.googleusercontent.com/pw/AP1GczN38XjIHaWE5qzseqEpFzTEGJ53t0iJuBvuDjx3bWGkEQFtxOgtu-t7inG6cdNLZBbVr-C8ZuOmomMDYdOlE-UBcRKxFzFsCzrhZ8PlqTFLpIxWUWxUXrWdNRpMqBrh-JeUmF_c-ZrSyRzJC8ZvK2OK=w957-h635-s-no-gm?authuser=0" alt="FILM 1.010" />
    
  
    
      <img src="https://lh3.googleusercontent.com/pw/AP1GczOnbrzpV9LpLyMrRitx884s6FQg8Y73gh1EpxUyjF8TZfbidLJErZOdS7_YWTx3zDrjiKAKSqaphcB5y8x3nITxnlnj-SYZPPgkaRwhH_49YzBTJQUBJGTzwxNgZWXEf13p1KYp99sxSLmVGU5txLSj=w957-h635-s-no-gm?authuser=0" alt="FILM 1.011" />
    
  
    
      <img src="https://lh3.googleusercontent.com/pw/AP1GczPYq6Z8X0D0kmQ1YgGa-GK_3bTT2co1sIDz9mH6G3ngPuqPVi--PN8kpOSdN4rnIR5ROQLqSEuCT75wJwG7sHHwWFxKk91wUrqm84j_PwaBvs5sLT6Sb9hUzmkupssnpOtIltUegclT07TICqwfDbpF=w957-h635-s-no-gm?authuser=0" alt="FILM 1.012" />
    
  
    
      <img src="https://lh3.googleusercontent.com/pw/AP1GczMwclH-9uz_-LoWEyFWGjRo5pWHorcMms4VYIm-ouyogFgFdBVZQ3-BVnj9jHXh4xhSEPiEbK4tvKz4IPvE2KBoNwBWIzYxNLaWx_slZWMuQV0aUlfeTSeKxoi_76M8smrYNoMEWW_U8BywXLZj9bFa=w957-h635-s-no-gm?authuser=0" alt="FILM 1.013" />
    
  
    
      <img src="https://lh3.googleusercontent.com/pw/AP1GczPkoASyhORwCHbvL5KJxNfi874A0S4m2DOfGU5fOWupnw831W79hlfa81rRD5EIVGscdwUQg9ZB-MdNKaZn09A7LOINw6t2YBwR3hujtVSZkPMvz5B2mEZ2d-hfXnAed9a6BTGBgRM8TU06X3OLAg4e=w957-h635-s-no-gm?authuser=0" alt="FILM 1.014" />
    
  
    
      <img src="https://lh3.googleusercontent.com/pw/AP1GczNGN0FL5hVDsNwdXKK0SA30U6_hOhN2wYk2ibDNMZWEn6gRUpjz6JY_UifVKfcKCNty7Evw5oeZw4xSt1jO4tEAHyfuXNQK4WcKprOftc3Yve9NHa921OUWkq2SCEkG1YBxw8oKnD5hHnVN6QJ8Ebtz=w957-h635-s-no-gm?authuser=0" alt="FILM 1.015" />
    
  
    
      <img src="https://lh3.googleusercontent.com/pw/AP1GczPUIZTozcSjyV0byiBApXi0QU3XH3rpJhCRUAvwLZ95KTy8Sf-tXb3elS4WtekROVwOm8IAf_5119fBgQzw7eJ9-1rHPbD3fGTxN07Ze69D7kreUwcCvUW0yqf8BnCm9D9lTAOr3o5pOvVED1Y2iho1=w957-h635-s-no-gm?authuser=0" alt="FILM 1.016" />
    
  
    
      <img src="https://lh3.googleusercontent.com/pw/AP1GczMIt8Ex9samHrnqC-nWTEX6OBYJ5y49vCk9N276_SQl4kz6Xvxi0zS6iou4E-HpCydMW7VE5QhENsioXXkIKzGjcJDb_W04IVhcN1i0IA21dchVXZwB6cQonu19M5qZ6oSVsL1a6u6hdrK8Ejj5p2xL=w957-h635-s-no-gm?authuser=0" alt="FILM 1.017" />
    
  
    
      <img src="https://lh3.googleusercontent.com/pw/AP1GczN7pB_vBpwJfS618Em3KsoEtAvkFvnjK7mjR2YryOwv_xGDHxLXAq0uVl0d9zDxKRZdxOjjiaBYm1EcWK69VtOqVjGnhXqd3Hh4-72pQ3OguzIrGV01YSVS9BD2GLikDnkfum0D-vk45_LXA57l67Xb=w957-h635-s-no-gm?authuser=0" alt="FILM 1.018" />
    
  
    
      <img src="https://lh3.googleusercontent.com/pw/AP1GczPOnIrDxpmW9cfb2skNMKn3LOORUZOLPtRfuuKLF52jnV6uiJa6ij_cFSbZVrcmWghqe05sTr8qWZtIuPfGgk58zuf2cK4vU_8P5kRK-waHBS99bN4rotit1OGrpkOjq35SD_z3-kGX9dZdFUUvSeNF=w957-h635-s-no-gm?authuser=0" alt="FILM 1.019" />
    
  
    
      <img src="https://lh3.googleusercontent.com/pw/AP1GczM9hyfb2IP4JYK6eTsaK9z4GfCHUSqKk7LKXlym1Dkj2P7zfejRQOUX0j3dUMV_JAi2S98gYA4bWgKRXBuHaCk1fyRc3ZAQSrFvIz0wEcGy6YzHfFlGx3AoiEU5xp2yS19XiUvyrb76NqLVn11W-aRo=w957-h635-s-no-gm?authuser=0" alt="FILM 1.020" />
    
  
  
</figure>]]></content><author><name>Tiffany Qian</name></author><category term="art" /><category term="film" /><category term="personal" /><category term="photography" /><summary type="html"><![CDATA[Minnesota Summer, May to June, 2024]]></summary></entry></feed>