Quick website news. I’ve added callouts for some areas of the website, including the newsletter at the bottom.
I removed a bunch of social links that no longer are representative of where I’m at online.
I’ve removed the two-layout style for a single one since the content I’m usually here to bring is not worth the width.
I’ve created link previews! For select (and recent) links, I’m now using a LinkPreview Astro component.
It’s using the metadata from websites to create these nice link previews.
There’s a manual override in case the parsing did not reach my standards of link previews.
As an example, the new Track Star Podcast is awesome, and here’s the latest episode I watched.
There’s many other small updates to make the website feel more user friendly, including updated pagination and updating tags.
Also, the line breaks in essay content is longer now, so you can figure out if you want to choose to read more.
I’ve been thinking how much politics I’ve been paying attention to since the inauguration.
I think the expectation things would be different and the enthusiasm felt about how some tech folks thought we could built government better was at best a shortfall.
I didn’t have those personal feelings as I felt much the opposite, on how to prepare for authoritarianism and tyranny.
That’s why I think this podcast conversation between Jasmine Sun and Kelsey Piper was an eye opener to understand and keep tabs on the tech community sentiment on current US politics.
This pairs very nicely with understanding extremist views from Nadia Asparouhova’s book release this year, Antimemetics: Why Some Ideas Resist Spreading.
I have a lot to say about this book, but I’ll do a write-up later.
Back to the conversation, I think my previous post about how the vibes are off is a much better metric of how Democrats lost the 2024 election in a huge way because they were not assessing what public sentiment was anymore.
We need more acknowledgement of real-world struggles, not the stats of GDP numbers.
Back in the day, I used to get the SF Chronicle newspaper delivered. They had this iconic “Little Man” where I remember seeing them in movie reviews. I was never the biggest fan of the star rating system. The thumbs up system that Siskel and Ebert had was a little better as two critics giving their opinions. The little man had visuals that explain how I would recommend a movie to someone. As not even worth your time, something to sit through, and standing ovation (or in the little man’s case, jumping out of your seat clapping).
I started using Arc March 2023 and thought I’d never have to look back. It was a really exciting browser to use with so much potential. I loved watching videos they made about potential features that could be extremely useful.
Now that the Browser Company (BCNY) has gone all in with Dia Browser, the support for Arc has been just the essential, i.e. Chromium updates. I had a custom Chrome extension break a few weeks back, and I could see the writing on the wall. If this company doesn’t want to fix their browser, then it’s time to migrate. But where?
The Alternatives
Really, there are a few browsers I thought are worth migrating to.
Dia Browser
For the same reason I don’t want to use Comet (Perplexity’s browser), I don’t like these AI-forward web browsers. At least yet. There’s the privacy concerns that get to me, especially around memory. And I just don’t think they are ready for prime-time yet. Plus, I feel really slighted by BCNY pulling the rug from under us with Arc, and I don’t know if I’m ready to migrate to a beta product from a well-established one.
Brave
I’ve used it extensively before around 2017. I think their Crypto play is strange, and I usually converted my BAT into BTC or ETH at the end of the day. But those Ads were really annoying. I eventually went back to Chrome.
Safari
I already use it as a mobile browser, and I’ve thought about doing it. They have the sidebar, but it doesn’t feel as snappy and feature-tich as it should be.
Zen Browser
To be honest, I tried it last year, and couldn’t bite the bullet to switch over. It felt like an incomplete product at the time, with alot of the things I loved about Arc just not there. That fear has since been squashed now that I’ve used it fresh again, and most things are there. The folders aren’t there, but honestly, they aren’t a priority for me as much as having access to my custom extensions. I made the push last week and have battle tested it. It’s ready to go, and really snappy too.
Migrating to Zen Browser
I’ll walkthrough the different steps that I had to go through when migrating from Arc to Zen.
[!Note] This section was AI assisted. How? I wrote an initial outline and checklist of all the things I had to do the migration. After checking off the essentials, I wrote up a bunch of gotchas and saved the links. After that, I shoved my note into Gemini 2.5 Pro and asked it to summarize this. After the initial generation, I edited the piece and made it sound more in my tone and language.
1. Import Bookmarks
The first step was a standard bookmark import from my previous browser. I used this tool to do the export from Arc since there’s no native way to do it.
2. Create Spaces
I recreated my Arc-style workflow by setting up the following Spaces:
Work Planning
Work Focus (a programming space)
Work Design
Personal
House Management
Financial
3. Install Essential Extensions
I installed my core extensions:
1Password
My personal “Markdown Copy Tool” that I have customized for specific sites
uBlock Origin (this one is huge. Screw Chrome and the manifest v3 changes that cut-off a really good ad-blocker)
Obsidian Webclipper (I also imported my existing settings for this)
4. Configure Browser Settings
Search Engine: Switched the default to DuckDuckGo. (Maybe Kagi in the future)
Auto-Tab-Closing: Actually never set this up, so reach out if you know how to do it.
UI/UX: Tweaked various settings to make the experience feel more familiar to Arc.
5. Update Keyboard Shortcuts
Mapped a shortcut to Toggle Compact Mode.
Removed the default shortcut for “save page” to avoid conflicts.
6. Set Up Pinned Tabs
I pinned my frequently used sites:
YouTube
Spotify
Calendar
Readwise
7. Add Custom Search Completions
I added several custom search engines to the command palette for quick access:
Perplexity
Kagi
ChatGPT
Reddit
Twitter/X
Brave Search
WikiVoyage
8. Join the Community
I subscribed to the r/zen_browser subreddit to stay updated.
Key Differences & Gotchas
Here are some of the notable differences and things to be aware of when moving from Arc.
Workspaces & Profiles (A Major Plus): Spaces can be tied to a profile, which functions as a Mozilla Multi-Account Container. This means you can be logged into different accounts (e.g., personal vs. work Google accounts) in different Spaces without conflict. Pinned tabs are also tied to the profile, allowing for different sets of pinned tabs per workspace.
Glance vs. Little Arc: Zen’s equivalent of Arc’s “Little Arc” for previewing links is called “Glance”.
Tab Management: Dragging a tab to a different space does not work. You must use the context menu option to move it. On the plus side, Tab Folders are expected in the next release.
Command Palette Limitations: The command palette is not as powerful as Arc’s yet.
You cannot activate extensions from it.
It lacks actions like “Open Dev Tools” or “Take Screenshot”.
Screenshot Tool: Zen has a native screenshot tool (Cmd+Shift+S), but it currently lacks annotation features like drawing arrows or adding text.
No DRM Support: Zen Browser does not have a Widevine license. This means DRM-protected content from services like Netflix or Hulu will not play. From the FAQ:
Zen Browser currently lacks DRM support… This means DRM-protected media cannot be played in Zen Browser for the foreseeable future.
No “Boosts”: There is no equivalent to Arc’s “Boosts” feature for injecting custom CSS and JavaScript into websites.
Local Development: localhost pages don’t trigger a special “developer mode” UI with easy-access shortcuts, unlike Arc.
There’s a idea by Elle from doing postcards about making a note in her app about these themed ideas that then she puts like different media into to see how they fit well with those and I think that if we make a collection like that that would be perfect
It’s only mid-week, and I’m surprised by the end of the month closing in on us. Two months into 2025, and I feel exhausted. Both physically because of sleep, and mentally as I’ve been behind on my weekly updates.
Record (write or voice memo) all of your questions and observations. When done, ask everything to an expert or top-tier AI. Save the answers to re-read later.
The engineers are mostly young men (I found one woman - Alexandra Beynon). If you’re a woman, you’re the secretary, hiring manager, communications, or other non-technical roles
The terrible berating at the white house is the butt of all jokes.
“The vibes are off” is a colloquial expression used to describe a situation where something feels wrong or uncomfortable, even if it cannot be precisely explained. It suggests that the atmosphere or emotional tone of a place, interaction, or event is not as expected or desired. This phrase often implies a sense of unease or discomfort that is sensed intuitively rather than being based on specific, tangible evidence. The term “vibes” refers to a distinctive feeling or quality that can be sensed, often involving shared emotional states or atmospheres.
Gary’s economics explains more of how the public commons perceives the economy vs economists
The vibes are off.
Some advertisers see Meta pulling back from moderation as a signal they should stop pushing social media outlets to keep hate speech in check, according to The Wall Street Journal. Some have reportedly already stepped back:
…the Association of National Advertisers, [which] represents major advertisers such as Procter & Gamble, AT&T and General Motors, quietly ended a brand-safety effort called “Engage Responsibly,” partly to avoid scrutiny or litigation…
And then there’s this.
Maybe when we say the vibes are off, what we really mean is that every person you pass on the street now feels like a glimpse of another dimension behind a glass.
— Whizy Kim, The Vibes Are Off: COVID & Losing Shared Reality
This has been a catch-up week. We cancelled the dinner with Adriel, which I feel bad about. But in that, it’s been trying to rest up. Morgan and I are more seriously talking about kids, so I need to start my research. The world feels more and more ablaze.
Notes
It’s sad the complete carelessness and wreckage this administration.
Given developments at the Kennedy Center, effective today
I am resigning as artistic advisor to the NSO.
Not for me.
It’s been a wonderful 8 years working with Kennedy Center President Deb Rutter, fellow artistic advisor Renee Fleming, and the entire NSO staff, encouraging thousands of fresh new audiences to appreciate symphonic music. Mostly, and above all, I will miss the musicians of our nation’s symphony orchestra - just the best!
I have this folder in my notes app called “hyperspecific media collections”, where I find a specific mood or topic I love and compile a media collection. They consist of book quotes, song lyrics, paintings, and scenes from movies or television shows. I love the idea that all forms of art and creativity are intricately connected, and seeing these parallels and similarities allows me to truly appreciate art.
Colin and Samir interview Johnny and Izzy Harris about their careers and the creation of their media company, NewPress. (Also, see NewPress network’s other shows like Search Party and Tunnel Vision).
Key Principles for Building a Creative Organization
Bias towards action - Make decisions quickly, do things fast, and solve problems without overthinking.
Treat others with kindness and respect, both within and outside the team.
Templates - Find where structure works and leaves room for creativity.
They specifically mentioned templates in the context of creating a reliable system that supports creativity. Templates refer to establishing repeatable formats that streamline the creative process and improve team collaboration.
Johnny Harris mentioned that script templates were a very large document with tables, color coding, and other elements that enable a team to work together with communication and structure. Izzy Harris added that these are structures that still allow for creativity. The aim is to systemize repetitive creative tasks without constraining creative output, enabling consistent execution and scalability.
In my own way, templates have allowed me to stay focused, also had to grow organically because I need to understand the underlying structure first
Care more about getting it right than being right. That lends itself to feedback and being open to it.
The odd thing about Voice Notes
Johnny and Izzy Harris use voice notes as a method of communication to increase efficiency and maintain a personal touch. Johnny uses voice notes, looms, and Marco Polos to communicate with his team, as he can convey what needs to be said in minutes. Izzy noted she is delighted by 6 second voice notes.
Voice notes are useful for asynchronous communication. Team members do not need to be available at the same time in order to communicate effectively
Voice notes allow for more detailed explanations and can convey nuance and tone more effectively than text-based communication
NewPress
New Press is envisioned as a new news media entity that will function as an umbrella company overseeing five to eight Creator-led, independent journalism channels.
Here’s a breakdown of what New Press is, what to expect from its offerings, and how it aims to differentiate itself from entities like Vox, according to the sources:
Structure and Mission:
Creator-Led Channels: New Press will consist of multiple channels, each led by independent creators.
Operational Support: While creators will manage their channels creatively, New Press will handle operational and project management aspects. This includes brand deals, agency relations, syndication, publishing, upload timelines, and providing a project management team and thumbnail designers.
Shared Resources and Collaboration: Creators will have the opportunity to collaborate, brainstorm, and support each other.
Offerings to Creators:
Financial Security: Creators will receive a salary, benefits, and a share of the channel’s revenue as it grows.
Creative Freedom: Creators can focus on content creation without the burden of business operations.
Operational Support: New Press provides a full operations team to handle tasks such as project management.
Content and Accessibility:
Accessibility: New Press aims to make videos accessible to a wide audience by using plain language and avoiding jargon.
Rigorous Journalism: Content will be deeply researched and fact-checked.
Visual Storytelling: Emphasis is placed on visual elements in their videos.
Differences from Vox:
Creator Focus: New Press prioritizes individual creators and their brands over the New Press brand itself.
Talent Retention: New Press aims to retain talent by offering fair compensation and creative freedom.
Revenue and Creative Separation: New Press intends to keep creative and operational departments separate, preventing revenue pressures from negatively impacting content creation.
Maintaining Scrappiness: New Press aims to avoid excessive overhead and bureaucracy.
Key Principles to Guide New Press:
Bias Toward Action: Make decisions quickly and act decisively.
Kindness: Treat everyone with kindness and respect.
Structure: Balance structure with creative freedom.
Focus on Getting it Right: Prioritize accuracy and learning over being right.
It feels like it’s been a long week as Susan asked me to help her with Money, and over the weekend we are having a dinner w/ Adriel. Morgan has been on campus 4 days this week, and it feels like far too much for her.
It’s interesting HuggingFace is using the 671B model to create a distilled model that’s more accessible. I’m curious when I can run one of these small models on my laptop
I’m compiling a list of why AI isn’t replacing the workforce and those other lies. It doesn’t happen as easy as this, and it’s not a 1-to-1 replacement (like the issues that we have without DBAs)
The third week of a presidency hell-bent on ruining our society. I think I’m starting to see the picture now. This week, we took a mid-week break to celebrate Morgan’s birthday. Well worth it, especially to spend an entire day together. The Italian food ruined our stomachs though.
Joel Hooks mentioned Durable Objects as a cloud machine w/ sqlite and a single server session for a single user sounds like a different paradigm. I want to test this out.
This is the vision underlying the technofeudalism thesis, which holds that 21st-century capitalism has been superseded by a new economic system overseen by Big Tech.
Curiosity Snacks - What I call “curiosity snacks” are small, intentional nudges that guide our impulsive curiosity toward learning, creativity, and meaningful discovery rather than mindless scrolling.
Contrary to some of the comments on social media, this was not something we did just this year.
Of course, Google doesn’t want to be accused of any backlash. And given recent events of cancelling cultural celebrations in the name of anti-wokeness, it’s no surprise Google is trying to distance themselves from any backlash.
Here’s the justification from Google’s spokeswoman, Madison Cushman Veld, had to say about this.
For over a decade we’ve worked with timeanddate.com to show public holidays and national observances in Google Calendar. Some years ago, the Calendar team started manually adding a broader set of cultural moments in a wide number of countries around the world. We got feedback that some other events and countries were missing — and maintaining hundreds of moments manually and consistently globally wasn’t scalable or sustainable. So in mid-2024 we returned to showing only public holidays and national observances from timeanddate.com globally, while allowing users to manually add other important moments.
[!note] bolding and links are my own in the blockquote
But let’s talk some stats for a moment here. Google has some dominance with the Calendar we use. Google Calendar is one of the most widely used calendar apps globally, with over 1.2 billion monthly visits as of early 2024. And Google has a history of killing off products. I love Ed Zitron’s idea of The Rot Economy in explaining why this all matters. With such reach, these tech companies should be taking more responsibility in representing the world we live in. But because they don’t, I thought maybe I’ll make my own Calendar and see how difficult this task is.
A few things to note:
I’m not taking suggestions from others. But if I did, I’d engineer a feedback system to determine how to best add new events on the Calendar. There’s more appropriate ways to handle these changes over flat out removing events.
For some ideas, I urge people to read about Consensus Seeking Decision Making Model that doesn’t discount other’s voices and tries best to find a solution that works for the most people.
I’m using timeanddate.com’s full Calendar list as a baseline since that’s what Google used. Of course, there’s some bias in the list since it’s not all inclusive. But they made the list, and I’m guessing their staff had some say in understanding cultural events. We know compromises had to be made.
Some of the events in the list are very locally specific (e.g. to a state, or sometimes unspecified the location when it says “Many regions”). I’m going to omit those for now.
The Calendar
October 2025
Su
Mo
Tu
We
Th
Fr
Sa
28
29
30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
Holidays on 2025-10-20
Diwali/Deepavali World Statistics Day
Full list of holidays
2025-01-01New Year's DayAll
2025-01-01New Year's Day
2025-01-02Last Day of Chanukah
2025-01-04World Braille Day
2025-01-06Epiphany
2025-01-07Orthodox Christmas Day
2025-01-07International Programmers' Day
2025-01-07Estelle Reel DayWyoming
2025-01-08Battle of New OrleansLouisiana
2025-01-09National Day of Mourning for Jimmy Carter
2025-01-10Asarah B'Tevet
2025-01-14Orthodox New Year
2025-01-19World Religion Day
2025-01-19Robert E. Lee's BirthdayFlorida
2025-01-19State HolidayGeorgia
2025-01-19Confederate Heroes' DayTexas
2025-01-20Martin Luther King Jr. DayAll
2025-01-20Martin Luther King Jr. Day
2025-01-20Robert E. Lee's BirthdayAlabama, Mississippi
2025-01-20Idaho Human Rights DayIdaho
2025-01-20Civil Rights DayArizona, New Hampshire
2025-01-20Inauguration DayDistrict of Columbia
2025-01-20Inauguration DayDC, MD*, VA*
2025-01-24International Day of Education
2025-01-26International Customs Day
2025-01-26World Leprosy Day
2025-01-27World Holocaust Victims Remembrance Day
2025-01-28Isra and Mi'raj
2025-01-29Kansas DayKansas
2025-01-29Lunar New Year
2025-01-29Lunar New YearCalifornia, Washington
2025-02-01National Freedom Day
2025-02-01First Day of Black History Month
2025-02-02World Wetlands Day
2025-02-02Groundhog Day
2025-02-04International Day of Human Fraternity
2025-02-04World Cancer Day
2025-02-04Rosa Parks DayCA, MO, NY
2025-02-05National Girls and Women in Sports Day
2025-02-06International Day of Zero Tolerance for Female Genital Mutilation
2025-02-06Ronald Reagan DayCalifornia
2025-02-07Lunar New YearColorado
2025-02-07National Wear Red Day
2025-02-09Super Bowl
2025-02-10World Pulses Day
2025-02-11International Day of Women and Girls in Science
2025-02-11World Day of the Sick
2025-02-12Lincoln's BirthdayCT, IL, MO, NY
2025-02-12Lincoln's BirthdayFlorida
2025-02-12Georgia DayGeorgia
2025-02-13Tu Bishvat/Tu B'Shevat
2025-02-13World Radio Day
2025-02-14Valentine's Day
2025-02-14Statehood DayArizona
2025-02-15Susan B. Anthony's BirthdayFlorida, Wisconsin
2025-02-15Susan B. Anthony DayColorado, New York
2025-02-16Elizabeth Peratrovich DayAlaska
2025-02-17Presidents' Day
2025-02-17Presidents' DayMost regions
2025-02-17Presidents' DayMany regions
2025-02-17Daisy Gatson Bates DayArkansas
2025-02-20World Day of Social Justice
2025-02-21International Mother Language Day
2025-02-25Maha Shivaratri
2025-02-25African-American Scientist and Inventor DayVirginia
2025-02-25George Rogers Clark DayIndiana
2025-02-26Maha Shivaratri
2025-02-28Linus Pauling DayOregon
2025-03-01First Day of Ramadan
2025-03-01Zero Discrimination Day
2025-03-01Self-Injury Awareness Day
2025-03-01St. David's Day
2025-03-01First Day of Women's History Month
2025-03-01First Day of Irish American Heritage Month
2025-12-12International Universal Health Coverage Day
2025-12-12Feast of Our Lady of Guadalupe
2025-12-13National Guard Birthday
2025-12-15Chanukah/Hanukkahfirst day
2025-12-15Bill of Rights Day
2025-12-17Pan American Aviation Day
2025-12-17Wright Brothers Day
2025-12-18International Migrants Day
2025-12-18Arabic Language Day
2025-12-20International Human Solidarity Day
2025-12-20Super Saturday
2025-12-21December Solstice
2025-12-22Last Day of Chanukah
2025-12-24Christmas EveMany regions
2025-12-24Christmas Eve
2025-12-25Christmas DayAll
2025-12-25Christmas Day
2025-12-26Kwanzaafirst day
2025-12-26Day After Christmas DayNC, SC, TX
2025-12-27International Day of Epidemic Preparedness
2025-12-30Asarah B'Tevet
2025-12-31New Year's EveMichigan, Wisconsin
2025-12-31New Year's Eve
Some technical notes:
I built this with the help of Cursor. It uses Svelte, shadcn/ui, tailwindcss, and bits-ui.
It had a lot of fun learning about bits-ui primitives and will be working on more calendars in the future.
Conclusion
I took an hour of my day to code this Calendar, which isn’t perfect, but reminds me it takes a bit of effort to make it happen.
There are ways to automate the process of adding events (you can do some research about rrule). And in doing the work, you’ll recognize the diverse events happening around the world.
I’m not saying Google should add every single event to their Calendar. But they should be more responsible in representing the world we live in.
And to remind ourselves Google has done this before, check out their archive of Google Doodles - Google’s Search Logo Changes for Every Occasion. Don’t give me a BS reason not to do something because it’s not sustainable when you have a history of doing it.
If that logic were true, the early years of YouTube would have been a no-go. And so many of their products we use today.
Well, it’s 2025. I feel like we might as well call it 1925, depending on your outlook in present day events. I skipped January due to feeling extremely stressed out that I couldn’t concentrate on writing. I had two ideas for newsletters ready to go, but the feeling of general malaise and outrage quickly quelled any creative spark. Which is a shame because I think those of the times in which I love to engage the creative side. Take care everyone in these trying times, and maybe next time we talk about how to cope together.
Notebooks
My wife, brother-in-law, and I visited The Gilded Page, a bookstore in Tarpon Springs, Florida. I found a lovely yellow notebook with very nice binding. I decided this was going to be my ideas journal. It’s not necessarily a commonplace book more than it’s a place for mulling and musing about with ideas. I keep a very extensive personal knowledge manager digitally, which I can talk about in the future, so I leave the physical books to something I want to slow down about and think through.
The first step with any notebook that I’ve found is to personalize it. I’ve been thinking about this idea from Van Neistat’s camera rituals where he engraves his new cameras, gives them a name, and builds a mount into it. Recently, the idea clicked when I saw examples of Austin Kleon’s notebooks.
Looking at my notebook, I dedicated the first page to writing down the purpose of the notebook. I love manifestos, and I put it in the style of one so it felt more personal. The next thing I did was make a table of contents on the next page, so I can index and easily find any page. Then I started numbering the next few pages before breaking it in. I think this ritual helps me solidify this is mine, and not a sacred object. I have many unused notebooks at home (and my wife has more) because we are scared about ruining them. Which is crazy because we own them and can do whatever we want to them. That’s why I wanted to break them in where it can be approachable and not a sacred item to build dust on the bookshelf.
Beyond the idea notebook are my pocket notebooks and my diary. The pocket notebook is my scratch paper. I loved scratch paper as a kid. The process of writing something down helps me remember. I think it has to do with the act because I devoted a chunk of my life to learning fingering for playing the piano. This can be tasks, diagramming, doodling, and a broad stroke of other items.
The other notebook is my diary. I choose to use a Leuchtturm 1917 pocket-sized blank-page notebook because it doesn’t smear as much as Moleskines and has a nice hardback cover. I have been using diaries consistently since 2010 (although I took a break during COVID-19). In more recent times, the journal has become more personal for inner thoughts, and the ideas notebook acts more as a stand-in for the commonplace notebook. Prior to my ideas notebook and journal were one in the same. I loved to keep it all together. And now I love having these things separate because there’s a little bit of joy having different personalized notebooks for different purposes. Even if there are mistakes inside of them.
What’s been in my information diet?
I’ve returned to a regular cadence with books in January. I finished reading The Editor a biography of Judith Jones, Meditations for Mortals, and the Productivity Field Guide. I started reading The Serviceberry and An Immense World, because I need something more uplifting in life than the direction US politics have taken us down. All of the books I’ve read I recommend, and hoping to get more fiction in later this year.
The second week into the second trump presidency, and it’s been miserable. There’s endless news on that. At home, we are starting to make sure we are prepared for the worst. The tariffs are around the corner, and there’s not much we can do about it.
Notes
The billionaires are pathetic. So are the men’s rights activists
Default ways, like libraries to use, which version of libraries
E.g. use esm, use typescript, stick to camelcase, use Svelte 5
Screenshots - you can pass along screenshots to help you, whether that’s the app or an image of a PDF, like tables. You can technically add PDFs as well
You can give it links to documentation, but this can be hit or miss
Refactor to separate files rather than refactoring existing files. This might be extremely useful for a large migration.
Good for React components to a different one, then maybe refactor the existing file to relabel as deprecated and use a deprecated flag
Use them to build quick projects. Doesn’t have to be big and fancy. Even a page to help you visualize the new Set rules
Which is great to segway to have them help visualize
Use it to experiment
Use it to branch out (git) and try different animations
Example: Wes created a fire dispatch tool to send out tweets or alerts when there are paramedics around and having it parse out that information to a stream people can easily consume
Midlevel staff are often the first targets of corporate downsizing efforts, but Meta’s plan to replace an entire tier of people with AI is a new wrinkle on an old story.
This is the last week Morgan is around at home before she returns to work. We stayed at home as much as we could as the cold weather makes coat and boots required. We also decided to push back our house warming to the summer when Morgan’s parents can attend.
I was looking through the calendar and contacts, in case I need to create vCards. And on what metadata I should save. Eventually, have LinkedIn scrapper. Maybe have public vs private pages?
Love First is a framework for transforming your reality in a way that benefits all areas of your life, making you feel more connected to your best self, your loved ones, and the world around you.
Some good news for today: There are mall marriages because of the number of same-sex couples who want to be married in Thailand now that it’s legal.
What the author is noting is there are no climate refugees because we are all at some climate risk, which is made worse with climate change. He lived through the 1978 fires where his father would hose down the house in case the nearby fires spread. It’s also an ode to the Palisades. Also, there’s an action plan at the end on how to be more fire resistant.
I read through this and am convinced Matt Mullenweg is on some trip no one else wants to be on. To rip apart the ideals of open source and make things more closed to the community tell me his own ideals have shifted.
I’m curious about this video. Novati no longer works at Meta. He is credited for the most number of commits, which should always be taken with a grain of salt. I’m sure they will talk about develop productivity.
I’ve had it. The last time I logged into Instagram, there were a couple of right-wing organizations recommended to me. I don’t care if it’s a glitch, it’s not acceptable. If a CEO tries to be someone you can’t understand or respect, it’s time to leave.
This is my decision to leave Facebook, Threads, and Instagram. It’s been years on these apps, and it’s time for a farewell.
Caveat
I am still on Whatsapp due to communication with some friends who haven’t left that platform yet. I fear Facebook has such a monopoly on there, and I realize such drastic measures are hard to keep when it comes to cutting off ties with everyone.
Mostly a return to work this week. We ended the week going to a vinyl night at our local coffeehouse. And doing yard work during the weekend, leading up to the housewarming.
Notes
I’ve discovered a way in Obsidian to make it possible to create these notes much easier using a feature called transclusion. That’s where you can link the contents of one note to another.
I found a redditor who did this for their monthly review reviewing the summaries. I’m hoping this weekly review process helps me out.
Birding! I loved Ed Yong’s XOXO talk that I wanted to read through this article and get started with birding.
Yong talks about how to be a public persona both online and off-line. How do you behave and act around people who are trying to reach out to you? How do you mute them all because it can always feel like a floodgate?
Khan Academy now has a financial literacy course that I want to take!
This comedian reflects on how much focus time is spent on social media work like reels, shorts, and TikTok. That’s a full time job instead of working on the art (comedy in this case)
I took a slow dive into RISC-V, which use an architecture that Framework is spearheading. If true, this could be huge in making modifications in the future where we only need to upgrade a little bit at a time. And can still be performant for a work machine. More to come.
Add this to the Zuckerberg Czar comment, and we’re right on track. I’ve heard it before and I’ll echo it again. Facebook doesn’t care about our privacy or trying to do good. That’s a fact. They are in the profits business.
“How I program with LLMs” - which helps me with understanding how I could be using LLMs as well. Really, there’s three ways this developer does it: autocomplete, search, and chat-driven programming. I already do all of these, and it’s nice to see someone else break them down. Authored by David Crawshaw, co-founder of Tailscale
This is to remain no need features in 2025. I love the attitude. htmx doesn’t work for all use cases, but it sure has made it easier for prototype development
The DJI store has this camera, the Osmo Pocket 3, which focuses on you. Costs around $868, might be good to save up for in the future. Looks really cool
James Altucher writes about writing down 10 ideas a day. I think I used this for Idea Generation in the past. I don’t think generating ideas has been my shortfall. It’s the necessary follow-up required.
Flexoki is this color palette generator of sorts that fits with the Tailwind scheme of 50 step increments. The output is specific to prose and code, so the colors are simply put for those aspects.
Human, Being is all about exploring and celebrating what it means to be human. I (hi 🙋🏻♀️, I’m Erin) share musings and reflections, grounded by over a decade in the health and wellness space and guided by my insatiable curiosity about the human experience, on how we might be able to make the most out of our time here on Earth.
Movie: Flow (2024) - no dialogue animation that follows a cat that has to survive a flood. Along the way, the cat meets some other unexpected animals to face the flood. Warning: some sadness with animals (mostly no deaths, if you are worried about cats or dogs dying)
I’m documenting my quest to start a tiny bookshop on a cobblestone street in a quaint hill-town in Umbria. Narni is a place of long, light-filled days, birds crying overhead, cats napping on warm stone. It’s a magical city where dreams feel like they might just come true.
The final counts are up. We have the following distribution of media for 2024.
Media
Count
🎥 Movies
161
📺 TV Shows
10
🎮 Video Game
3
📕 Books
9
🎤 Musical
1
Some of my biggest highlights I pointed out in another post.
I’ll leave that here again because it was a really fun list to put down.
The film that I want to finish: Past Lives (2023)
The weird film: Poor Things (2023)
The cringiest TV series: The Curse, Season 1 (2023-2024)
The book that resonates the most: The Psychology of Money (2020)
The unexpected book find: Frostbite (2024)
My RomCom of the year: Upgraded (2024)
A great TV find: Ramy (Seasons 1 and 2). I still need to watch the 3rd season
The cry-fest film: Suzume (2022)
My good 90’s find: Go (1999)
The most intense non-intense film: Challengers (2024)
Unexpected horro series: The first four Ring movies from Japan. Absolutely better than the American ones.
Best horror from this year: The Substance (2024)
RIP Dame Maggie Smith: Gosford Park (2001)
Hallmark Movie of the year: Sugarplummed (2024)
I’ll add in there I also enjoyed Quiz Lady on the plane ride home, although that was on January 1st.
I didn’t read enough books this year. They were mainly non-fiction. The highlights were Frostbite and The Golden Thread.
We saw Hamilton this year, our only musical. Totally worth it!
I tried to include video games, although I’m terrible at finishing them. Maybe I should add an “in progress” for some of those because I don’t always finish them.
In terms of TV shows, we’ve enjoyed the new Fallout show. Morgan’s really enjoyed Dune Prophecy. I watched all of the Good Place, which was wonderful, and has a bittersweet ending.
Its the end of 2024 and the beginning of 2025! I’ve changed up how I do daily notes, and in part this will change my weekly notes format. The unstructured version of daily notes means I should make it easier on myself to publish this.
Science says lasting relationships come down to—you guessed it—kindness and generosity.
I read a bunch of items from Derek Sivers again. Mainly because I re-read Directives and wandered around recent writing. This was one and there was another contemplating end of life matters.
Using a Raspberry Pi 5 to showcase a mini-computer build called Pilet
David Cain experimented with the year of depth back in 2017. I want to read more about how this affected him. I’m going through one of these types of years to really slow down and understand things deeper, not as much as I can. I suffer too much of that and the [[2025 Year of Capacity]] is acknowledging I can’t do, read, consume everything
Sometimes the boring stack is better. Rogério talks about different project make-ups and how it’s difficult to find the right balance while the product makes money.
A software developer is more than their code ability. Addy Osmani talks about the other type of skills that AI isn’t going to necessarily replace in you
I read this blog post, and it irked me. I dug a little deeper, and making bold statements without understanding the repercussions make me resent I was reading this at all. Sure, there’s “doing Elon’s bidding” with the new DOGE, but it goes way deeper than that. The need to continue hustling (i.e. hustle mode) vs. taming the ego really showed here. This person was putting out their thoughts, so I understand this isn’t supposed to be relatable. But their public persona is what really bothered me.
Last week note of the year. Which I’m making public on the last day of the year.
Writing takes a lot of work. Building up the notes are also a lot of work. I’ve been expanding my usage on how to create better notes that can help with the overall writing time.
Thanks for the AI
Turing Post might be one of those AI websites to follow
In the book on how to read a book (Mortimer and Alder), here’s some strategies they employ:
Underlining - For me, it’s highlighting the lines that resonate with me
Vertical lines at the margin - Honestly, this isn’t something I run into for underlining a multi-line passage because highlighting using a digital book is a lot easier
Star, asterisk, or other doodad at the margin - This is the step after highlighting to determine which pieces of highlights continue to resonate after the first insight.
Numbers in the margin - Originally to indicate the sequence in which an argument is developed, might be a good notation for anything subsequent enforcing an argument.
Numbers of other pages in the margin - This is making reference to another highlight. Some people use Cf to be a “compare from”. It’s a reference mark.
Circling of key words or phrases - This serves much the same function as underlining.
Writing in the margin, or at the top or bottom of the page - the words or notes around the books. This could be questions and answers (like Oxford notes), the major points, reflections, related to other pieces of writing.
I finally bought Anki, and looking at different ways to make the flashcards better. I’m at the rote memorization phase of learning Mandarin, so I’ve been figuring out what content to put on there, especially to help with grammar, word position, and vocabulary. I’m starting to graduate from words to coming up with my own sentences.
I’ve started a Discord server!
This is a place for more group setting conversation. I have found Discord as a much easier way to interact with people, which I wish was more the case of other social media. The real-time nature of old-school IRC mixed with modern features allows us to make fun, creative conversation. Just abide by the code of conduct of being respectful. With anything, moderation is the key.
My friend and I create playlists for recapping the year. My specific rules for this playlist is to have it be at most 90 minutes, which is the length of this CD. And this has to have been released in 2024. There’s a few gotchas, such as re-issues, re-releases, remixes, etc. I try to make it generally the original release, but that doesn’t always workout. And sometimes I want to change the list after the end of the year.
I’ve read a good chunk of Cal Newport’s books over the years. He breaks down his own interests in The Tao of Cal
Make Care Packages
I love the idea of creating care packages for friends and family. Christmas shouldn’t be the only time you create gifts for people, so maybe call them care packages instead.
And on that note, I love themed gifts. Here’s the one my wife and I use
Something she needs
Something she wants
Something to wear
Something to read
Show me your home library
I came across a video breaking down the largest home library. I wasn’t aware of the Loeb Classical Library, or other collections of the sort. The hoarding mind of mine would love to have a complete set. But who am I kidding. It’s enough I have a good set of Criterion Collection films.
Speaking of books, I have been recommended Nick Milo’s “How to work a book”. Here’s a short write-up of what to expect from the one hour course. Books are for thinking, not reading
I really love the depth Simon Willison goes into details like this where I’ve heard the debate from different angles and how he’s able to consolidate them. Storing times for human events
TimeMap.org - World History Atlas - This has been an interest of mine to control the timeline and understand a map better. Or any other incident. Scrubbing, as they say.
This is really interesting, creating an adventure game given the text of the book the author wrote about the fingerprinting system used in crimes back in the 1910s. I would love to simulate some other scenarios from history. Apparently, the author has done the same thing for the cuban missile crisis.
Costco says bye bye to books
To be clear, they are going to still have books during the holiday season. From what I can tell, the previous buyer for Costco retired, and this might be one of those consequences.
The world is more dangerous than we know it. Thank you, crypto bros
Where’s Your Ed At?
Ed Zitron’s newsletter, “Where’s Your Ed At?” is absolutely worth the read. His latest newsletter, Lost In The Future, has an insightful reflection on the Trump win, and the sentiments we all feel.
When a clown enters a palace, the clown doesn’t become a king, the palace becomes a circus.
— Turkish proverb modified by Elizabeth Bangs
I love collecting quotes. The first one came from another newsletter that I needed to read the original poem. The second is a reflection of the current state of things.
When you need to brighten up your day
Thank you Elmo for going on Chicken Shop Date (even if he eats veggie nuggets)
Doctors vs. AI
Okay, the title is clickbait-y. What we’ve noticed is if you put your symptoms with an LLM, there’s a likelihood it could get your illness diagnosed, but of course, don’t actually call it a diagnosis.
There’s been a bunch of back and forth with shuttling our things out of our old apartment. As such, I have not been taking as many week notes for this week.
PSA
The Atlantic - Throw Out Your Black Plastic Spatula - I mean, I definitely grew up with them and used them throughout college until moving over to silicon ones. When one melted, I “noped” out of it.
Where is the balance between how much we capture and how much that we capture is useful?
Some notes are returned to on a recurring basis, like cooking thanksgiving meals
For all things digital, the heuristic is to store it in archive, as loss aversion leads to regrets if the file is lost forever. Examples: lost photos, notes, etc.
Newsletter - Depths of Repair - Untangling the barriers that make finding genuine connection and growth so difficult. Strategies and tools presented through raw personal stories of failure, resilience, and unearthing our best selves.
This was election week. And frankly, one that was a hard pill to swallow. There are a range of responses, but I’m going to keep my head down as we move into our new place.
An anxious election day to you too. A follow-up from my last newsletter, Morgan and I closed on our home towards the end of this past month, and we couldn’t be happier.
Standing in front of our new home
The whole process has been a whirlwind. I have a ton of notes that I will eventually put into a blog-style post. Hopefully, after we wrap up the chaos of moving.
A neighbor dropped off a welcome card
We are starting to feel the neighborhood spirit. One of the big conversations I had with Morgan is finally having a place of belonging. I have moved 5 times in the last 5 years, and frankly I’ve had enough. And every place I’ve moved to, the neighbors sure haven’t been too friendly or chatty. In the last apartment, there are familiar faces, but most leave before making a long impression. With this card, we are hoping to be friends with some of our neighbors.
An autumn Yuzu pose 🍂
The cold air is finally here in the Bay Area. And with that, I leave you with our little puppy.
I never received a mailed, annual Christmas letter. For the unreceived, these are letters you receive from friends or family who send out a letter of how the year went.
I feel like it’s a feat to wrap up the year. When done right, the letter should evoke good feelings of the highs and lows, while inspiring the reader to reflect on their own year. When done wrong, it sounds like a rambling, incoherent confession. The emails I would send out prior to my (now defunct) holiday cards was my own version of an annual Christmas letter.
I read end-of-year newsletters with envy. Authors would rattle off their big accomplishments or mistakes. They would share their favorite things of this year.
Hallmark recently released a movie about crafting an end-of-year annual Christmas letter. In the movie, the main character and matriarch Settie Rose wants to win her town’s holiday writing contest. She’s struggling to put her year in words that will melt the hearts of all in her town. So she does what any sensible person does — she hires a writer, Juan, to write the letter for her. This is as middle of the road Hallmark story structure, and I can’t say I would recommend it, but it did hit a nerve.
I put too much emphasis on the prep work. The annual review is where you write down everything significant that happened that year. Then you go through your new years resolution and check off what worked and didn’t work. I fall flat with this task because when I really think back to it, it feels like a heavy lift. I would go through my calendar, note the significant items. I would skip the resolutions — I’ve replaced them with quarterly goals. And I lament the fact that I haven’t done any weekly or monthly reviews, so I would get discouraged to look back.
Then again, that’s steering away from the main point. The Christmas letter doesn’t care if you did that work or not. It’s a comfort letter that you send out to remind people you are still thinking about them. Of course instead of sending out a letter, I could instead have 50 conversations with 50 people that are important in my life. And maybe that’s a nice thing to do at a future date. For now, writing this is my compromise. We have put up our Christmas tree, we are drinking hot cocoa, and we are watching more middle of the road Hallmark movies.
Happy Holidays everyone!
P.S
Thanks for reading my little rant about letter writing. Let me share with you my end of year music playlist! Here it is on Spotify and YouTube!
Practice = Purpose + Frictionless Systems + Consistency
— Source Unknown
Last week felt weird. Like a strange Halloween that was misplaced. I was heavily distracted by election news this week and have been putting off the previous week’s notes.
I’m continuing the week notes format like I did last week with topic-based notes. It seems to be helping me get acclimated to stop organizing everything.
Expect more election news next week as I get caught up.
We address four major areas of cultured meat research and development: establishing cell lines, cell culture media design, microscopy and image analysis, and bioprocessing and food processing optimization.
Progress is good, but progress slowed around 1970. Nobody knows why, but theories include shifting social attitudes, over-regulation, or exhausting the potential in a few big inventions like electricity and mass production. This slowing was a great historical tragedy.
I changed up the format last week. In a way, it’s a little more freeing because I don’t have to group everything with like things, necessarily. Plus, it gives me a chance to play around with looser organization.
With everything we have to move, most of my time and efforts at home at spent on that and not on the blog. Which makes sense - life sometimes has other priorities.
My general rule is to go to one in-person conference a year, if possible. I’ve certainly met my quota this year with !!Con. There are some I think I want to go to next year if possible, but of course, travel is a lot of work too.
This came up because there’s this YouTube channel I started exploring about going to speed running every BART station stop. The current time to beat is 5 hrs 10 mins. I created my own wiki page to see how crazy this is and where people have attempted these riding challenges. Turns out, there are so many. Also, this book is a reminder in creating challenges for ourselves.
Time tends to move both fast and slow as you are purchasing a home. This is our first home, and I can tell it’s been a whirlwind of emotions all around. When there’s a serious need to provide documentation, we have been on top of things. When it’s on the other end, waiting for the loan officer or underwriters, it feels like a snail crawl. That said, yesterday, we closed on our home. We got the keys handed over to us. It’s an exciting landmark moment. And I wasn’t expecting to be this tired. But here we are, and life’s moments got in the way of releasing any week notes.
With that reflection, it may be time to pair this down quite a bit. I loved the past year of sharing an incredible amount of links, reflecting on the week, giving my daily notes to breathe back into me. Too often, we are tirelessly scrolling through an endless feed of passive, yet wanton, feed that fuels the monkey brain. It’s as if we can’t turn off the addiction to our devices and has an incredible pull for us. We can’t go to the restroom without our devices. We can’t sleep without them. The always-on nature of it makes it incredibly hard to listen to our natural circadian rhythms.
I’m not saying let’s return back. I’m not sure we can. We let the genie out of the bottle, and I don’t think there’s going back. But what does forward look like? I’d like to craft a space where forward are the things that matter the most. With that, here are hand-picked items that I’ve run across this past week, and are worthy of putting in the “read later” category, and stick to it that later means concentrated, but still passive, consumption.
They are in research phase. To Be Born in a Bag. It’s crazy stories like this that make me wonder how did we get here and when will it be available. And also, the biomedical side of my brain runs through all the risks and challenges you must pass through.
Home Buying Process
Mortgages have been on the mind. And Freddie Mae has caught me up in mortgage rate trends over the past few decades.
Also, we learned the Underwriting process is essentially to QA everything. Check out the leins on a home and rectify them.
Hurricane Milton
The unbelievable nature of disasters strike close to home again where my in-laws live. The New York Times reporting Fears of Hurricane Milton Drive Millions From Their Homes in Florida. It did make landfall and did cause havoc. Thankfully, my in-laws are okay, and the state had to reel from two major hurricanes in the span of two. That’s unbelievable.
It’s made me think back to the article earlier this year about loneliness and the amount of work it takes to keep up friendships in the US. The lack of third places and the way we treat community feels more of a reciprocal give and take.
The tool should confirm to your workflow, not the otherway around.
When you let the tool dictate your workflow, you disrupt your own flow.
Tools can teach us about new workflows, but it’s up to our own judgment if that works for or against us.
Tools are not panaceas. They cannot solve all of our problems. The corollary advice about tools is when all you have is a hammer, everything looks like a nail.
A good tool is one that can do one thing very good. A multi-tool is great if you know it can do each task very well. When it fails at one of those things, you know it’s not a great tool, and you may need to make other tools interoperable with one another. Sometimes, your tools don’t play well. Don’t try to make them interoperable if they have no means to. These tools were never the solution to your problem in the first place.
This was the second week of 100 days of note-taking, and it’s been taking time to loosen up my writing. I’ve been mulling over personal problems to global ones. Otherwise, I wrote a newsletter, which has more personal updates.
I find it difficult to get started with writing. It is easier for me to give up on writing if I’ve lost a streak. The cadence of the monthly writing rhythm can be easily knocked off balance with any size excuse. I’m reminded of Simon Willison’s idea of escalating streaks, meaning improvement with each iteration. I’d like to think that I can write a better newsletter for every issue and it is about something bigger. Therein lies the Sisyphean lie for writing. The best thing to do is to just start.
The tardiness of this newsletter comes from purchasing our first home. Morgan and I seriously started looking at the beginning of September, and last week, we got an accepted offer. It’s been a whirlwind of emotions. We lost the first offer being outbid by 8 other prospect home owners. 5 of those 8 bids were asking 20% over. We have our fingers crossed the we will get through closing without any hitches.
Otherwise, beyond chugging away at work, I’ve finished two books this month.
I mentioned this one on my blog at the beginning of the year. Deb Chandra’s newsletter, MetaFoundry, has been a favorite of mine for years. I can’t remember how I stumbled upon it. It reminds me of the Engineering classes I wanted to take, mixed with my interest in Civil Engineering and public infrastructure. The book is a welcoming compliment to those ideas, going deeper into the ideas of networks and introducing the social and political structures around infrastructure.
As a fan and donating member of Gastropod for years, this book is a deeper dive into a topic than a typical podcast episode. This well-researched book is an examination of an aspect of food overlooked — freezing food. While this appears commonplace now, that wasn’t the case a century ago. Going deep into the cryosphere, Nicola Twilley examines the history and relationships we have with storing our food in the cold climate. Strange fun fact: some people working in large refrigeration plants develop illnesses at the beginning before their body acclimates. Sometimes, when they are driving home, they blast the AC since they are so accustomed to the cold.
The idea of summarizing books annoys me. I want these elegant book notes like summaries and lessons learned. The ability to distill knowledge into bite-sized tips or notes sounds appealing, yet I know it takes a lot of work.
This issue was inspired by Celine Nguyen’s newsletter, “Personal Canon” where in her latest issue, she also addresses the large task of summarizing books. I’m neither as eloquent nor comprehensive with book summaries nor do I think that’s my strength. Are you a huge book note-taker? Do you have a system? If you are, Jillian Hess’ Noted newsletter might be right up your alley.
Last week, I deployed a website called Make 50 Things. I’m proud of taking the first step, but there’s so much more to do on this website, including adding webmentions, adding my own 50 projects, making it open for others to add their own 50 things, and to make a linkroll of all of the 50 projects other people have created.
I took the HTML 2024 survey and learned a bunch of things, like the File System Access API and forms within dialogs
I finally setup Hyperkey. I didn’t realize they had a setting called “quick tap” option that re-maps it to escape. Finally can open up opportunities in keyboard shortcuts!
It sounds like I should use AI with my obsidian vault. Or the very least with a notion so that I can find things that I couldn’t find years ago. Samantha search versus AI search seems to be the differentiator.
the new model could work its way to a correct (and well-written) solution if provided a lot of hints and prodding, but did not generate the key conceptual ideas on its own, and did make some non-trivial mistakes.
In my last newsletter, I talked about seasonal playlists playlist. Pair that with the Commonplace Book Club from the Noted Substack and you get this habit of collecting tiny details. I’ve kept a continuous journal habit for over a decade and love to collect quotes, song lists, moments, stickers, and so much more.
“Don’t take it personally when someone turns you down. Assume they are like you: busy, occupied, distracted. Try again later.”
— Kevin Kelly
Margin and buffer
Margin, ownership, and boundaries
Buffer is making sure there is overflow. It’s like redundancy, although it doesn’t have to be necessarily overflow.
Margin is more about the bandwidth. You give yourself enough to recover from. Buffer is for stock. Margin is the space you make mentally, although the definition is typically around the edge of a boundary.
Latticework is a system that unifies annotation and freeform text editing for augmented sensemaking. It allows users to fluidly move between “foraging” through source documents and “sensemaking” in a working document, with interchangeable highlights, copied snippets, marginalia, and textual elaborations. Latticework uses a pane-based layout with bidirectional navigation and previews to help combat disorientation, and provides collapsible snippet links to manage working memory overload.
Adjust your voice: Take a deep breath or two to drop your voice down from the squeak of social anxiety to its normal, wonderful, natural register. Your voice doesn’t start in your head, as we might imagine, it starts down between your gut and your heart with the pull of your diaphragm.
Adjust your body language: Roll your shoulders back to pull your frame upwards and raise your gaze. This will shift your posture from the shape of a question mark to an upside-down exclamation point. You want to your spine look like (¡) not (?).
Relax your face: Relax your face. You don’t have to smile if your mood doesn’t match it—a fake smile erodes trust—instead, just relax away your leftover facial tensions so you don’t accidentally send an expression of hate or worry or disdain to a person you haven’t yet met.
Start adjusting before you speak: “Hello” happens long before you speak. We can tell from across the room when a salutation might soon occur. Start your hello adjustments (mind, body, voice, attention) sooner than later. A challenge: can you walk into the room already adjusted?
Speak with curiosity: You can uncover something interesting about nearly anyone if you converse with curiosity instead of apathy, greed, mistrust, or resignation.
Respond with an “I believe” statement: If someone asks you “what do you do?” resist the temptation to respond with your job title. Instead, respond with an “I believe” statement. Example:
“So, Jim, What do you do?”
” I believe story, art, and design can bend the arc of humanity’s progress, and I try to bring that into everything I do: from movies to startups to paintings to books and to ballets.”
Make eye contact: When you greet someone, look at the other person’s eyes. Do not look at their feet or your feet or the ceiling or the person behind them or your phone or your watch or your elbow or anywhere else. Eyes to Eyes.
Ask questions and listen: After you introduce yourself, ask a question. Listen to their response carefully and ask a question that allows them to develop their idea further. You already know your own ideas, so why not focus on theirs? The conversation will be more fun if you uncover interesting ideas hidden behind the foreheads of others.
Remember details for next time: Once someone does tell you something, store it away in your mind for the next time you meet. When you see that person again… a day, a week, a year from now… bring it up—so how was that trip to Spain? I remember it sounded wonderful… And weren’t you about to do something interesting at your Tunnel Drilling Startup?
Costco has hacked the psyche of the American consumer, appealing to both the responsible-shopping superego (“Twelve cans of tuna for $18!”) and the buy-it-now id (“I deserve that 98-inch flat screen”).
Ostensibly, Costco is a discount store, a place to save money and stretch your grocery dollar, but it is also an aspirational shopping experience, feeding that most American of appetites: conspicuous consumption.
Costco is revered for its high wages, attentive customer service and “deep commitment to integrity,” said Jeremy Smith, the president of Launchpad, an Oregon-based food brand incubator that specializes in placing products at Costco.
Over the past weekend, I went to !!Con 2024 in UC Santa Cruz. I always feel each talk, while 10 minutes, has. a lot to digest. I decided to pick back up my pen and paper journal, the Lecturrum 1910 and Uniball pen. The end of these niche conferences signals a sadness inside, and I hope to fill that void with something else beautiful. Also noted, this was the same week XOXO held its last conference.
I’m fairly late this week when it comes to going through the notes from the previous week. Labor day came and went, and I wanted to focus on other things beyond the computer work.
Around the technosphere
DIY Methods 2024 - A Mostly Screen-Free, Zine-Full, Remote-Participation Conference on Experimental Methods for Research and Research Exchange
I read through Hypermedia Systems in two sittings, and found the approach of htmx to be an interesting update to the earlier web days. While it doesn’t lean fully into Jeremy Keith’s idea of progressive enhancement, it lends itself towards that goal.
From the Weekly Show with Jon Stewart, they had on Jill Lapore who is a historian and professor at Harvard. She mentioned how political conventions in the 19th and early 20th century looked a lot different. They would pick candidates by rallying others to vote on their candidate of choice. And the chosen candidate didn’t make appearances. It wasn’t until FDR that changed
This was in the 70s, and also this to a Trump campaigner now that RFK jr has officially endorsed him
The candidate you’re campaigning for, in whose administration you apparently intend to serve, wants our laws rewritten so that drug dealers, particularly those who sell narcotics, face capital punishment. Given that you sold cocaine in your youth, how do you feel about his advocacy of a regime that might have resulted in your own execution at age 19?
I’ve been a fan of making seasonal music playlists for more than a decade. I started in iTunes, making new music and fitting them into playlists for road trips on my iPod. Looking back, these playlists feel like a snapshot of my life and where I was. It evokes specific memories of who I was with and where I felt I was at that time of my life.
There was this time when my friend Teagan and I were road-tripping through the coast of the Pacific Northwest while listening to a song Moby made as part of NPR’s “Project Music” called Gone to Sleep. While on the narrow highway amidst windy roads cliffside, as well as the void of light through the redwood forests during the nighttime, I had an eerie, yet hopeful mood. There’s a video game called Pacific Drive that I haven’t played, but I must wonder if it captures a similar mood in its soundtrack.
In the late 90’s at the supermarket checkout aisle, I remember looking at the back cover of “Now That’s What I Call Music” compilation CDs. The curator took the billboard’s top 20 list and burned them onto a CD. I remember challenging myself to make a more personal CD for the music I was listening to and started ripping them and putting them into my CD player. It was always a challenge trying to fit the 70-minute form factor. The result was always a mishmash of the music I was listening to at the time. Whether it was rediscovering rock bands of the 70s, or new pop hits, it all got smashed together unordered. And inevitably, I would hit skip on songs I knew didn’t fit after the 10th listen-through.
Much later, I found myself in the Metafilter community where I would participate in a seasonal CD swap. An organizer would connect a small group and you. Each swap had a catchy title, usually alluding to a song, like “Swap Me Maybe”, “The Songbird Swap”, and “Swap Battle”. I loved taking a walk with my music player and strolling to someone else’s curation. As one of those people who have said “I listen to a little of everything”, the eclectic range appealed to me. It might have been a warm surprise from Ray LaMontagne, or an electronica beat of Phantogram.
I feel like the tides changed when I converted to a streaming service. I know the argument sounds like a broken record about not owning a physical copy of the music. Beyond that, the playlists that have been curated for me don’t feel as personal as receiving a mixtape cassette. The Algorithm supposedly knows my tastes and creates a warm echo chamber of what’s come before. But if I’ve learned anything from different music eras, disruption is required to challenge the listener. We need Stravinky’s The Rite of Spring to drive into our brains atonality. Or Captain Beefheart and his Magic Band’s Trout Mask Replica to challenge our ears with discordant rhythms and motifs. I would like to think the Algorithm works by keeping you in the echo chamber long enough that everything starts to sound the same, and the potential for a playlist to be great becomes mediocre.
With the advent of short video platforms like TikTok, Vine (RIP), Instagram Reels, Snapchat, and so many others, the music that plays along is the sound bites. You can’t fit an album into that form factor, and the music industry has transformed with it. Add to that the oddly structured price per stream and you get a mix of more singles that can hit viral numbers. I’m not interested in dissecting if that’s good or bad for the industry. I’m more interested in how that affects my personal music listening habits. The streaming giants have created music ecosystems around machine-learned playlist creations based on what is similar and viral, and rewarding those who have figured that formula out with the biggest payouts. All of this said, this also feeds into the Algorithm’s playlist selection.
With our current modes of listening to playlists, I have to wonder, where can I fit my voice in playlist curation? I haven’t changed my habit of making seasonal playlists, but the ways I discover music have.
There’s an idealized version of the playlist creation process I have in mind. I would take the time to listen to dozens of albums end to end and pick and choose the handfuls of songs that have resonated with me. But more and more, the Algorithm prevails. I try hard to go with a select few curators who have great tastes. Or radio stations that still employ DJs to spin their favorite tunes.
My friend D and I created an end-of-year playlist that has rules. The songs chosen must have been released that year, is something we find has resonated most with us that year and must fit on a 70-minute CD. It mixes what I felt in those seasonal playlists and puts my thinking cap on what is worthwhile to include. Since space is limited, you can’t put all of the year’s hits. I find creativity in these constraints and mindfully listen to that playlist over and over until it feels right. That’s what I think makes a great curated mixtape. And it gets to be saved and listened to whenever, like a few months from now, or listened to a decade later as a retrospective. Let’s bring back the era of mixtapes.
Last week, I finished Burn Book, which I ahem burned through. I found myself wanting to read faster when I borrow the book from the library. Shout out to Libby! The book introduced me to a play from Spalding Gray called “Interviewing the Audience” that I would love to watch a recording of, if they exist.
Ultimately, we want to maximize quality time spent reading long-form documents, not substitute for it.
Daniel Doyon, Readwise July 2024 Updates
Do The Hard Work That’s Required - AI is not a shortcut. Do the reading. Do the things required. Don’t think that AI will just make something great.
AI tools should help you do the hard work that’s required to make something great; AI tools should not replace the hard work that’s required to make something great.
Harvesting problems have straightforward solutions and no shortcuts: You just get a big basket and pick every damn strawberry in the field. You solve these problems with pure perseverance, slogging away for weeks, months, or years until they are done.
Some problems are like fishing. You know that there are fish out there in the ocean, but you don’t know exactly where. If a great fisherman knows where the hungriest fish are and how to set their lines just right, they might catch everything that they need in a few hours. Fishing problems can sometimes be solved shockingly fast by motivated teams with a bit of luck.
Some problems are like panning for gold - going out to a river or stream where there might be gold, getting your pan out, and seeing if you can find traces of the shiny stuff in the sediment. If you find gold, you can become generationally successful - think of the massive moats created by Google Search or the AirBnB network.
Select | Dasel - CLI tool for selecting and updating JSON, CSV, and other one file data files
I feel like creating a page that collects these book collections.
Around the World
Collab Fund - Fill The Bathtub - With all of the BS we are fed today, we want to get the facts and for politicians to tell it straight. Hence the term, “Fill the Bathtub”.
I was listening to the Good Food podcast, and I am frankly appalled there’s a scalping market for restaurants. But of course, it’s not a black and white issue. But still, this shouldn’t be the case.
If you haven’t heard, Mike Lynch and Stephen Chamberlain died within. a week of each other after both being acquitted from fraud charges. The coincidence is telling but also tragic.
Each entry on this list of common misconceptions is worded as a correction; the misconceptions themselves are implied rather than stated. These entries are concise summaries; the main subject articles can be consulted for more detail.
Meredith Arthur in Beautiful Voyager presents a three part series on “The Ultimate Stress Relief Cheat Sheet”
it is a seemingly inevitable consequence arising from the combination of the ease of changing how a platform allocates value, combined with the nature of a “two sided market,” where a platform sits between buyers and sellers, holding each hostage to the other, raking off an ever-larger share of the value that passes between them.
This is about squeezing out the competition until you’ve become the big monopoly, then you are the only place consumers can go to as your product degrades while raking in money.
surpluses are first directed to users; then, once they’re locked in, surpluses go to suppliers; then once they’re locked in, the surplus is handed to shareholders and the platform becomes a useless pile of shit.
If users can’t leave because everyone else is staying, when everyone starts to leave, there’s no reason not to go. That’s terminal enshittification.
Capitalism can be warped as a way for making valuable products for users.
On the one hand, they want to make money. On the other hand, making money involves hiring and motivating competent staff, and making products that customers want to buy. The more value a company permits its employees and customers to carve off, the less value it can give to its shareholders.
Levees against enshittification
There are four forces that discipline companies, serving as constraints on their enshittificatory impulses:
Competition. Companies that fear you will take your business elsewhere are cautious about worsening quality or raising prices.
Regulation. Companies that fear a regulator will fine them more than they expect to make from cheating, will cheat less.
The next two are more tech-specific
Self-help. Computers are extremely flexible and so are the digital products and services we make from them
That means that users can always avail themselves of programs that undo the anti-features that shift value from them to a company’s shareholders
Workers. Tech workers have very low union density, but that doesn’t mean that tech workers don’t have labour power. The historical “talent shortage” of the tech sector meant that workers enjoyed a lot of leverage. Workers who disagreed with their bosses could quit and walk across the street and get another, better job. (View Highlight)
What drives each of these forces to making better products, and companies, is a higher mission.
Mottos matter in terms of hammering a sense of mission.
Google’s “Don’t Be Evil”
Facebook’s “Make the world more open and connected”
Erosion
One by one, each of these constraints was eroded, leaving the enshittificatory impulse unchecked, ushering in the enshittoscene.
Regulatory wins like GDPR pushed out small EU ad-tech companies because of their invasiveness. That said, when Big Tech runs through adversarial interoperability, it’s “progress”. If you do it, it’s “piracy”. And if you try to make an alternative (like Facebook), you get slapped with a DMCA violation or Article 6 of the EU Copyright Directive.
When you have a walled garden, like your own app, you can no longer run ad blockers.
adding a blocker to an app requires that you first remove its encryption, and that’s a felony.
Jay Freeman, the American businessman and engineer, calls this “felony contempt of business-model”. >> Source Needed. Probably here: Table of Contents - Jay Freeman (saurik)
Reversing Enshittification
We must restore the four constraints that prevent enshittification.
Example:
Take Lina Khan, the brilliant head of the US Federal Trade Commission, who has done more in three years on antitrust than the combined efforts of all her predecessors over the past 40 years. The Wall Street Journal’s editorial page has run more than 80 pieces trashing Khan, insisting that she’s an ineffectual ideologue who can’t get anything done. Sure, that’s why you ran 80 editorials about her. Because she can’t get anything done.
Enshittification is not the same as Capitalism.
The cynics among you might be sceptical that this will make a difference. After all, isn’t “enshittification” the same as “capitalism”? Well, no. (View Highlight)
“It may be true that the law cannot make a man love me, but it can stop him from lynching me, and I think that’s pretty important.”
— Martin Luther King Jr.
While laws can’t undo companies from reversing enshittification, but it might make them see you more as a human. And maybe push their platform back in the right direction. (Either that, or just better off and die).
Josh Cunningham wrote a piece called Imagining a Personal Data Pipeline. I started exploring his project, pdpl-cli, which helps you download your personal data and pipe it out to your desired output. I’ve been thinking extensively about this problem for a number of weeks now since I’ve exported my Google Contacts into Obsidian. However, with the lack of database support, I thought about self hosting it. Enter the Personal Data Pipeline.
Overview of the data pipeline
It’s essentially ETL jobs with integrations to third party services to “recipes” that you can write in yaml and customize to your desired outputs. I think this helps a lot more than determining data schemas for specific third party data integrations and having the raw data in a personal data lake. (Or really maybe a document store).
The idea is to have it local-first and maybe include a sync-thing or cloud syncing as an optional add-on. There’s an emphasis on privacy, although my bigger fear is vendor lock-in. I’ve become so reliant on Google, Apple, and other services that I don’t feel like I own my personal data anymore. Also, as a web developer, the hardest part is grabbing my own data from the sticky hands of these cloud services. Also, this emphasis on files over apps makes a lot more sense to me than the walled garden approach we’ve become accustomed to.
This week marked a transition with my PKM where I made huge updates to my vault thanks to the Ideaverse v1.5 migration.
I’m slowly migrating away from the PARA flow, although it will be a long time until resources and archive are going to be migrated
A huge lift is thanks to some script automation that Claude has been helping with. Many scripts are going to be saved and added to my magic sand repo.
Currently Reading: Burn Book, by Kara Swisher. If you live in Silicon Valley and have wanted to know inside baseball with the elite who are in the area or are influencing the area, this is the book to read.
The UK sent out a decree in the 1850s that stated protein is the only nutrition that matters affected the landscape of what Britain’s ate. The slaughter of animals meant that there was a huge push to try to transport livestock to the cities transitioning to dead stock, this is had a crazy amount of effect. No one anticipated these early globalization efforts.
Nate Irwin’s team made the first digital National Park Service maps. We sat down to understand how they transformed the visitor experience one map at a time.
Do Quests, Not Goals - We should pursue “quests” rather than “goals”. Quests are personal adventures that change us, while goals are just practical attempts to change our circumstances. Quests involve overcoming internal obstacles (“dragons”) and lead to personal growth and life-expanding rewards.
Intel’s financial results were very poor, with declining revenue, margins, and earnings.
Intel is planning significant job cuts to reduce costs.
Intel’s turnaround plans are still in the early stages and have not yet shown significant results.
Intel’s failure to diversify beyond its core x86 processor business is seen as the root cause of its decline.
My Failed Personal Site Redesign - Jim Nielsen’s Blog - Jim Nielsen describes his failed attempt at redesigning his personal website. He was inspired by the comic-book style of Anh’s website and the large “DAVE” hero text on Dave’s homepage. He went through several iterations of the redesign, experimenting with hand-drawn comic strips and different layout approaches. However, he never got the design to a point where he was fully satisfied, especially on mobile.
Ultimately, he decided not to ship the new design and instead kept his existing website. But he archived the work he did as a blog post for posterity.
The first Fitbit was designed for women, with a clip-on form factor that could be worn discreetly on a bra. The founders faced challenges in developing the step-counting algorithms and manufacturing the device, but the first Fitbit shipped in 2009.
Locality of Behaviour is the principle that the behaviour of a unit of code should be as obvious as possible by looking only at that unit of code.
— Carson Gross on talking about htmx
A new version of Ideaverse Pro came out and I spent the weekend configuring it. It’s up now, and I’m getting used to having my setup change. While there’s the obvious changes, like the new theme, there’s more subtle changes, as treating some maps as collections.
SQLite actually has a CSV mode, and in-memory mode. And then it also will take queries directly from the the command line, so you don’t have to go into like little SQLite UI, and do things from there.
React Conf 2024 made me realize that the Apple Event Summary Slides are called “Bento Slides”. I updated the note to reflect that.
This summer ramped up slowly, then became scorching. And that comes with a fire watch warning. 90F/32C isn’t what I would call ideal, especially in dry heat. And a high of 129F at Death Valley is enough to make one wonder. We held a family and friends BBQ earlier this month that was well attended. Even with setting up a canopy for our guests, it remained hot to be around the yard.
Around The Blog
I’ve re-written the home page and mainpages of the website. It has more of a feed form factor plus pagination. Also, updated content is now fed back to the top. This helps re-surface curation posts and project updates.
Interwebs Highlights
I liked the new format I started last month of sharing 2 or 3 things I read over the past month, so I’m going to continue having that in the newsletter. Here are two things that have resonated with me.
The True Story of Hushpuppies, a Genuine Carolina Treat by Robert F. Moss. It started with a general curiosity if Confederate soldiers had come up with Hushpuppies, and once you’re in the rabbit hole, you come out understanding the lore.
Consulting Firms Are the Early Winners of the AI Boom. There’s an analogy floating around that you can compare AI to the Internet boom of the 90s. Except there are major differences, mainly cost. Training an AI model takes a lot of compute time, and getting to the next step takes Trillions of dollars. And with that investment, it’s not a given there will be a major difference between the current model and the next one. These consulting firms are selling slightly better workflows, but organizations aren’t getting the 10x delivery they were promised.
Currently Reading
I’ve started reading Frostbite by Nicola Twilley, and it satisfies my curiosity. For example, large refrigeration warehouses is a cryosphere. Many people who start working in it quit before the end of the day due to the cold. And those who do stick it out get all sorts of sicknesses before their body acclimates.
That’s all I have for this month. Stay cool out there, and watch some Olympic sports.
This week has been quieter than other weeks. I’ve been doing less reading, fewer news articles, and honing in on more deep reading. I’m still enjoying Baldur’s Gate 3 with my wife. We have not been tuned in to House of the Dragon’s latest season. And somehow I have not been sucked into the spoiler zone either.
Knowledge Management is usually a core component of organizational learning.
Knowledge Management at Goddard is About People
Knowledge Management is “better application of collective knowledge to the individual problem. So we need to develop some systems and do a little more work to share collective knowledge and make us smarter.”
Social Media Can Enhance Learning (but relationships matter) > Learning in Public is Hard, but Worth It. If you share what you know and what you don’t know in the middle of a project, you give people an opportunity to share specific knowledge that can help you in the moment. If it works, this can help save time and money.
I’ve certainly been in this trap before. I still think about what I want to build vs. trying to sell that idea first
The only way to get a true signal in these conversations is to sell. By asking for money you shift from the niceties of a social conversation to an economic conversation, which activates a part of the brain in buyers that you care about: whether or not they will part ways with their money to use your product.
There are three types of closure that are key to understanding emergent phenomena in complex systems
Informational closure: The lower-level details do not provide any additional information for predicting the behavior at the macro level.
Causal closure: The macro level is self-contained in terms of causation - the lower-level details do not provide any additional control over the future behavior at the macro scale.
Computational closure: The different levels of the system are hierarchically organized, with each level being a coarse-grained representation of the level below it. This nested structure allows the macro-level behavior to be predicted using only information at that level.
New research suggests the highly pathogenic avian influenza (HPAI) H5N1 virus behind an ongoing bird flu outbreak has the unprecedented ability for efficient and sustained mammal-to-mammal transmission.
The implications for this is huge! Potential mutations arise out of that could result in adaptation to mammals, spillover into humans, and potential efficient transmission in humans in the future!
David Perell interviews Harry Dry about copywriting. Harry’s website Marketing Examples is a trove of interesting copywriting to entice your customers.
Typst is “a new markup-based typesetting system that is powerful and easy to learn.”
Screenshot of rendering Fibonacci Sequence using Typst
It seems very interesting as an alternative to LaTeX. A lot of emphasis on typesetting. I haven’t gotten the chance to work with LaTeX, so I’d be curious if jumping over that and learning this might be a good alternative. Plus, it has a multiplayer feature built.
I’m leaving the politics short this week. It’s been a ride for the past 2 to 3 weeks of non-stop politics news that I’d rather turn down the dial for. It’s still there, creaking eerily as it demands its own attention to be gobbled by the monster it has become.
There’s too much disdain for my tastes about which candidate is better, which one got shot, which one tries to show up for unity and instead tears down the other side like they are vicious animals. And the local news isn’t all that much better, with news of affairs.
Instead, I went on a walk today to clear my head. This weekly notes of digesting whatever happened this week has helped me put a macro-lens around this. Even though the chaos of the moment-by-moment playback by social media might take up our eyeballs, I think it’s the moments we step away from the screen and think about where we are help us form better opinions.
Around the technosphere
I’m lumping back together all of the technie, AI, and tools for thought links. It’s been too much to create all of these categories, and frankly, when I go back, I can easily search them using my website.
And speaking of website, I’ve reconfigured my main page so the tagline and some other things will be on the sidebar and the main content is front and center. I’ve lumped together the books, streams, writing, projects, and other curations in this manner.
City Walks Live - Fun livestreams and long videos of people walking around streets around the world
It’s making me reflect on my own note-taking and note-making processes and how to capture and refine the things that I read with my own thoughts. I think if I re-read Sönke Ahrens’s book, How to Take Smart Notes, I would also get some new ideas too.
I’m pretty good at the capture part, given how long my weekly notes are. What I struggle with are the ideas presented in the sources that I’m reading. One thing I desperately need to do is to process these and put them in their own source note correctly. Readwise did the syncing part where I take notes on the piece of media. The next part is the harder lift.
Github: Claude Engineer - is an interactive command-line interface (CLI) that leverages the power of Anthropic’s Claude-3.5-Sonnet model to assist with software development tasks. This tool combines the capabilities of a large language model with practical file system operations and web search functionality.
Also, - Claude Dev - goes beyond simple code completion by reading & writing files, creating projects, and executing terminal commands with your permission.
Justin Skycak - The Greatest Educational Life Hack: Learning Math Ahead of Time - I’m definitely one of those kids who wanted to learn more math than what was presented in class. It got too boring too quickly when the material presented wasn’t challenging enough
The post from Latent Space reporting for this quarter’s AI review, The Winds of AI Winter, tries to analyze the macro trends for AI. Long story short: there are high doubts about AI’s current capabilities and its distribution is uneven. “Time to build, or else AI Winter is coming”.
I forgot that Google is in a downward spiral for “Google AI Overviews being bad, bad, bad, bad (after the Gemini mess)”. I’m really interested in how Google is trying to bounce back. Yesterday at the theaters, they were trying very hard to advertise the new AI features on the latest Pixel.
A bunch of AI product recalls like Rabbit, Microsoft “Recall”, Figma AI, McDonalds drive-thru AI, Discord cancelling Clyde
Non-Acquihiring means there isn’t an acquisition to hire the talent from one organization to another, but taking away talent to another company without acquiring the company. Adeptlost their co-founders to Amazon. And Inflection Pi to Microsoft
And of course, over-hyping technology and having high churn, like Harvey in private
The biggest takeaway is big spend and slow return. The the Goldman Sachs report and Sequoia’s report break it down. The one that telle me the most was the distribution of stock returns per phase of AI, where Phase 1 is the chips where Nvidia are doing the best. Phase 2 is the infrastructure running behind it, which is increasing. But Phase 3 and 4, of enabled revenues and productivity are flatlined.
AI Phases and signs of AI optimism
We’re hoping the future will hold better for AI in general, but I’ll leave this quote from Asimov.
The future is here, but it is not evenly distributed.
Isaac Asimov
I evangelize this tool a lot, but OpenAI really aren’t helping me do that. I end up linking people to my code-interpreter tag page because it’s more useful than anything on OpenAI’s own site.
Related to: Learn In Public and Working in Public. It helps with the Open Source community in which you open source your knowledge and let people come and collaborate.
One obvious goal here is SEO: if someone searches for your product feature you want them to land on your own site, not surrender valuable attention to someone else who’s squatting on the search term.
You can drive traffic to this site because people could actually use it. Go back to the tiny web, and not where big corporations ruin the Internet by spamming search engines through SEO.
I personally value the conversation side of it even more. Hyperlinks are the best thing about the web—if I want to talk about something I’d much rather drop in a link to the definitive explanation rather than waste a paragraph (as I did earlier with Code Interpreter) explaining what the thing is for the upmteenth time!
More links are better. I think Willison’s blog is an excellent example of adding curation with links, but let the links stand up for themselves. Also, see Waxy.org - Andy Baio lives here.
I had a running list of movies that I made years ago, probably around 2010, that I wanted to watch. I’ve updated it a few times. Since then, I’ve moved my watchlist around so many times, I can’t find them anymore. Some have been lost to the ethers of the Internet’s walled gardens like my old Netflix watch list. Some movies I started but never finished.
Some are top movies, some are recommendations, some are the ones you see on everyone’s lists, but I still haven’t made the time to watch them all. And we all know - we will never watch them all. There’s too much media to consume.
The Original List, by only the ones that I haven’t seen
There’s a small subset of these that I started to watch, but never finished.
Or in the case of Apollo 13, walked into it midway while roommates were watching
it and only saw the second half.
Sometimes, I feel like the news is ramping up the demise meter by forcing down our media consumption one terrible news cycle after another. What started with an deluge of pieces to replacePresident Biden from the race and ending with an assassinationattempt of FormerPresident Trump. In the chaotic nature of news makes me feel nervous, like there is no stability in our world. Entropy wins, and we can’t expect more than chaos. But there’s optimism inside of me, knowing there is a better future, which we have to make changes in the present for them to be realized. Dare I say, manifest.
That said, maybe it’s the heat that’s getting to us. - Death Valley reached 129 Degrees. This heat dome was enough for me to stay inside or to go to the pool. Stay cool out there!
Technological change often happens gradually, then suddenly as key thresholds are crossed.
AI models are rapidly improving and crossing key capability thresholds, making them more useful tools.
Tracking AI’s evolving capabilities through an “impossibility list” can help understand its rapid progress.
Also, if you haven’t used Claude’s artifacts, it’s helped me quite a bit with generating diagrams (mostly in mermaid since it’s compatible with Obsidian’s markdown flavor)
A great write-up about Enhancing The New York Times Web Performance with React 18 by Ilya Gurevich from the New York Times about using the new APIs from React 18 and how that migration went. As I’ve worked in this before, it was interesting how existing interactive elements had to be re-worked with a different script. It’s fascinating what the Times does to keep up to date with these frameworks.
When I talked to the Cooking team about how they keep recipes, it’s apparent to me how much Engineering effort they take to make sure it’s all running smoothly.
Changelog take: He goes on to back this conclusion up with five bullet points and a list of devtools that are succeeding with no/minimal DevRel staff. In conclusion, DevRel is not dead, but ZIRP DevRel is. Folks need to adjust accordingly.
With a sufficient number of users of an API, it does not matter what you promise in the contract: all observable behaviors of your system will be depended on by somebody. Hyrum’s Law
Mr. Inhofe opposed abortion, L.G.B.T.Q. rights, health care legislation and campaign-finance reforms while supporting the death penalty, gun rights, counterterrorism powers, offshore oil drilling and constitutional amendments to require balanced budgets and ban flag desecration
The court filings in the past case painted Nicholas as a ruthless entrepreneur who slipped drugs to competitors without their knowledge, who threatened the lives of employees he believed had turned against him, who had the means and motive to flee beyond the reach of justice in his private jet.
His start was in researching ICs, and later that’s what Broadcom sold. He was given awards for his research. He’s like a walking contradiction, trying to save his name with his philanthropy while making wildly bad decisions. File under downfalls.
My own interests this time around is to write a story I know a ton about - film history and preservation.
To add to my watchlist is “The Beast”. I love the Sci-Fi concept of living past lives, and this sounds right up my alley. I think I really want to write a Sci-Fi thriller that goes through past lives. I know there have been similar veins in “Everything, Everywhere All At Once” and Matt Haig’s “The Midnight Library”. If you love these kinds of movies and books about alternate realities, let me know. This may be the premise of another short story I would love to write.
Around the blog
I’ve made some updates this week in terms of content and quality of life. This includes all curation posts in one page. Adding the full timestamp on the bottom. Adding the author to all blog posts. And fixed some cover images on some book posts.
I read somewhere comparing AI to the Internet boom from the 90’s. Except there’s a major difference: Cost. To train AI models and the cost to compute takes a lot of GPUs, of which it’s hard to innovate. These consulting firms feel like they are selling slightly better workflows but certainly not 10x the output.
Newsletter - Tim Leffel’s Nomadico - covering tips for working beyond the office, and living in motion. It’s his coverage of digital nomads, remote work, travel hacking, van life, FIRE, learning journeys and more.
Robin Berjon writes The Public Interest Internet. I’m preparing a post talking about the Internet’s last mile problem, and a lot of that has to do with the infrastructure behind it.
NPR - Caesar salad turns 100: It was born July 4, 1924 in Tijuana. Although the birthdate is quite contentious as the creator might have been traveling around this time. It didn’t debut officially in the restaurant’s menu until 1926. The location where it was originally served claims to serve the recipe, although modified to include anchovies. Certainly I’ll travel to Tijuana and try it out.
Educational
Chris Woodford’s Explain that Stuff which covers 400 articles about how things work. Especially good for Home Schooling those STEM topics.
Tony Zhou and Taylor Ramos are back with a short film called The Second. From the duo who made the YouTube series, “Every Frame a Painting” and a segment of VOIR. Also, they made some excellent segments on FilmStruck (RIP) and some extras on The Criterion Collection.
Movie poster for The Second
Currently Logging
Continuing “Dave the Diver”
Continue campaigning with my wife “Baldur’s Gate 3”
It’s always fun when the MDN documentation doesn’t tell us what the options are within the methods page, I you have to dig deeper into the constructor. The TypeScript bindings don’t always make sense.
Anyways, I needed a datetime string with the date, time in hours and minutes, and the timezone. I’ve made the timezone explicit and came up with this snippet.
Chicago is known as the windy city, not because of its wind, but because of its terrible politics. That said, if you visit between late September to April, bring winter wear.
Also, some of my information may be out of date. I lived in Chicago for the summer of 2014, and went back for a week in 2015 and 2017. I would love to make plans to come back.
Where to Stay
If you’re looking for a cultural area to stay in, Little Village is known for Chicano culture and was highlighted in a talk Morgan and I went to at her sociology conference
I’ve stayed in Lincoln Park, Lakeview, and Skokie
Lincoln Park is a rich area, so if you’re willing to pay more for a nice lake view, that’s a great area
Lake View is the neighborhood from the TV show “Family Matters” with Urkle. It’s next to Wriglyville, so if you’re looking to stay next to the ballpark and a bunch of nightlife and bars, that’s where it’s at
Skokie - Unless you are going to Evanston where Northwest is, or have any business being in the suburbs, there isn’t much to do
Other notable areas
Logan Square - if you’re looking for a multicultural neighborhood full of community, nightlife, food and drinks, this is the place to be.
Boystown / Northalsted - a great LGBTQ+ community much like the Castro. During pride month, there’s a lot of celebrations
one of the most country’s inclusive LGBTQ+ communities and the oldest officially recognized gay neighborhood in the United States. It’s known for its welcoming vibe, nonstop nightlife, LGBTQ-owned businesses, and excellent dining options. It’s also the center of some of Chicago’s most popular events and festivals.
Avoid: South Side, unless you’re going with someone who lives there
Exploring
Chicago is super walking and transit friendly. Since the city sold their parking meters to a bank, it’s super expensive to park around the loop (i.e. the downtown and Millennium Park). I recommend CTA’s L Train to get most anywhere you need to go and walk from there. If you stay in any of the above, there’s a huge chance the L will run near it.
Cultural and Seasonal
I already mentioned Pride month. During the summer, you’ll find block parties as well.
Music is huge in Chicago, whether that’s music festivals like Lolapallooza, Riot Fest, Pitchfork, or checking out the House of Blues, and far too many music venues to list.
There are so many cultural enclaves when you explore Chicago.
Chinatown - I’d be remiss if I didn’t mention it. It’s certainly not bay area big, but it’s notably big for the mid-west. Again, that’s not saying much as I thought this should have been bigger. I’ve had dim sum here as well as a haircut, and they were pretty comparable to the Manhattan Chinatown. But not Flushing. That’s a whole lot bigger.
Greek - I accidentally stumbled into the greek festival, and they’ve got their own community. Also, My Big Fat Greek Wedding takes place in Chicago.
Polish - I was surprised how prominent polish people were in Chicago. I had my first Pierogis here. I think I went to Polombia, which combines Polish and Colombian food.
Ukrainian Village - I didn’t know this existed before. I’ve been meaning to check it out
Little Village - I mentioned it in the places to stay. “La Villita” is also worth exploring for the art, food, and nightlife.
If you’re a comedy fan, there are great live shows from Second City. There are many prominent names who’s come out of here, including Stephen Colbert, Steve Carell, Tina Fey, and Amy Poehler.
If you want theater, they have their broadway and off-broadway shows as well.
Year Round Places to See
Navy Pier - Like Santa Monica Pier, and less dingy than Coney Island
Field Museum - I loved this museum. Sectioned off into many exhibits. Worth it.
Art Institute of Chicago - I’ve heard a lot of good things from others about this, but haven’t been myself
Logan Square
Millennium Park and the Bean - during the summer, I recall they have movie in the park. Of course, you can get up close to the bean
The Waterfront - If you love running, this is probably the best place to run. It runs adjacent to Lake Michigan, and is quite a site to view all of Chicago’s skyscrapers
Foodies Beware
Chicago is a food hub for some serious high-end restaurants, as well as some great local staples. Since you have to reserve far in advance for some of these, I’ll leave the high end ones at the front.
Alinea - Chef Grant Achatz’s innovation to modernist cuisine has been universally praised. It’s a restaurant where the kitchen is far bigger than the dining area, and they have limited seats per night.
As an aside, they also have off-shoots, like cocktail bars called the Aviary and The Office. I’ve heard great things about this
Girl and the Goat - Chef Stephanie Izard’s restaurant known for its roasted pig’s face. If you’re seeking a restaurant known for cooking with the whole animal, it’s this place.
Honestly, I can’t list them all, so here’s a primer list.
For more common day food, Chicago has a lot to offer.
If you’re looking for that Chicago deep dish, the easiest place to find it is in a chain of restaurants called Lou Malnati’s. Order ahead, as it may take up to 30 minutes for them to bake it. There’s of course a ton of other options. I know on my list to check out is Burt’s Place where they serve it to you in the pan.
The other prominent Chicago-esque food is the Chicago Dog. I personally don’t care for it as much as others do, but if you like this pickle hot dog contraption, check out Fastso’s Last Stand. Also, other places.
Resources
Wikivoyage - Chicago - I think WikiVoyage has some great breakdowns of major metro hubs. Chicago is very diverse, and you should get to know its different neighborhoods before going. Setup a short itinerary as it can be a lot to take in.
If May was a happy time in our lives, then June erupted with a rude awakening. My wife and I caught COVID for the first time, which is surprising we didn’t catch it sooner. The first week hit me hard, the second week I lost my sense of taste. It was the weirdest thing as I was cooking some stew, I felt lost without my sense of smell. I know there were some viral moments during the pandemic of people showing how they could eat the weirdest combinations, and it was bizarre, but that seemed like a blip in history. When I lost my sense, it dawned on me how much we rely on our olfactory to navigate the world. I burned a candle and couldn’t smell it, convincing me if I was in a burning building, I’d have to rely on my sense of touch over smell.
I was mostly recovered by the third week. I dread anyone suffering through long COVID. Let me know how your COVID experience went if you’ve caught it. And if you haven’t, my goodness, keep it up.
Yuzu in front of Mission Santa Clara
Crafting Around
After a short hiatus, we are back to posting my weekly notes.
Sometimes, you’ll see me posting on my personal stream. I’m thinking of adding Webmentions to the website so I can tie these into federated social networks. If you have experience around this, please let me know 😀
On my “build list” is a small AI app to allow students to ask questions about their class given their syllabus. I shared my notes about RAG understand the topic.
Boz breaks down his system, Inbox Ten. “For those who are curious, my system is Inbox Ten. That means I aim to end every day with fewer than ten emails in my inbox. I also have fewer than ten open chat threads across all interfaces. I’ve also read all relevant notifications in internal tools, read all relevant posts in internal groups I care about, and started rough drafts of any relevant proactive communications I intend to produce.” Personally, I try to stick to clean my digital house weekly via a weekly review.
“Amateurs, in contrast, are not certified as knowing. They may or may not know, and their ‘knowledge’ may or may not be trustworthy, but they are always seeking. They are striving to know, in their own ways of knowing, ways that are meaningful to them but may or may not be meaningful to others. Amateurs are always learning, never at a steady state of knowing.” Some of the ethos in this blog is to have a beginner’s mindset, and this piece of writing embodies that by Peter Gray on his newsletter post, In Praise of Amateurism.
Nadia Asparouhova explores jhanas. “Jhanas are like swirling the paintbrush of your consciousness across a palette of altered sensations. These states vary in intensity; some are comparable to psychedelics, MDMA, or dissociatives.” I’m extremely interested and will be diving deeper.
Kent Beck writes “Make the Change Easy Then Make the Easy Change” in his post Hinge.
I’ve changed the process in how I write these by placing all of the day’s note into this note and curating out the pieces that are clear they won’t make it to these weekly notes. It’s due to the random things we look up on a day-to-day basis that don’t matter on the weekly cadence. And it goes to show how much we leave out once we are done with our curation.
Personal Learning
I’ve been trying to understand jscodeshift as React 19 is around the corner. With the help of Claude (and a little of ChatGPT, although their model was a lot worse) to explain how to crawl the AST. I wrote a stream about the trouble I went through
Recommendation comes from Sophie Fuji, who wrote “The book recounts how tourism took off in England. It concludes with the evolution of tourism from travel ‘regulating imagination with reality’ to ‘regulating reality with artifice’”.
While both are true, I would rather have the shorthand, as that’s what we have strictly for eslint rules. This Github Issue helped describe the solution on how to implement in your transform file.
Be a cycle maker, not a cycle breaker
— Jatee Kearsley, owner of Je T’aime Patisserie Bed-Stuy, Brooklyn. Video
This idea of forgoing cycle breaking to making new cycles, like being the first grad to your family, or running your own business. Jatee talks about being the first business owner in her family, and I loved her enthusiasm and spirit.
Reflection - I’m using these weekly notes to remind myself what I’ve been reading and consuming over the past week and reminding myself why these things are important to me. I’ve felt myself being pulled in too many directions, and the heading in this note help me understand what overall topics are interesting me as of late. Hopefully I want to string these together into more cohesive themes that I can thread from week to week.
Because of [Google Maps] global scale, even a small shift in maps routing from a seemingly-innocuous (and frankly very useful!) feature could create a reinforcing feedback loop with spatial inequality. Inadvertently diverting foot traffic from low-income streets to high-income streets takes revenue and potentially tax dollars from already struggling communities and funnels it instead to richer communities.
Thread by @kaseyklimes
A long piece I found worth reading as a DevBootcamp grad. Ben breaks down the issues with ISAs and the background with BPPE, as well as management at Lambda School / Bloom Institute of Technology and their untrustworthy CEO.
Jenny Nicholson - The Spectacular Failure of the Star Wars Hote
Someone mentioned in the comments how much research she’s done in this experience and how that service has already flopped. The amount of research into this topic is nuts.
where 7382225350710824222 is the video id you get from TikTok from this example link: https://www.tiktok.com/@_jen_hamilton_/video/7382225350710824222.
The TikTok v1 player has a bunch of controls that you can use to modify from this documentation.
There’s still some wonky height issues, and I suspect this is the default height Obsidian has on the container around the editor. I gave it a good enough viewable height of 50vh, which should be enough.
I use my Obsidian Daily Notes. Each of those daily notes are reviewed on a weekly basis (hello Weekly Notes) and may be added to its own Obsidian note. Sometimes they get added as Streams.
Book: Frostbite: How Refrigeration Changed Our Food, Our Planet, and Ourselves. By Nicola Twilly. Amazon
An engaging and far-reaching exploration of refrigeration, tracing its evolution from scientific mystery to globe-spanning infrastructure, and an essential investigation into how it has remade our entire relationship with food—for better and for worse
Book: Simple Marketing For Smart People: The One Question You Need to Win Customers without Gimmicks, Hype, or Hard Selling. By Billy Broas and Tiago Forte. Amazon
I started this book this week
Book: How to Baby: A No-Advice-Given Guide to Motherhood. By Liana Finck. Amazon
That’s more than just parroting back what you’ve already seen. I think that these models don’t just parrot back what they’ve seen. I think that they’re able to extrapolate beyond what we’ve shown them, to recognize patterns in the data and apply those patterns to new inputs that they’ve never seen before. Definitively, at this stage, we can say we’re past the stochastic parrot hypothesis.
Stochastic Parrots hypothesis
The claim of that paper is that these [models] are just repeating words back at us, and there isn’t some deeper intelligence. And actually, by repeating things back to us, they will express the bias that the things are trained on.
what does stochastic mean in AI?
In AI and machine learning, “stochastic” refers to a variable process where the outcome involves some randomness and has some uncertainty. It is a mathematical term closely related to “randomness” and “probabilistic” and can be contrasted to the idea of “deterministic.” Stochastic processes and algorithms make use of randomness during optimization and learning, which allows them to avoid getting stuck and achieve results that deterministic algorithms cannot.
Brightwave shared some tips on leveraging LLMs as Judges:
Human vs LLM reviews: while they work with human annotators to create high quality datasets, that data isn’t just used to fine tune models but also as a reference basis for future LLM reviews. Having a set of trusted data to use as calibration helps you trust the LLM judgement even more.
Ensemble consistency checking: rather than using an LLM as judge for one output, you use different LLMs to generate a result for the same task, and then use another LLM to highlight where those generations differ. Do the two outputs differ meaningfully? Do they have different beliefs about the implications of something? If there are a lot of discrepancies between generations coming from different models, you then do additional passes to try and resolve them.
Entailment verification: for each unique insight that they generate, they take the output and separately ask LLMs to verify factuality of information based on the original sources. In the actual product, user can then highlight any piece of text and ask it to 1) “Tell Me More” 2) “Show Sources”. Since there’s no way to guarantee factuality of 100% of outputs, and humans have good intuition for things that look out of the ordinary, giving the user access to the review tool helps them build trust in it.
It’s been clear in the last year that the half-life of a model is much shorter than the half-life of a dataset
This method is particularly valuable in fields like chatbot development, where the ability to provide precise answers derived from extensive databases of knowledge is crucial.
RAG fundamentally enhances the natural language understanding and generation capabilities of models by allowing them to access and leverage a vast amount of external knowledge. The approach is built upon the synergy between two main components: a retrieval system and a generative model. The retrieval system first identifies relevant information from a knowledge base, which the generative model then uses to craft responses that are not only accurate but also rich in detail and scope.
Types of RAG
Vector-based RAG - the most common type of RAG.
You convert text into “embeddings” and store them in a vector database.
Overview showing RAG with a Vector DB
Vector databases enable search functions that are much better than typical keyword searches. If users are looking for data that has semantic similarity, a vector database can often help them find those data points, even if there isn’t a literal keyword match
The downside is the context can be lost, especially when its relational context between data points. When chunking vectors, they use data-point similarity based on nearness. See KNN (k-nearest neighbors) and ANN (Approximate Nearest Neighbor)
Graph-based RAG
Instead of using a vector database, you use a Graph Database. A Graph DB contains vector information where links also store data. This allows relational information from retrieval
Extremely esoteric bug. I’ve had an open issue for the past three months related to this other issue. I couldn’t figure out why npm’s registry would pull an older version of d3-scale-chromatic when I upgraded the @observable/plot library. As a future note for myself, if I run into this issue again, I’ll have to go into the package-lock.json file and update d3-scale-chromatic to v3.1.0.
Coming out of vacation is hard to transition back into the normal routine gears. As such, it’s the end of the week and I haven’t reviewed my notes from the previous week.
I lost my sense of smell, known as parosmia?, and it completely threw me off guard. And by losing your sense, you notice the hidden ways you use your nose. Like detecting smoke, cooking, and tasting food. Or the smell of the outdoors like petrichor after it rains.
I’m trying something new with this week’s format. It took far longer to create, so I think I might scale it back next week. Let me know if you like this better.
For those who are curious, my system is Inbox Ten. That means I aim to end every day with fewer than ten emails in my inbox. I also have fewer than ten open chat threads across all interfaces. I’ve also read all relevant notifications in internal tools, read all relevant posts in internal groups I care about, and started rough drafts of any relevant proactive communications I intend to produce.
— Boz
Amateurs, in contrast, are not certified as knowing. They may or may not know, and their “knowledge” may or may not be trustworthy, but they are always seeking. They are striving to know, in their own ways of knowing, ways that are meaningful to them but may or may not be meaningful to others. Amateurs are always learning, never at a steady state of knowing.
— Peter Gray on his newsletter, Play Makes Us Human, writing “In Praise of Amateurism”
From this ACM paper, On the Dangers of Stochastic Parrots, the hypothesis is maybe these LLMs are parroting back what we already know and aren’t learning. We can probably, maybe, safely say that is no longer the case.
This month’s newsletter is purposefully shorter because I got married this month! I decided to take off time from work and other obligations to embrace the moment. There’s times in our lives we want to cherish the experience over spending time lost in our devices, so I dedicated two weeks to wedding preparation, having the wedding, and enjoying a much needed break on our honeymoon.
Walking away from the altar
I hope you all are doing wonderful and looking forward to starting something fresh in June!
After a month long break, we’re back! The reason for my absence is I got married! 💒
At the altar
It’s been one crazy month. Everything leading up to the wedding was a whirlwind.
Everything after the wedding has been nice and calm. We spent our honeymoon in Maui, then all of last week after our return, we spent on the couch sick with COVID-19.
This week, we’re back. I’m coming back at you all with some links that I found for the entire month. After this update, I’m going to overhaul a few things about the weekly notes.
Link Roll
The goal of a book isn’t to get to the last page, it’s to expand your thinking.
— Dave Rupert
Everyone is waiting for that one post, that one video, that one podcast from someone that explains things is just such a way they can understand.
— Jim Nielsen
I’m pretty mad about this article. What I’m taking away from it is the low level details don’t matter for human comprehension. That’s really not true. Many times, assumptions are made early on that take a codebase one way, then later on, the requirements change and logic needs to be adjusted.
I’m not sure this person has spent enough time with LLMs on how messy the code they write is. Like it’s fairly unoptimized and feels extremely hacky. Yes, the code will be better in the future, but today’s LLMs don’t have this yet. And to expect a CEO to determine how this code is run is terrible because the nuances of what needs to be comprehended is not there.
Instead, the work of an engineer isn’t to read prompting with the LLMs output is but to decide if the code is maintainable. The idea of configuration over convention increases cognitive exercise, not decreases it. The article assumes the LLM output can read and write through the code and the engineer is lazy and doesn’t want to read through technical details. The best engineers are the ones who read through those technical details and understands those nuances.
I agree though in that businesses don’t care about code craft. They have other priorities - and it boils down to being able to make money (in a for-profit anyway).
Wood chips or the material cut from a book can be used as bonus material
I just realized TikTok and short form video appeal is when you’re reading articles and books on behalf of an audience. Like duh. People don’t read and it’s easier than reading
One creator I didn’t know I was missing from my life was Van Neistat. His philosophy about the spirited man really speaks to me in a way I wish I found earlier. One of his videos surfaced about screws. It’s not a comprehensive look at them more than a practical one. I spent a lot of time with my dad at Home Depot, and screws have always fascinated me on our 3-hour long trips there.
Also from Colin and Samir interviewing Van. On why digital tools don’t translate for him. His brain is wired different.
While the Republican-led Congress has used its power to condemn any protests on behalf of Palestinians, where was the same outrage and zealousness when white nationalists came to college campuses?
I think about the Shiny Toy Syndrome every so often. A few years ago, I was being interviewed on a live stream, and the chat kept bringing up more technology I’ve heard of but haven’t used yet. It’s one of those nagging things in the back of your mind that you must catch up with the latest and greatest. However, having worked in software for the past decade, the latest and greatest is oftentimes obfuscated with what is known to work and what doesn’t. Best practices take time to discover. Many corner cases are not covered. And sometimes the new shiny thing is hidden from your readers or customers, so you are cranking widgets over creating value.
I love playing with new toys. But there comes a point where to get anything done with that toy, you have to learn from YouTube tutorials, blog posts, and Reddit threads. After mindlessly scrolling through this, your brain is too tired to start. (I’m looking at you Anki). Sometimes, it’s best to get started with what you already know today, and later pick up the tool if it meets your criteria.
If you know how to use Postgres and SQLite, use them! Are those new databases fun to play with? Yeah, I bet they are, but you know that will be time spent on learning that new tool. I’ve been in tutorial hell since starting my programming journey, and I realize it’s better to pick up a new tool when you’ve got a project in mind. But be warned, it should be the only new variable. If you try to stack new technologies together, you’re in for one hell of a ride. Like if you want to use a new Database, caching layer, and server framework, good luck to you. I don’t have the time or patience for that. I’d rather spend my evenings working on enough knowns.
That brings me to the Should vs. Must. In Elle Luna’s book, The Crossroads of Should and Must, she describes this pull of doing what you know in your gut is right. For her, it was painting on canvases in her private studio. I rarely think my pull is to learn R for the fun of it. It’s typically with a different goal in mind, like using R for statistical methods to run on a specific dataset to help me determine statistical significance. With a more specific goal in mind, I’m able to let go of my brain’s tendency to try and understand everything before getting started. An old co-worker of mine thinks about this like inertia. You need a certain amount of activation energy to get you started. When that goal is clearer in my mind, I’m able to lower that activation energy and get the ball rolling faster.
Don’t know enough breadth? Call an expert to get you started.
Don’t know how all of these technologies might go together? Oh boy, there’s an exciting new thing called Large Language Models that might be able to help make you a scaffold.
And many times, the technical aspects are the easiest. The harder part is the context in which you’re creating something. And understanding the market to validate your ideas. Or interviewing your customers to understand the needs of the customer.
Stick with the boring stack. In a recent episode of the Changelog, Kelvin Omereshone (K.O.O) talked about SAILS and being a boring stack. SAILS is a full-stack framework that’s been around for over a decade. It’s reliable. It’s using technology that’s been around for a while, hence “boring”. But that’s the point of being boring. It shouldn’t be there to stop you from what you’re doing. It should liberate you to think about the next thing.
Just start. In An Invocation for Beginnings, Ze Frank talks about all the little ways we start or don’t start. Starting looks different to different people. What you should steer away from is how an idealized version of starting should look like. Embrace the mess. Start with a brainstorm, a post-it note, or a lot of Post-it notes. Fill your desk and reject the idea everything has to be perfect-looking. Life is not a super well-organized bullet journal with neatly made gridlines. It’s imperfect and full of unknowns and assumptions. Start the process before making the template. Don’t edge towards a premature optimization. Just start.
Then, once it’s up and running, we talk about what will work tomorrow.
The weather in the Bay Area during this season is like Mother Nature flipping the switch between cold and hot. She can’t make up her mind if it’s ready for full blown summer or cold rainy days. This comes as I think if lavender bushes will bloom for my wedding next month 🤞🏼. Like most things in life, these forces are outside our control. You prepare as much as you can and let the rest play out.
As with the previous months, I come with some website updates.
Inspirations
I carved my own space of curated inspirations. A table of websites that should technically be a mood board of the vibes I think could go with CraftByZen’s website.
For the past few years, I’ve kept a note of inspirational websites. These websites include blogs that I continue to follow, creatives showing their talents, and web design that makes me wonder.
In the future, I want to expand this to other types of inspirations. It’s driven by my own curiosity attractors.
The Stream
I created a separate feed called “The Stream”. I wrote a short blog about it.
The stream is a personal feed of my thoughts on things I’m working on, interested in, or a random shower thought that might be worth putting some additional thought into. The stream is a form of expression, posting something spur of the moment, without the crowdedness of a social network like Twitter or Facebook. Don’t get me wrong, those places are great for comment and reply interactions. But I also need my own trail of what I’m writing and thinking about that’s not hammered by likes, comments, and other social features that I find distracting.
Classifieds
As part of an ongoing effort to engage my network, I want to use this opportunity for anyone to advertise on my newsletters. If you’ve got a big launch, trying to look for work, maybe find that missed connection, feel free to reach out to me.
As mentioned in the last newsletter, I’ve been practicing something along the lines of my theme, “The year of renewal”. In March, it was testing out different activities to break my dopamine addiction. A dopamine detox if you will. I realized how strong my pulls were and it will take more than a month to break those addictions, like doomscrolling and a constant feed of consumption. During April, I’m experimenting with renewed interests in language learning. I’m almost half a year with my streaks on Duolingo!
I hope you are all doing well and enjoy this lovely spring transition!
With the protests happening on US university and college campuses, I want to give some time and pause to reflect on what’s going on nationwide. There’s a lot of political discourse and turmoil over the past month, and I might mix some politics with the next few weekly notes.
Note: this week and next week my notes might be late due to some last minute wedding planning.
A Few Thoughts on Cryptographic Engineering (Matthew Green) - A quick post on Chen’s algorithm. A primer on Chen’s algorithm for quantum cryptography, although as of this writing, a bug has been discovered within it.
A checklist to setup for larger projects by Alex Kladov - Basic Things
Nadia Asparouhova writing in Asterisk - Manufacturing Bliss. I read her book, Working in Public. This seems to be a wildly different article about jhanas meditation and some Bay Area practitioners. Interesting read.
I forked a small demo from Wes Bos and ran in on my own sandbox. It seems much cleaner than using a script tag per each dependency, and works on all major browsers.
In my little demo app, I placed the importmap in the head of the document. I’m using react as well as my own utils file to test out the functionality.
From there, I imported these libraries in a script module.
<body> <div id="app"></div> <script type="module"> /* eslint-disable */ import { useState } from "react"; import { createRoot } from "react-dom"; import { formatMoney } from "utils"; createRoot(document.querySelector(`#app`)).render(formatMoney(100.2365)); </script></body>
I had a hiccup with [plugin:vite
] as I found countless others have, so I wrote a custom bun server to host this project. Hopefully there’s a better setup I can find with Vite using importmap in the future.
Luxon datetime library defaults startOf and endOf methods to UTC. But this isn’t great for end users who don’t live in UTC / GMT. To offset this, we need to grab the time zone offset from the user’s system.
I’ve become a lot more cognizant of how those first six words might be the only thing that show up in the notification panel on their phone, so I need to make sure that those words are a succinct and accurate overview in their own right.
This past week, I’ve been busy at work finishing up loose ends for the next major project. At home, we’re three weeks left until my wedding. We’ve got all major purchases out of the way for the event, as well as booking tickets to Maui for our honeymoon. 💒
The golden visa program brought Spain billions of euros in investments. But property prices paid by rich foreigners are well beyond the earning power of locals.
Today, I have my caps lock key remapped to escape. Hyperkey is an interesting proposition to have the cmd + option + control + shift key down at the same time to unlock more shortcut keys. I’m tempted.
This goes beyond site incident reports. I used to do this for testing as a quick way to determine if we had any weird testing debug outputs. But of course, Sentry bugs should fall under this too. We need to write this in.
No Mercy / No Malice - Prof K on Ketamine Therapy and Ketamine Seizures
While Kelvin talks about the benefits of using Sails, I was thinking about the other “boring” things that constitute a boring stack. It goes beyond tecnologies, like how to run a business, how to organize your team, and how to market the product. And when those things are boring, they are unsexy and oftentimes neglected.
A feature flag is a decision point in your code that can change the behavior of your application.
Temporary flags are often used to safely deploy changes to your
application or to test new behaviors against old ones. After a new behavior
is being used by 100% of your users, the flag is intended to be removed.
Traffic light showing a green light. Unsplash - Eliobed Suarez
Permanent flags give you a way to control the behavior of your
application at any time. You might use a permanent flag to create a
kill-switch or to reveal functionality only to specific users.
Traffic light showing a green light. Unsplash - Eliobed Suarez
Feature Flags Are Context Sensitive
The code path token can change based on the context provided; for example, the user’s identity, the plan they’ve paid for, or any other data.
Feature Flags Are Deployment Agnostic
Feature flags can be used to control which users can see each change. This decouples the act of deploying from the act of releasing.
Use Cases for Flags
Release - A temporary flag that initially serves false to all targets, then progressively rolls out true to targets until it reaches 100%
Kill Switch - A permanent safety mechanism used to shut off non-core functionality or third-party tools in an emergency
Experiment - A flag to test a hypothesis and provide continuous optimization using beta users and A/B tests
Migration - A temporary flag used to migrate data or systems while keeping your application available and disruption free
These are the ones advertised by LaunchDarkly. There are many more use cases, and they allow for customization.
What is LaunchDarkly?
LaunchDarkly is a company that provides feature flags as a service.
At work, flags are served and managed by LaunchDarkly’s services.
LaunchDarkly is integrated through streaming via web sockets, meaning each web app user session receives messages only when necessary. Changes can be pushed out to clients in real time.
A diagram showing the end-to-end connection between LaunchDarkly’s flag
delivery network and your application.
From here, we usually add conditional logic to toggle the flag logic to the target code.
We can also use the same method to do the same on the server-side as well.
Adding User Context
LaunchDarkly uses context to target which flags should be on or off.
The user’s context, known in LaunchDarkly as identity, must be used when initializing the application.
Anonymous Users
On initialization, a user session will be identified as an anonymous user.
This is because in the initialization, the user’s session token (access token) has not been verified yet.
Because we want to use flags for public users as well, i.e. those not logged into the app, we initialize the Provider before the token check.
An anonymous user has two attributes:
key - a unique identifier for the anonymous user and a field on the ldUser type.
anonymous - a field on the ldUser type that notes if a user is anonymous or not. Stored as a Boolean.
Authenticated Users
Once the user authenticates, and the application has retrieved the user context,
we identifies the user using the ldClient.identify function.
In this identify function, we pass along the following information about our user:
key: Our user’s unique identifier (as a uuid)
anonymous: false
email: the user’s email address
In addition, we pass along some custom fields that we can use to narrow down the user’s targeting.
This includes their role and their organization, since our app is a multi-tenant.
If this user has already been added to LaunchDarkly, their flag profile will be returned.
If this user is new, LaunchDarkly will automatically create this user, create their flag profile, and be returned.
Logout
On logout, the application re-identifies the user using the ldClient.identify function.
Since the application has a logout hook, we add a handler to identify the user to be an anonymous user again.
This resets all flags to switch over for anonymous users.
When do we change our flags?
Per Release - For each release, our release team has a list of flags to modify, including toggling targeting and changing rules and segments per rules.
On Market Support - There may be a request to make a non-release changes. These include new customer onboarding and turning on a feature for an existing customer.
Deployments
There are different types of deployments:
Canary Releases - User groups who would like to opt in
Ring Deployments - Different user segments at a time - e.g. beta or power users
Percentage-based Deployments - Start with low percentage, then move to higher. For operational changes
Each of these can be implemented using feature flags.
Feature flags and blue/green deploys are complementary techniques. Although there are areas of overlap, each approach has distinct benefits, and the best strategy is to use both.
Testing
It isn’t necessary (or even possible) to test every combination of feature flags. Testing each variation of a flag in isolation (using default values for the other flags) is usually enough, unless there’s some known interaction between certain flags.
Here’s an example using jest and LaunchDarkly’s mock testing library.
import { mockFlags } from 'jest-launchdarkly-mock';it('tests with the flag on' , () => { mockFlags({ [FLAG_IN_QUESTION]: true, }); // Write your test here});it('tests with the flag off' , () => { mockFlags({ [FLAG_IN_QUESTION]: false, }); // Write your test here});
Flag Maintenance
Cleaning up flags aggressively is the key to preventing technical debt from building up. There’s no royal road to flag cleanup, but there are some processes that make it manageable.
A stale flag is a temporary flag that is no longer in use and has not been cleaned up. Too many stale flags are a form of technical debt and an antipattern that you should avoid.
At work, we follow a practice to do it prior to any major release. This is about every 3 to 4 months.
Questions you should be able to answer now
What is feature management?
A decision point in your code that can change the behavior of your
application.
What is the difference between a temporary vs. a permanent flag?
A temporary flag will ultimately be removed from the application. A
permanent won’t and will stay as a kill switch.
How do flags configured in LaunchDarkly get delivered to our applications?
LaunchDarkly uses streaming via web sockets.
How can flag management be resilient to failures?
LaunchDarkly has multiple fallbacks. If their CDN goes down, it goes to
their service. If their service goes down, you can route it to an
external service like their relay proxy. If all of those go down, then
there will be cached results from the last sucessful response. And if
this is a first time request, then a fallback default value is used.
I wrote a script that updates my daily notes to add properties. Since I’ve been using Obsidian for awhile, properties was introduced much later. I’ll walk through my code.
// Get the current file title, which is in a common date format: YYYY-MM-DDconst currentFileTitle = tp.file.title;// Set folder you want to get latest file for hereconst folder = "Calendar/Personal Reviews/journal and daily review/2022";// Get all files in that folder, including nested foldersconst filesInFolder = app.vault.getMarkdownFiles().filter(file => { return file.path.startsWith(folder);});// Sort files by file namefilesInFolder.sort((a, b) => a.basename < b.basename ? 1 : -1);// Get the index of the current fileconst currentIndex = filesInFolder.findIndex(file => file.basename === currentFileTitle);// Get basename of previous and next TFiles to be used in linklet previousEntry = '';let nextEntry = '';// Wrap it around a try catch block in case there's something wrong with getting these basenamestry { previousEntry = `[[${filesInFolder[currentIndex + 1].basename}]]`} catch (err) { console.error(err);}try { nextEntry = `[[${filesInFolder[currentIndex - 1].basename}]]`} catch (err) { console.error(err);}
Here’s my template that the templater plugin uses in markdown.
<%*This is where the JS code above is inserted-%>---tags: - logs/daily created: <% currentFileTitle %>previousEntry: - "<% previousEntry %>"nextEntry: - "<% nextEntry %>"---
I’ve had to modify this depending if the file already has properties or not.
I’ve been enjoying micro-blogging a lot more than I anticipated. It lowers the barrier for writing a quick post and sharing it. An essay is something that is a much heavier lift, and goes through many edits before I publish.
I didn’t realize where we were with AI-generated music.
Besides the Fuzzy Search, VSCode also now has locked scrolling when you have two windows side by side
I’ve been listening to the podcast, Shit You Don’t Learn in School. There are a lot of gems, especially around finding business ideas. I might take the patent one at some point
Also, if anyone would like to collaborate with me for a potential business idea brainstorm, let me know
There’s a waitlist for Ali Abdaal’s Productivity Lab. I’m debating it
I got a chance to play around with Elicit and was reading through Adam Wiggin’s
Tweet. I think
I might make a quick web app trying multi-column queries about a particular
topic and allow more of a computational style of conversational chat.
Computational style of conversational AI using Elicit
I was getting some errors in my unit test output because I converted my SVGs to React components using SVGR.
As such, I needed to re-configure Jest accordingly.
Create the mock file
export default "svgr-div"; // This is the kebab case that jest is looking forexport const ReactComponent = "div";// @see https://react-svgr.com/docs/jest/ for setup
In practice, you try to eliminate task barriers that require back and forth communication by setting dedicated block of time to meet. An office hour, reminiscent of your professor’s office hours, means you broadcast to your working network you are available in this block of time to chat about open loops.
The problem this solves is eliminating the number of unknowns in your work, whether that be client feedback, questions about a design contract, or ambiguous bug tickets. These tasks become open loops are require external help in order to uncover what tasks you have to do next. It also lowers the communication gap with your work network or team and bridge that gap of understanding. The end goal is it helps with end output and/or goals.
Championed by Cal Newport and highlighted in his book, Slow Productivity.
I periodically try to dump all of my mental contexts into my notes. I noticed this comes in a few different flavors.
Safari Tabs on my iPhone and iPad: Goes into daily notes
Random thoughts - go into drafts and get processed daily
Shopping - including groceries, bills, and things I would like but not need. Those all go into a task manager
Dangling tasks - gets reviewed in the task manager inbox weekly
Personal thoughts - journaling every two weeks, although I want to do this more often
Events I have not logged - go into my calendar.
Downloads folder - weekly processed into other folders.
Long-term storage in Dropbox and backup drive.
Short-term in Inbox folder
Photos - place special ones in folders. Select shots in favorites.
I am trying to think of other things that I purge. I used to write in a notepad and write on the page of everything I was thinking about. I used to write about people I have not spoken to in a long time that I should reach out to, mantras I came up with, or completely random thoughts.
Last week, I launched the Stream which I’m proud of. I finally have a short space to write things down quickly and post to the website, rather than the longer posts for my essays. It all blurs together as I work on different output types. At some point, I want a more robust content funnel for writing. Or somewhere I can see the progress of different writing pieces visible on one dashboard.
The stream is a personal feed of my thoughts on things I’m working on, interested in, or a random shower thought that might be worth putting some additional thought into. The stream is a form of expression, posting something spur of the moment, without the crowdedness of a social network like Twitter or Facebook. Don’t get me wrong, those places are great for comment and reply interactions. But I also need my own trail of what I’m writing and thinking about that’s not hammered by likes, comments, and other social features that I find distracting.
There’s something nice and calming about seeing half-formed thoughts and ideas on a screen that’s wholly yours. I wish there was more of this kind of web. I was drawn to Tumblr back in 2008 because you could Microblog before you had a Facebook, LinkedIn, Twitter, Threads, or your variant of Fediverse website. Or even prior like posting your thoughts, fan-fiction, and other inspired writing on LiveJournal. Nowadays, that’s all we read from and post to. Or graduated to video like an algorithmic feed like TikTok. No shade for these companies vying for our limited attention. I think I’d rather take it slow and read some stranger’s beautifully designed blog that has little nuggets than an endless scrolling monstrosity that makes you wonder why you’ve spent hours on Reddit, but can’t recall much of what you did.
There’s more I want to add here, like better search capability, pagination, and an updated description of the stream. It’s designed minimally to emphasize the point that it’s not supposed to be too rich nor attention grabbing. And its flow is based on my writing, and no one else. Welcome to The Stream.
Stands for Observe-Orient-Decide-Act (“OODA”) Loop. It’s an iteration because it
feeds back into itself. Initially applied for military use, but has since been
used for business decision-making and personal development.
Observe the situation and mentally note any key data points.
Orient by placing data in the context of existing knowledge and mental maps to create a picture of the current situation.
Make a decision on how to act in light of that situation.
I’m finally cleaning up my RSS feeds because it’s too untenable. In my Readwise Reader, my inflow is far greater with things I know I won’t read over things that I know I’ll read later. Hence trapping me in a cycle of scrolling over reading. I’m going to unsubscribe from a bunch of things.
For the past few years, I’ve kept a note of inspirational websites. These websites include blogs that I continue to follow, creatives showing their talents, and web design that makes me wonder. I remember years ago, Ayush and I would break down websites that made us go, “How did they do that?” and reverse engineer them. It was interesting going into the source code, trying to solve how someone managed to wrangle with CSS to create a pretty infinite scrolling experience.
I wanted to share some of those websites with you. In the inspirations section, I break down which websites I’ve found and share them with you. I am starting with people whose work I admire and ideas within it that I want to remix back to this website.
Sometimes these websites are minimal, and there’s elegance to it. Sometimes, there’s a lot of interactivity and media, and it’s not overwhelming. When I think back to this website, I’m constantly wondering what I could add, and more importantly, remove. It’s a constant battle to strike the right balance in design.
Watch out for more updates to inspirations, including written work, YouTubers, and so much more. There’s overlap with creators, but that’s a deeper dive into an artist’s work. I’m looking forward to updating these inspirations from time to time.
For the past few years, I’ve been trying something new instead of New Year’s resolutions: a yearly theme.
But first, what is a “yearly theme”? Instead of setting resolutions at the start of the year, you set an overall idea of how you would like to approach each year or season. This then becomes a guide for your personal and/or professional life throughout that period.
Ideally, you would also think of what the ideal outcome is for a set period and some key actions you would like to complete. This helps you maintain focus throughout the year when considering new projects.
My yearly theme for 2024 is “Year of Renewal”. As I mentioned in the last newsletter, I was under a lot of stress last year, and I thought I would take a step back and gather myself again.
In practice, this looks like a goal a month, focusing on a different part of renewal. January was defining boundaries. I answered the following questions:
What do I have to accept?
What do I leave behind?
What do I adopt?
This helped me determine how to bring in the new year by making these identifications.
In February, I wanted to renew my sense of play. As I’ll go over in my highlights, I’ve been playing with code again. ChatGPT and other LLMs have renewed my interest in bespoke applications, i.e. one-off applications that serve a singular purpose. It’s renewed my sense of what I like to work on, even if it’s a selfish purpose to fulfill my curiosities.
I’ll go over March’s goal in the next newsletter, as I’m still in the middle of it.
Craft By Zen Highlights
Now that I have a routine of adding content to my website, here’s a recap of what I did in March.
Weekly Notes - Weekly notes continue! I’ve been using that as a scratch pad collecting what I’ve discovered over the past week. I’ve wanted a reflection process that slows down the hose of information presented to us daily. There’s too much endless scrolling, and by forcing myself to review what it is I’m looking at. And also, at a second glance, I realize what’s important and not important to share.
Case in point, here’s an article about a couple who reconnected 77 years later.
Recruiters - as recruiters reach out to me, I’ve been adding their job postings to my classifieds.
Curations - I haven’t been as active in adding more curations. I have plans on adding a micro-blog at some point that will distinguish longer posts and a free-form stream of thought. I love the examples like The stream and The Verge authors.
Projects / Experiments - I was messing around with ChatGPT to create a Guitar Fingering tool to help me quickly look up a chord. I wasn’t satisfied with what I found online, so I aided ChatGPT to build on it, although, at the end of the day, I took what it outputted as a template and finished it myself.
Lastly, I was putting together some small scripts to help me parse through my Google Contacts export and add them to my Obsidian vault as a personal CRM. I will have an article to follow up with how I use the personal CRM soon.
Thanks for all of the support from everyone! If you like these updates, you can always reply to these emails and let me know what’s going on in your life.
Honestly, I didn’t know there was a community called Web of Weeknotes that posts on Medium and gets picked up by this filter. Right on. I stopped posting on Medium after everything got locked up in paywalls. I don’t feel right having to make people pay for a platform they don’t own. I thought freely writing on a platform means you should be able to share it with anyone. But then again, this isn’t Blogger or LiveJournal of yesteryear.
What’s interesting is when they mentioned the two party system in the early 1900s was not all that much different.
Progressivism wasn’t a thing yet, or was still its own party
Presidents were giving people jobs. The merit system wasn’t a thing yet either. Robert Moses wanted to enact a point-based system (much like how we use algorithms today)
Open-source intelligence (OSINT) is intelligence collected from publicly available sources. In the intelligence community (IC), the term “open” refers to overt, publicly available sources (as opposed to covert or clandestine sources)
By 2013, Netflix had begun entering into a series of “Facebook Extended API” agreements, including a so-called “Inbox API” agreement that allowed Netflix programmatic access to Facebook’s users’ private message inboxes, in exchange for which Netflix would “provide to FB a written report every two weeks that shows daily counts of recommendation sends and recipient clicks by interface, initiation surface, and/or implementation variant (e.g., Facebook vs. non-Facebook recommendation recipients). … In August 2013, Facebook provided Netflix with access to its so-called “Titan API,” a private API that allowed a whitelisted partner to access, among other things, Facebook users’ “messaging app and non-app friends.”
Honestly, I’m not depressed. I remember Austen Kleon’s book inspired me to read more obituaries. There’s some notable people (and throw in an aspect of design) that have passed away this past week.
The 2 pillars of strong relationships: High expectations and high support.
…
High expectations are the belief that the other person is capable of excellence, that their potential is only limited by their own views. High support is the ability and willingness to provide the love, support, and engagement to help the person meet those high expectations. Both are necessary to achieve a strong relationship.
— Sahil Bloom
Notable Videos
I didn’t realize how relatively new this all was with our switch to Natural Gas. And how much we’re shipping. This “bridge” seems quite permanent to me.
I keep a list of projects I want to work on called “Someday Builds”.
Many of these are bespoke apps that I know could help me, like an automation.
However, automations take time to build, and typically I’ll be able to finish
that task far faster than I can build the automation to reduce that overhead.
Case in point, I wanted to build a chrome extension that by running the
extension, the clipboard takes the head title and the full, cleaned link,
and copies it in markdown format. The reason I want this is to add quick links
to my daily notes without having to find the title of the article, put it in
the markdown format, grab a clean link, then add that to the parentheses in the
markdown format. Also, Obsidian loves to grab headings, so I will get a # symbol
for the description of the link. It’s a few extra keystrokes, and really not
worth the efforts (about an extra few seconds of my day, plus some extra effort).
Of course, the time to build is reduced to an hour of work with the help of
ChatGPT.
Prompt
I want you to act as a programmer. You have a deep knowledge of writing chrome extensions and understand the best practices. I will provide the purpose of the application and a feature set. If there are any ambiguities in the features, please pause in the next step and clarify questions using a numerical list format. Next, you will come up with the basic outline for the code as pseudocode before writing the program. The next message you will ask me is what the feature set is.
Want to build a chrome extension that by running the extension, the clipboard takes the head title and the full, cleaned link, and copies it in markdown format.
The chrome extension takes the webpage metadata and extracts the title. Then, it takes the URL. The output should be a string that is copied to the clipboard in markdown format as follows [Title](Link). I want the link to be clean, so no url queries like utm should be added. We can also register a shortcut that can trigger the extension. There should be a settings menu to modify this shortcut. Also, the settings menu should have a modifier for the output format. The name of this extension should be called “Copy Link to Markdown”.
Installing the Chrome Extension Locally
It’s been awhile since I’ve done this, so I Google searched an article to help me.
I used the Chrome dev team’s hello world extension as a guide.
Developing the Extension
The first generated codebase did not work. Of course, my prompt above says to pseudocode it first, which was a struggle because there were actual code snippets with a bunch of comments where the code should be. So I had to continue prompting it to give me the final code.
After about 15 minutes, I got the code working. That was after passing it back and forth a few errors and working through those one at a time. Then I saw opportunities everywhere of what I wanted it to do next, as well as places I knew where the codebase needs to be refactored.
I made it generate an image for the extension icon.
A screenshot of the extension in action
For whatever reason, the extension shortcut key needed to be set differently, so
I had to use a different menu for that.
Final Thoughts
I placed the extension on Github where you can play with it today. There’s a lot more work I need to do to make this extension publishable. But for a v1, it’s good enough.
The total development time was a little over an hour, and I’m happy about that because I’m already using it. And I can tell it makes a huge difference because I save links all of the time in my daily notes.
Instead of vertical format, which classes might tend to be presented with, you rewrite your concepts and smaller shots, especially when there’s a lot of information filled out to you lecture. This might be really good for understanding how to better study, especially when you go back to memorizing things for an exam and you Have to get better at the studying part of studying prepare for an exam
I did a really big re-write of my contacts in my personal rolodex, which I covered as part of a blog post I wrote recently. I was thinking about dissecting this further and exploring what next avenues to do with that. I was super curious what other people had to say about this topic, but it led to further discussion about how it relates to sales and marketing for their business. Or focuses on a specialized tool, like Monica. I have a few notes about this that I could also share as well.
In other news, my sleep has been destroyed again by springing forward for Day Light Savings, and I can’t seem to get to bed at a consistent hour. And I’m out of shape, as proven by running and biking again. Going full speed after stopping for a long interval was not a great idea.
Notable of the week
Gleam - Gleam is a friendly language for building type-safe systems that scale!
Running on the battle-tested Erlang virtual machine that powers planet-scale systems such as WhatsApp and Ericsson, Gleam is ready for workloads of any size.
I went through the language tour, and for the most part, it was straight forward. I learned about tail calls as recursion is used for looping.
Results are another thing I can’t really grapple with yet. As well as the left-handed arrow syntax for use, but I’m sure if I work with some Erlang, it will make more sense.
My mind has been wandering into thinking about how to stop the short-term, quick release, distraction hobbies. It’s a hard addiction to break. Very likely this will be a longer journey than a month of my “year of renewal”.
We rush because we’re late. We also rush because we want to move quickly away from discomfort. We rush to come up with solutions to problems that would benefit from more sustained consideration. We rush into obligations or decisions or relationships because we want things settled.
I’ve caught myself in a rush of “what is next” rather than ask myself “where am I at”. It’s this pull of not wanting to know how bad things are. Like what’s the status of my health? What’s the status of my relationships? My family? My obligations? Instead, I find myself numbing out, distracting away from the real problems. Of course, it’s not a rock bottom. It’s a functional state of just bearable enough to see where I’m at, then go back into my doomscrolling activities. It’s not healthy.
To counter this, I’m placing some mindful practices. Sprinkle them where I can. I started a new note called my North Stars, or guiding principles. They help me with heuristics in choosing one things over another. Like producing over consuming. Engagement over distraction. Little mantras that can help me escape the distraction loop.
Through Sunday, the life-threatening storm dumped over 7 feet of snow at Donner Peak, an 8,000-foot summit in the Sierra Nevada mountain range, the weather service said.
USA Today
My mom used to use a rolodex to keep track of her customers. She owns a hair salon, and she kept a single index card per customer with their name, phone number, and how often they visited. The analog solution made it simple to keep track of these customers, but the biggest pain was retrieving that information.
While I don’t run my own hair salon, I wanted to have my own version of the rolodex. Some people call this a personal CRM, but I never liked the marketing and sales analogy as that’s not the relationship I have with people. In Obsidian, I have a folder called “Rolodex” where each note has a person’s details, like a dossier. Through other notes, I’ll record interactions I’ve had with that person. Not every interaction of course, as that would make the system far too tedious.
A sample of an entry in my rolodex
I imported my contacts over from Google Contacts. I created a script to take a Google sheet export of those contacts and tidy up the information. Of course, I still have to go through and delete contacts who are actually not contacts. And I don’t mind having “weak” contacts as it helps color my notes a lot more when I had a one-time collaboration with them. Also, since Obsidian is bi-directional, I can connect people to each other.
I generally keep a map of contacts in a “map of content” or index of specific groups, like co-workers, activity groups, and close friends. This allows different connections to form for each segment type. Like periodic check-ins. For closer friends, I’ll reach out at least once a year if I have their birthday. Or remember I have to ask when their birthday is.
1-bit Large Language Models (LLMs) focuses on the innovative approach of quantizing model parameters to ternary values to achieve efficient performance comparable to traditional 32-bit models.
We explored the rationale behind moving towards smaller, more efficient LLMs, driven by environmental, economic, and deployment considerations, and the potential for these models to operate on consumer hardware.
Through analogies, we illuminated how quantization and stochastic quantization work to maintain model performance despite reduced precision, akin to summarizing a vast collection of books into single sentences that capture their essence. These discussions underscore the balance between efficiency and performance in the evolution of LLMs.
Yuzu - Switch emulator (and hot on a lawsuit w/ Nintendo, although. the case could be weak because you have to bring your own encryption key)
Summary: The podcast transcript explores the concept of intentionality in depth, as discussed between the host and their guest, Serena Collier. Intentionality is presented as living life with purpose, direction, and a conscious choice to pursue what one truly desires. It involves having taste, standards, and a vision for what one wants their life to be, alongside the determination to achieve it despite potential setbacks or failures. Practicing intentionality means creating a personal set of standards and desires, and actively making choices that align with those standards and desires to shape one’s life according to one’s personal vision. It’s about making deliberate decisions rather than going through life passively, and it requires resilience, tenacity, and a willingness to confront challenges and discomfort for the sake of personal growth and fulfillment.
None of us know what will happen. Don’t spend time worrying about it. Make the most beautiful thing you can. Try to do that every day. That’s it.
— Laurie Anderson
I hope everyone’s winter has been going well. This is typically the time we throw on additional blankets. The family enjoyed a Christmas tree this past January, and it’s been our signal for a warmer, cozier time. We may throw on a feel-good movie for good measure.
To be honest, I was scared to start again. I left in silence, leaving the last part of a 7-part series go unpublished. It has been silently published on my website, in case you care to go back to the archives. And I’m afraid I let everyone down by going silent for 5 years (seriously 😳). But another part of me wants to reach out, say hello, and tell the world what I’ve been up to. I miss the intimate space and the replies I would get from you, dear readers. Maybe in the future, I’ll make a Discord server or a forum. But alas, there’s only so much time in the day for starting new projects.
🧹 Housekeeping
I’ve made some major updates to my website. Last year, I did a major rewrite to make publishing as seamless as possible. I’ve had a lot of configuration issues in the past with my Jekyll project, and rather than futzing around with yet another Ruby manager, I’ve moved myself over to Astro.
The other reason for making updates to my website is it feels like my attempt at reclaiming space I willingly handed over the past decade with social media. I like the tiny web circles, like my friend’s Discord server and other blogs. By that same token, I love carving out my own Internet space.
As such, I’ve been hammering on additions that make my personal space feel more at home and less of a microblog you shout into the air with countless other quasi-anonymous people.
Curations: In my mind, a curation is a collection that has been personally selected for a topic or theme. I think of it beyond listicles, where I can dive into other thoughts as I’m describing my favorite book, movie, or favorite creator. There’s much to explore.
Now: I have added it to the now-list page. A Now page is what you’re up to now. Here’s mine. However, if you want an update, I’ll email it in this newsletter.
Projects: I’ve been busy updating my projects so they are all consistent.
Writing: I’ve been experimenting with different formats. Today I Learned (TIL), Weekly Notes, Website updates, and things that I’m learning. I’ve noticed I like a mix of short-form and long-form, and I’ll continue to publish regularly now my website administration is a lot easier to handle.
Logs: In case you didn’t know, I’ve been putting all of my media consumed in one place. At least the things I keep track of.
I won’t be as extensive in future newsletters about my housekeeping updates.
📣 Personal Note
I left some of you wondering about my father and his health issues. He’s back home and still recovering. We’re visiting him once a week, and things are slowly progressing. I will give you more updates when I have them.
As always, feel free to reply. Share something you’ve been up to this winter. Send pictures of your favorite captured moment of 2024. That’s all for now. 👋🏽
There isn’t much to update. This has been a slower week for me.
I’m thinking more about making small spaces online, and I’m thinking more
holistically about what that philosophy means to me. As well as gathering examples.
If you run a small website, reach out to me about how you’re treating your small
communities and how others can benefit.
As a kid, I love reading the classifieds in the SF Chronicle. It was an interesting time to see it in the advent of Craigslist. Of course, this is by no means an alternative to Craigslist. It is hardly a place for others to add classifieds. This is more like a personal space I can add a wall for you to tear a piece of paper like on those coffee shops for finding a gardener. Except it’s more specific to my own tastes.
In the coming months, I plan to add much more to this. It’s like a personal ad system that probably has better click through rates (jk). I loved Metafilter’s ads since they were more tailored to their audience. This is not a paid sponsorship or ad board. I don’t get paid for this, at least for now. If I do in the future, I’ll be sure to put my disclosures in the classifieds.
If you have any classifieds you want to share, feel free to email them to me. I’ll review them personally for now.
And maybe in the future I can add a “missed connections” section. I love easedropping on people’s first time dates, which have been plenty this past year. I plan on writing some short stories about them in the future.
I’ve been pretty active with the website updates. I thought it might do me a little good to start adding a short changelog to the website. This sounds like it will be different than my now page.
Around the Website
Re-arranged the tags so it is better formatted in-line with the published date
I’m also coming up with more ideas of what to do next. I’m thinking about doing a microblog inspired by Linus’ stream. I’m getting inspired from “From Jason” Where Have All the Websites Gone and how he thinks we should trade in our linktree links with things that we like on the Internet. Hell, if I think about my own patterns, they used to be on curated link aggregators.
Episode #171 of Have You Heard podcast: The Damage Done - There’s a large discussion happening about public education right now, and teaching to the Common Core. It’s not pretty, and makes me think hard about sending my kids to public schools
I tried talking to ChatGPT today and using voice as an input. While learning Mandarin might not be there yet (the AI voice doesn’t recognize tonal languages as well), I can see it being good for my Spanish.
I needed a regular expression for checking if a number has 1 decimal point.
Here’s the regular expression ChatGPT came up with: /^\d+(\.\d{1})?$/
Of course, it wasn’t actually the correct requirement.
It needed to check if it’s an integer (no decimal points).
And if it is a decimal point, it can be at most one.
I screwed up and tried to pair two quantifiers together.
So if you have ? and you want to use {0,1}, you can’t do {0.1}?.
And I didn’ need the group, although in retrospect, using the quantifier on the
group works, but removing the group makes the ? obsolete.
Here’s what I ultimately came up with.
function validateToOneOrNoDecimalPoint(number) { // Regular expression to match numbers with either 0 or 1 decimal point (optional) const regex = /^\d+\.?\d{0,1}$/; return regex.test(number);}// Example usage:console.log(validateToOneOrNoDecimalPoint(3.5)); // trueconsole.log(validateToOneOrNoDecimalPoint(10)); // trueconsole.log(validateToOneOrNoDecimalPoint(2.34)); // false (more than one decimal point)console.log(validateToOneOrNoDecimalPoint(5.)); // true (no decimal point)console.log(validateToOneOrNoDecimalPoint(5)); // true (no decimal point)
And I added even more test cases, and used regex.match over regex.test.
Subtle difference.
Solidifying my Weekly Review Template has been extremely useful. It reminds me what’s important and what’s not, and putting the reasoning as to why I put a task on my weekly review.
I found a YouTube short about this woman who lost her job, and her reaction was to be happy. Like of course it’s going to garner views, and she even admits it’s not the normal reaction people have to being fired.
I’ve become a huge fan of Jillian Hess’ newsletter, Noted. She distills what she’s learned by reading some of history’s favorite note-takers (and contemporary)
For all of these little hacks, I place them in a separate note with the title of the device. Our Crosley record player stopped spinning, and all I had to do was move the needle to the right
A rabbit hole I fell into was the history of the Fillmore in San Francisco, and the legacy of Bill Graham
One thing I was browsing through were the old concert posters for Fillmore West. The psychedelic poster art from Wes Wilson are just phenomenal, especially if you grew up listening to Jefferson Airplane, Janis Joplin, and The Grateful Dead.
Custom GPTs could be to build a technology tree visually connected to an infinite canvas app (parked idea)
“Rencontrer” is a meeting with the new. Remembrance is the comfort of recognition.
— Esther Perel
Last week, I learned there are three curiosity attractors. Curiosity Attractors are the recurring fascinations that you can’t shake, whether active or latent.
Epistemic curiosity refers to your desire to learn about the world and resolve gaps in your understanding
Empathic curiosity relates to your interest in connecting with others, understanding their perspectives and experiences
Diversive curiosity is that fleeting urge you sometimes feel to explore something new just for the sake of novelty, with no clear goal in mind
Curiosity attractors also often intersect with parts of your identity. We go back to questions that fit with our personal values and worldviews
— Anne-Laure Le Cunuff
I learned from Scott H Young that from these three models of learning, the model that appears to be best fit is based off differing prior knowledge. Even for a beginner, they do learn a lot, even if it’s still not as much as someone who came in with a lot of prior knowledge (and they get benefit too)
I have a bunch of files I want to rename using the rename utility.
If you’ve installed the rename utility on your Mac, you can use it to mass rename files in the terminal. The rename utility typically follows a specific syntax, and it’s quite powerful for renaming multiple files according to certain patterns or rules.
Here’s a basic example of how you can use the rename utility:
When dealing with filenames that contain spaces, you’ll need to escape those spaces in your command. Here’s how you can do it using the rename command:
rename 's/ Clear Labs//' *.md
This command will remove the substring ” Clear Labs” (including the space) from all .md files in the current directory.
Svelte is a component-based JavaScript framework that compiles your code at build time rather than at runtime. This means that instead of shipping a bulky framework to the client, Svelte generates highly optimized vanilla JavaScript code that updates the DOM. This approach results in faster load times and better performance. Additionally, Svelte has a small API surface area, making it easy to learn and use.
The following example is a simple counter application that teaches the basics of Svelte.
<script> let count = 0; function increment() { count += 1; } function decrement() { count -= 1; }</script><main> <h1>The count is {count}</h1> <button on:click={decrement}>-</button> <button on:click={increment}>+</button></main><style> main { text-align: center; padding: 1em; } button { margin: 0 1em; padding: 0.5em 1em; }</style>
The count is 0
Reactive Variables: let count = 0; This variable is reactive. Any changes to count will automatically update the DOM wherever count is referenced.
Event Handling: The on:click directive is used to attach click event listeners to both buttons, calling the increment and decrement functions accordingly.
Inline Handlers: If you prefer, you could inline these functions directly in the on:click handler for something even simpler, like on:click={() => count += 1}.
Conditional Rendering: Suppose you want to display a message when the count is above a certain threshold. You can use an {#if} block directly in your HTML:
{#if count > 10} <p>You have reached a count greater than 10!</p>{/if}
Svelte Components
Expanding our simple counter application by breaking it down into smaller components, which is a common practice for improving the organization and reusability of your code in larger applications. We’ll create two components: CounterDisplay for showing the current count and CounterButton for the increment and decrement buttons.
Create a new file named CounterDisplay.svelte in the src directory. This component will be responsible for displaying the count.
<script> // This component accepts a prop named `count` export let count;</script><h1>The count is {count}</h1>
Create another file named CounterButton.svelte in the src directory. This component will represent a button that can increment or decrement the counter.
<script> // The component accepts two props: the button text and the click action export let text; export let handleClick;</script><button on:click={handleClick}>{text}</button>
Now, update the App.svelte file to use these new components.
<script> import CounterDisplay from './CounterDisplay.svelte'; import CounterButton from './CounterButton.svelte'; let count = 0; function increment() { count += 1; } function decrement() { count -= 1; }</script><main> <CounterDisplay {count} /> <CounterButton text="-" handleClick={decrement} /> <CounterButton text="+" handleClick={increment} /></main><style> main { text-align: center; padding: 1em; }</style>
Props: Components in Svelte can accept “props”, which are custom attributes passed into components. In our case, CounterDisplay accepts a count prop, and CounterButton accepts text and handleClick props. This allows the components to be reusable and dynamic. Props are reactive, where any prop changes will trigger changes in the component.
Component Interaction: The App.svelte component manages the state (count) and functions (increment and decrement) and passes them down to the child components. This demonstrates a fundamental pattern of component-based architecture: lifting state up and passing data and behavior down through props.
Event Handling in Child Components: The CounterButton component receives a function (handleClick) as a prop and attaches it to the button’s click event. This is a common pattern for handling events in child components and allowing parent components to define the behavior.
Slots in Svelte
Slots in Svelte allow you to create components that can accept content dynamically from their parents. This is similar to transclusion or content projection in other frameworks. In other libraries like React, this is handled with children. Slots make components more flexible by letting you inject content into predefined places within a component’s template.
Basic Slot Example
Imagine you’re building a Card component that you want to reuse across your application, but with different content each time.
Card.svelte:
<div class="card"> <slot></slot> <!-- This is where the parent's content will be injected --></div><style> .card { border: 1px solid #ccc; border-radius: 8px; padding: 20px; margin: 10px 0; }</style>
You can use this Card component in a parent component and pass in different content like so:
<script> import Card from './Card.svelte';</script><Card> <h2>Title</h2> <p>This is some card content.</p></Card><Card> <p>Another card with different content.</p></Card>
Named Slots
Svelte also supports named slots, which allow you to define multiple slots within a single component.
Card.svelte updated with named slots:
<div class="card"> <header> <slot name="header"></slot> <!-- Named slot for header content --> </header> <slot></slot> <!-- Default slot for main content --> <footer> <slot name="footer"></slot> <!-- Named slot for footer content --> </footer></div>
Module scripts in Svelte introduce a powerful feature for managing reusable code and behaviors in your components. A module script runs once when a component is first imported, rather than each time a component instance is created. This makes it ideal for defining shared logic, helpers, and stores that can be used across all instances of a component.
To define a module script in a Svelte component, you use the <script context="module"> tag. Anything declared inside this tag is scoped to the module, not to individual instances of the component. This is particularly useful for situations where you want to maintain a shared state or perform actions that only need to happen once, regardless of how many times a component is instantiated.
Here’s a simple example:
Counter.svelte:
<script context="module"> // This count is shared across all instances of Counter.svelte let count = 0; export function increment() { count += 1; console.log(count); }</script><script> // This script block is for instance-specific logic and state import { onMount } from 'svelte'; onMount(() => { // Call the shared increment function when the component mounts increment(); });</script><p>This component has been instantiated.</p>
In this example, the increment function and the count variable are defined in a module script and shared across all instances of Counter.svelte. Every time a new instance is created, it logs the incremented count, demonstrating that count is shared and persists across instances.
Use Cases for Module Scripts
Defining shared utility functions: For components that require common functionality, you can define utility functions in a module script to avoid duplicating code.
Creating singleton stores: If you need a store that’s shared across all instances of a component, defining it in a module script ensures that you have a single, shared store.
Optimizing performance: Since code in a module script is executed only once, it’s an excellent place for performing expensive operations like setting up subscriptions or fetching data that should be done once per component type, rather than once per instance.
Advanced Component Composition
Module scripts complement Svelte’s component composition model by allowing you to abstract and share logic effectively. For instance, you can combine module scripts with slots, props, and context to create highly reusable and customizable components.
Imagine a scenario where you’re building a library of UI components. Using module scripts, you can provide a consistent API for configuring these components globally (like themes or internationalization settings) while using instance scripts for configuration that is specific to a component’s use case.
Considerations
Scoping: Remember that variables and functions declared in module scripts are not directly accessible in the instance script or the component’s markup. To use them in the component, they need to be exported from the module script and then imported or used in the instance script.
Singleton behavior: Since the module scope is shared across instances, be mindful of side effects that might occur when modifying shared state. This is similar to how static variables would behave in class-based languages.
Stores for State Management
Svelte Stores takes a reactive approach to state management, which is different than Redux. At the core of it, see the following.
Creating a Store: The simplest form of a store in Svelte is a writable store. For example, creating a store to hold a number could look like this:
import { writable } from "svelte/store";const count = writable(0);
Subscribing to a Store: To access the value of a store outside of a Svelte component, you subscribe to it. This might be where syntax can get tricky. Use the $: syntax intuitive for reactive statements. Alternatively, you can directly subscribe using .subscribe method.
Updating Store Values: Svelte provides a few patterns for updating the store’s value, such as set, update, and using the auto-subscription feature within components with the $ prefix.
Reactivity: One of the powerful features of Svelte is its built-in reactivity. Reactive variables automatically propagate through your application.
Derived Stores
Derived stores let you create a store based on other store(s), automatically updating when the underlying stores change. This is useful for calculating derived values or aggregating data from multiple sources.
Example:
Suppose you have a store for a list of items and another derived store that calculates the total number of items.
For applications with complex state, consider structuring your store as a JavaScript object or even using a custom store. Custom stores can encapsulate more complex behavior, such as asynchronous operations or integration with external data sources.
Creating a Custom Store:
function createCustomStore() { const { subscribe, set, update } = writable(initialValue); return { subscribe, // Custom methods to interact with the store increment: () => update((n) => n + 1), decrement: () => update((n) => n - 1), reset: () => set(initialValue), // More complex operations... };}
Slots and advanced state management techniques in Svelte offer a combination of simplicity and power, enabling you to build complex and dynamic applications with less code and more declarative, readable structures.
Actions
Svelte actions are a powerful and somewhat under-appreciated feature that provide a neat way to interact with DOM elements directly. Actions allow you to attach reusable behavior to DOM elements, which can be especially useful for integrating third-party libraries or creating custom directives that enhance your application’s functionality without cluttering your components with imperative code.
An action is simply a function that is called when a DOM element is created, and it returns an object that can contain lifecycle methods like update and destroy. Here’s a basic outline of how actions work:
Creating an Action: To create an action, you define a function that takes at least one argument, the element it’s attached to. This function can return an object with optional update and destroy methods. The update method is called whenever the parameters of the action change, and destroy is called when the element is removed from the DOM.
Using an Action: You apply an action to a DOM element in your Svelte component using the use directive.
Here’s a simple example to illustrate:
Defining a Simple Action
Let’s say you want to create an action that automatically focuses an input element when the component mounts:
// focus.jsexport function autofocus(node) { // Directly focus the DOM node node.focus(); // No need for update or destroy in this case, but they could be added if necessary}
Applying the Action in a Component
You can then use this action in any component like so:
<script> import { autofocus } from './focus.js';</script><input use:autofocus />
This example is quite basic, but actions can be much more complex and powerful. For instance, you could create an action to:
Implement drag-and-drop functionality by attaching mouse event listeners to the element.
Integrate with third-party libraries, such as initializing a date picker on an input element.
Add custom animations or transitions that are not easily achieved through Svelte’s native capabilities.
Svelte makes adding animations and transitions to your web applications straightforward and intuitive, enhancing user experience with visual feedback and smooth transitions. Let’s explore how to add a simple fade transition to elements in a Svelte application, and then we’ll look at a more interactive example.
Transitions and Animations
Svelte’s transition functions, such as fade, are part of the svelte/transition module. To use a fade transition on an element, first import fade from this module.
Example:
<script> import { fade } from 'svelte/transition'; let isVisible = true;</script><button on:click={() => (isVisible = !isVisible)}> Toggle</button>{#if isVisible} <div transition:fade={{ duration: 300 }}> Fade me in and out </div>{/if}
In this example, clicking the “Toggle” button shows or hides the div element with a fade effect over 300 milliseconds.
Fade me in and out
Interactive Animation Example
For a more interactive example, let’s create a list where items can be added and removed, each with an animation. We’ll use the slide transition to make items slide in and out.
First, add slide to your imports:
<script> import { slide } from 'svelte/transition'; let items = ['Item 1', 'Item 2', 'Item 3'];</script>
Now, create a function to add a new item and another to remove an item:
function addItem() { items = [...items, `Item ${items.length + 1}`];}function removeItem(index) { items = items.filter((_, i) => i !== index);}
Finally, render the list with transitions on each item:
In the #each block, we use the slide transition to animate the addition and removal of list items. The (item) key ensures that Svelte can uniquely identify each item for correct animation, especially during removals.
Item 1
Item 2
Item 3
Customizing Transitions
Svelte’s transitions can be customized extensively via parameters. For both fade and slide, you can adjust properties like duration, delay, and easing (to control the animation’s timing function). Svelte also supports custom CSS transitions and animations, giving you complete control over your animations’ look and feel.
Using the Basic Svelte Template
If you’re looking for something simpler or specifically want to work with just the Svelte library without the additional features offered by SvelteKit, you can start with the basic Svelte template.
Review “Anytime” (especially “Obligation” tag, or open loops)
📆 Calendar
Review week’s events invites (Work)
Review week’s events invites (Home)
Review any birthdays. Make sure we add them as recurring items on Things
Physical Journal Planner
📓 Notes
Clear the inbox
Filesystem - Downloads Folder
Filesystem - Inbox Folder
Physical Mailbox
Any outstanding Drafts
How did I come about this process?
Tiago’s pillars of productivity can be broken into four categories: tasks, calendar, notes, and reading later. Of course, there’s the inevitable email inbox as well, which I’ve also included. And there’s this, the weekly review.
Prior to taking the course, half of my weekly review was tidying up, and the other half was reflection. One of the major changes that has helped me make the weekly review more accessible for me is to split those two things apart. My weekly note that I write on the website is part of my weekly reflection, and the tidying is the weekly review.
Pillars of Productivity give a ton of tactics to help tidy up for work week ahead. What I found enlightening was only to take the few things, at most two, that you can start this week. As it becomes intuitive, then continue refining the process. “Plan, Do, Check, Act”, as they say.
Annotation: Emails
📧 Emails: Work Email
I’ve made it a point to try to reduce the email load to very little. As a developer, most of my conversations are around Slack. Emails are for external chatter or sharing documents amongst a larger group. And even then, if it’s not a Google Doc or a Confluence Wiki, then I usually start one so that we can end the email chain. I know not everyone at my company likes this as there are non-technical people who are used to email transaction. It’s slowly changing, but it’s a process.
📧 Emails: Personal Email
I’ve made a point to unsubscribe to newsletters, promotions / advertising, and any other recurring email. I don’t care about weekly usage reports, social media updates, and any other periodic updates. When there’s follow-up actions involved with email, I go ahead and forward it to Things, which I’ll cover in the next section. Also, I only check my personal email at a dedicated time in the morning. Otherwise, I’ve found myself hitting refresh way too often.
When I have to reply to someone, and I have to put more thought into it, it also goes in Things.
The reason I’ve come to this conclusion is I used to use Superhuman. It was way too expensive for what it was worth for my workflow. What I took away was the following.
Use shortcuts
Get to archiving an email quickly
Unsubscribe from anything unnecessary
YMMV for the definition of “unnecessary”. I’ve found that I’ve been able to reduce my email load to a very manageable level.
Annotation: Tasks
✅ Tasks: Clear Inbox
My task manager of choice is Things. I love that it’s a one-time fee. I love that I have a special shortcut to create a new Todo. And I like how they integrated Areas and Projects to it. While I’m not strict to PARA (I have a modified system), the mental model makes sense. Especially for my work area that has many projects.
Also, I waver between my inbox and anytime. The inbox is a holding area for me to add a todo to a project and attach a date to it. If unattached, it could wind up in my “Anytime” box, which would get lost to the void. Having a weekly check-in for this helps immensely as I figure out what I have to do for the week.
📣 Shoutout to Ayush who introduced me to Things. Who also introduced me to Todoist, although I found Todoist much harder to not be overwhelmed by.
✅ Tasks: Review “Anytime” (especially “Obligation” tag, or open loops)
Cal Newport talked about an obligation list on his podcast, and it stuck with me. Tiago’s phrasing for this is an open loop. There’s no next action you can take as you’ve “delagated” this to someone else, but there might be some follow-up later (see David Allen’s GTD about how he delagates).
This could also be you promised to do something for someone else, but that time has not come yet. Like tell someone you can make it for their New Years bash in August. I’ll typically plan to put something, but not sure what that task will be just yet. There’s usually an element of time and duty. For a rule of thumb, I don’t rely on others to remember for me, so I put this in Things in a personal project that has no “when”.
Annotation: Calendar
📆 Calendar Review week’s events invites (Work)
I use Google Calendar as the default base calendar. I use Fantastical to create events easily, and Notion Calendar to indicate the time between meetings, and to pick up the zoom meeting link invites. Honestly, after Cron rebranded, I might drop it.
At the beginning of the day, I see if there are new meetings, or changed meetings, that I have to update my RSVP. During the weekly review, I use the existing meetings to plan when I’ll need focused time. I think a lot about Paul Graham’s Maker’s Schedule vs. Manager’s Schedule.
When you’re operating on the maker’s schedule, meetings are a disaster. A single meeting can blow a whole afternoon, by breaking it into two pieces each too small to do anything hard in. Plus you have to remember to go to the meeting.
Paul Graham
While Paul uses Office Hours to work in a manager’s schedule within a maker’s schedule, I opt for deep focus sessions that are unstructured. I have enough tasks through my task manager to indicate to me what to work on next, so I never worry about the content.
📆 Calendar Review week’s events invites (Home)
Whenever I plan a date weekend, or have obligations for others, I’ll schedule it in. I stopped putting recurring tasks on my calendar and shoved them over to my task manager.
📆 Calendar Review any birthdays. Make sure we add them as recurring items on Things
This one is simple. I exported all of the birthday dates from Facebook or other social media of choice and give them a text or a phone call. It’s something to remind them that I’m thinking of them and an easy lift to do.
Also, I’d rather have this in Things, so I’m doing a slow migration.
📆 Calendar Physical Journal Planner
I’ll have both calendars open and pen them in my physical planner. I use the physical planner as a working area to help me slot other things in. Paper and pen helps a lot better for me to think about the week ahead. See The Extended Mind.
Annotation: Notes
📓 Notes: Clear the inbox
I’m a prolific Obsidian user as my primary personal knowledge management (PKM). My default note folder is ”+”, previously called my inbox. Each note belongs somewhere, and maybe I’ll talk about my PKM more publicly. First, I have to hide all the private notes.
📓 Notes: Filesystem - Downloads Folder
My laptop’s downloads folder is the clutter area where anything can go in. Either they belong in by inbox, they get organized, or they go in the trash.
📓 Notes: Filesystem - Inbox Folder
The inbox folder is something worth saving and ready to file. I use my modified version of PARA to organize where things go.
📓 Notes: Physical Mailbox
Snail mail! This is a two-fold action. I rarely check my mailbox, so I go to the mailroom. Then I review quickly anything that has a follow-up action, otherwise it goes in the recycle bin.
📓 Notes: Any outstanding Drafts
I use Drafts on my phone and laptop to write down anything. Calculations, initial ideas, a working draft of a next blog post. Really, this is my scratchpad, and I’ll file them away or archive them. The syncing is the reason I keep coming back.
After Thoughts
I try to minimize this time as much as possible. Tidying up isn’t the work, so I do this to prep for my focus productive time.
I’m planning on making a short post updating what my weekly reviews are looking like, updated for 2024.
Every year or so, I’ll review my existing template and see what should be modified. It takes me a few times to get used to the format, many more months of thinking about what’s working and what’s not, and making slow incremental improvements. Look out for that soon.
Also, as mentioned last week, I spent some time updating my newsletter service. I migrated from TinyLetter to Buttondown, which you can read here.
It touts itself as a Search engine alternative w/ AI
Initial Impression: It’s got promise, but isn’t very fast.
After a week: I don’t think it replaces Google. It’s great as an alternative. Some things I’d rather still Google, and I’ll probably write-up something about it
A group of Israeli scientists wants to send a giant sail into space to block a portion of solar radiation. The shade in this artist’s rendering is enhanced to illustrate the concept.
As some of you may know, Tinyletter is out of operation. I’ve been using them since I started my blog back in November, 2014. My readership numbers have been low enough where it didn’t make sense to ever migrate off of it. The free tier limit was 500 emails.
With Tinyletter’s end meant I was in search of another service that has a free tier, or something with a reasonable price. I don’t like the idea of making people pay to read what I want to say, so I’ve chosen buttondown. Their free-tier is limited to 100 subscribers, so I’ve had to knock down the readership a bit. Also, I want to scale this back until my newsletter is back in an appropriate cadence. I’ve been thinking of keeping a monthly rhythm as my writing output isn’t as prolific as it used to. I’ll start with that for now and see if I can handle more than that.
With that, I’m going to send my first newsletter sometime in February, so make sure you are subscribed. Check out the form to on the newsletter page, or try below.
The YouTube algorithm said, it’s time to get into Chess, so that’s what I dived into this week. I was introduced to Anna Cramling, whose YouTube videos were really interesting to think about the moves as they were happening real-time.
I remember one of times I visited New York and seeing the Chess Hustlers in action. There’s something fascinating about trash talking while playing a game of chess, like in many other games like Poker or Hockey. There’s also this intellectual pursuit of watching openings, mid-game, and end-game material that’s just a wealth of knowledge, vs. studying tactics, which as a teenager appealed to me.
Anyway, I want to start playing again. What’s your favorite way to play chess, online or offline?
I created a gist
for it. The original script did not have much error handling. Something to expand
on in the future is to have that error handling within Obsidian, which I would
like to see.
Also, I used the suggester API
to give the user options on which returned item they care about using the Google
Books API.
And here’s my personal template using Obsidian properties.
I’m proud of the re-write I’ve made towards curations. The idea behind this was to combine the things that I’ve liked, consumed, gestated on, and share with you my thoughts about different things that matter to me.
For my books, I wanted the feeling you get at the bookstore where I write a short blurb about why you should pick up this book. I would spend the first few minutes reading the index cards nicely decorated about why the staff member chose a specific book. There was more potential for a chance encounter. When I read listicles online, there’s often a sense of sameness. It’s not as fun when websites all feel the same.
The same about films in a video store. I love the feeling you get, back when video stores were more popular, about staffpicks. Some small streaming services have this feeling, like FilmStruck, and more recently the Criterion Channel. When the Netflix algorithm is feeding you, or for that matter any algorithm, that hand-feel of someone’s journey into film has turned into “this is what thousands of people in your target demographic cohort also like”. And there’s something missing from that. I want to share what I like about a film, or dislike. And I also want to share why other people appear to have similar or dissonant feelings about it.
People shouldn’t feel boxed into groups of “books I like”, “movies I like”, and “music I like”. It makes everything feel dull, like these are the only categories that define our dating profile. And while I’m starting off with the books and music, I can think of other things I want to curate in the future. One thing people might not know about me is I own a 20+ year old business card collection. It reminds me of places I’ve traveled or people I’ve met. I also want to share a inspirational persons curation of people who I love and have made an impact.
Aside from everything else, I want my personal MySpace back. Back in the day, you would have a customized profile page where you make it play your favorite music, share your favorite lousy quotes, and give it your own personal flair. Even if that flair was like design vomit. It was your vomit. So with that, I’m having a little fun giving you multiple perspectives on what is essentially a listicle. But it’s my listicle. And I can call it something other than a listicle. Like an curated art exhibit. That sounds so much more sophisticated. You’re welcome.
If you missed the link above, check out curations!
Over the weekend, 23andMe sent out a notice of data breach
Based on our investigation, we believe a threat actor orchestrated a credential stuffing attack during the period from May 2023 through September 2023 to gain access to one or more 23andMe accounts that are connected to you through our optional DNA Relatives feature.
Yesterday was my 34th birthday. It was a wildly unexpected year, full of twists and turns that I could not have seen coming.
How did the annual theme go?
The thought process behind my annual theme, the Year of Intention, was to make time more intentional. In Four Thousand Weeks, Oliver Burkeman writes about the finite time we have. To balance out my active vs. passive time, in which you need both, I want to guard what little precious time I have. In a way, this is a scarcity mindset and one which I should remind myself of often.
Intentionality is planned focus. Meaning I focused my attention on specific areas of my life. After planning, there’s a phase of reflection, like reviewing the initial plan and how it went, doing goal setting and planning, and reviewing my energy management. In the past, I would like entropy to set in and stop planning altogether, drop my long-term goals, and let the energy demons enter. Demons may include procrastination, burnout, and being overwhelmed.
At the beginning of the year, I put a few things in motion.
Daily Reviews
Weekly Reviews
Monthly Reviews
Quarterly Goals
I thought having a lot of reviews would help me with goal setting, reviewing those goals, and avoiding crashing and burning.
So, the big question is, how did it go?
The short answer is not well. The longer answer is it went partially well. Daily reviews have been great. Weekly and monthly reviews crashed and burned. I did half of my quarterly goals. Let me dive deeper through a short detour on what happened this year.
Family Emergencies
This year will go down as one of the worst years when it comes to family. While I can’t go into too much detail in this area, I can tell you it was a terrible time for my parents. My aunt passed away last January and my father had a terrible accident. Both incidents left us in the hospital far longer than we ever expected.
Needless to say, both incidents left me extremely frazzled. As part of my theme, I wanted to leave my “Hyperactive Hive Mind”, but after half a year, I had it worse than ever. After being at the hospital for a full day, I would come home and crash by being on my phone. Quite the opposite of turning off for the day. And to put matters worse, I almost drove my partner insane by barely making enough time for our big move.
The Rest of the Year
While the family emergencies occupied my mind for a good portion of the year, many other things happened. Here’s a shortlist.
My work went through two reductions in forces (round of lay-offs). Luckily I was not impacted
We moved to San Jose
We checked out our first antiquarian fair
I got to catch up with old friends who I haven’t talked to in years
We checked out the Dandelion Chocolate Factory tour
We got to go to 2 musicals and an opera (see more in my logs)
Visited Christmas in the park for the tree lighting ceremony
Closing Thoughts
While 2023 will go down as a year to remember, I am hopeful for 2024. I’m going to get married! Also, I’ve taken a lot of lessons learned from a more intentional life and will be taking those with me in the next year. As I make those changes, I’ll reflect and write about them in the future.
Containers didn’t just lower the cost of shipping—they all but eliminated it. Transportation costs became negligible, no longer a barrier to worldwide distribution.
— Deb Chachra, How Infrastructure Works, Chapter 3: Living in Networks
I’ve been taking a slow burn reading Deb Chachra’s new book, “How Infrastructure Works”. It’s the book I wanted The 99% Invisible City to be. It’s a nice compliment to it, and dives deeper into the idea of how networks dominate our everyday lives in a (sometimes) hidden way.
At some point, expect this book to be in my book list.
Also, a quick update about the website. My library will be changing. I’m working on a “Curations” page that will replace it, as I want to extend it to be a gallery of found things. It’s like all of those tiny European museums that have trinkets and things, but in a more digital, meaningful way. And if you have no idea what those are, maybe I’ll write about it in the near future.
I’m absolutely smitten with the idea of escalating streaks. It’s something I’m keeping a note of for my “Year of Renewal”
I don’t know what my obsession is with micro-niche articles like THE CHAIRS OF DOCTOR WHO (1963 – 89). My ex-roommate did her final paper on the history of chairs, and it’s one of those hidden household features. Even more fascinating is what people in the past thought chairs in the future might look
Every time someone brings up the argument “X” job will be displaced by AI, I think about how AI has to be maintained. This article is a good place to start. It’s Humans All the Way Down - Jim Nielsen’s Blog
I’m calling my 2024 the “Year of Renewal”. I’m going to write up a blog post about this soon, as well as monthly challenges along this theme. At least, that’s the resolution.
I was listening to the latest Latent Space podcast with Steve Ruiz of tldraw. (You can watch the full video below).
What I was taken back by is the “Make Real” demo that included different approaches to using GPT4-Vision.
Of course, my first instinct was to play test it and see what I could make and where the limitations are.
As a part-time designer, I was curious to see a working demo of a wireframe I had in mind.
Demo
“Make Real” outputs in HTML, CSS, and JS (with tailwind), and I was able to cobble together this little demo of telling you the timezones based off of the selected input.
One thing to note is the component below is actually a Svelte component, which I created using ChatGPT to convert the HTML to Svelte.
And of course, I’ve made slight modifications so there are more timezones than the ones given to me.
System Timezone:
Selected Timezone:
Design aesthetic aside, this is a fully functional prototype that I could reuse and prettify.
With a little bit of coding knowledge, I can be off racing towards putting this in a production-ready app.
Of course, the way to make these modifications are easier if you have some implementation knowledge of what you’re doing.
Thoughts on Make Real
It’s not an career killer for front-end engineers. We are far from that.
Instead, these should be seen as tools to augment our work and allow us to spend more energy playing over mulling over small implementation details that might get changed later.
With each iteration, I was able to get “Make Real” to output different variations of the same idea, to really see what the realm of possibilities are.
There’s a balance though of giving annotations and adding or subtracting more to the drawings.
For example, when I asked it to give me 50 timezone selections from the most populated areas on the earth, it only gave me 10 items.
And even then, ChatGPT came up with TZs not in use.
In a different iteration, I wanted an explorable map.
When I asked it to give me a map of where this selected timezone was, it gave me a placeholder. Not so helpful.
The following is the video with Steve Ruiz, and I highly recommend watching it to see more.
Where do I think we can go from here
I haven’t tried state machine drawings yet, and I think that can help extend what we can do with drawings.
I also would love to explore what other people have done as helpful aids for the drawings to get GPT4-Vision to come up with something better.
I hope you all have a wonderful 2024! Thanks so much for reading my “Craft By Zen” blog, to be 10 years strong in this coming year. I’ve saved a few things to read this winter break. Here’s some good reads.
Also, my fiancée’s article got published! Go check it out!
I’ve taken holiday with my fianceé’s family house in Florida.
We’ve had a wonderful Christmas week, and taking this time to rest after a very active year.
I hope you all have a wonderful holiday season and a new year.
Season’s greetings! And for those who follow the Christmas tradition, a happy, Merry Christmas!
I hope you are all spending time with your loved ones, or thinking about them dearly. It’s the end of my very long and tumultuous year.
In my tough times, I wish I could see everyone again in some capacity. Life changes, our circumstances change, and friendships grow and drift apart. The paradox is that we are hyperconnected and missing out on each other in person. A train ride from San Jose to San Francisco is approximately 65 minutes. And yet it is hard for any of us over 30 to make a spontaneous plan to travel. And when distances span across states or countries, we find ourselves in a long text chain in one of seven apps on our phone.
In my current state of self-reflection and the beginnings of my annual review tradition, the word that has stuck with me this year has been “calm.” When things feel like they are at their worst, my borrowed mantra has been to “share your calm.”
Over the summer, one of the worst things happened. I got a call I feared: my dad was rushed to the emergency room. He fell from the roof while climbing down a ladder, leaving him with a bad concussion that led to a brain bleed. After surgery, being in the ICU, then hospital, then rehab hospital, then assisted living, he’s finally home after a long 4 months. For this period, I’ve taken a part-time caretaking role, and have spent more hours with him than any other time in the last decade. It’s been grueling watching him wax and wane on his road to recovery. Some days would be fantastic, while others felt like major setbacks.
One time when I was shuttling him, he mentioned he only wanted to remember the good memories, and none of the sad ones. It was like reliving the lowest moments of his life, like when his mom and brother died. I cried a little, and I’ve never heard my dad be so vulnerable before his accident.
As my caretaking responsibilities wind down, how do I redistribute that energy? I’m also asking myself, what do I have to accept? And what can I leave behind?
My dad’s injury reminds me our time and attention are precious, and we shouldn’t take those for granted. Recovery isn’t an end condition, but an endless journey. Have grace and patience.
If something I wrote resonated with you, or you just want to say hi, please reply. I miss you all, and I wish you a wonderful 2024. May our paths cross again soon.
Post-Thanksgiving week was “short” in the sense that I was getting back into the swing of things. It’s that holiday slump period where you don’t care for more to happen. For me, the period marks a sense of reflection. Time to go outside in the cold and take a hard look at what this year has been like.
Thanksgiving holiday was this past week. I’m thankful for making through this hectic year, for friends and family going through the best and the worst, and for a loving partner. We’re taking this time of year to relax and take it easy.
Scott Adams (Cartoonist who produces Dilbert) write in his blog about how persuasive he sees Donald Trump. I can’t find the exact post, but he mentions how Trump is playing 4D chess against all of his opponents who don’t know his next moves. Trump supporters use this to boost their candidate. Source
At some point, I want to do a short review of “Between Two Kingdoms”, which chronicles Suleika’s journey in healing from her Luekemia, and the parallels I had with my father’s ongoing recovery
2FA Directory - I didn’t know there was a directory for 2FA / MFA. I’m certainly going to review this
I use a version of a resonance calendar, but it’s more like what sparks. I put it in my notes, wait a day, and see if I’m still interested. Time is usually my best filter.
The idea of a Resonance Calendar seems to have come from the community surrounding the notetaking app Notion, but awhile back I adapted it for my own uses and I’ve found it really useful as a casual periodic practice. The idea is to keep track of and reflect on the various things that you read, watch and listen to. I used to go back over what I read and review the summaries I wrote about why I bothered, but I fell out of the habit as my pregnancy progressed.
Eleanor Konik
Still Tasty - a website to find out what’s spoiled and what’s still good in your fridge
The announcement came earlier this year. As someone who loved going to these three theaters, UA, Shattack Cinema, and California Cinema, in Berkeley throughout the ’90s and ’00s, this was heartbreaking.
I remember seeing Lord of the Rings: The Twin Towers at the UA after school, and it was magical. Something about not having these theaters for the next generation breaks my heart
I also distinctly going to see Spirited Away at Shattack Cinema, and remembering how Miyazaki movies instill magic into them.
I’ve put my dad’s 30 day notice for senior living in today. He’s ready to go home around Thanksgiving time. He’s ready to go him.
My dad’s health is generally okay. He’s having some skin problems at the moment from not putting on enough lotion. His hygiene is terrible, and we are wondering if he needs to shower every day. He also is not shaving. We had dim sum yesterday, and are ready for other caretakers to help take care of him.
His recovery is stagnant. We want him to interact with more of the people. I’m starting to create a recovery team for him so he has support
Back to your regular notes
I’m looking into a way to embed songs to Obsidian so I can link a song. I might use a YouTube embed in the meantime.
Here’s a note I wrote about my LYT showcase.
I recognize perfection is the enemy of good. And the way I’ve wanted to present my work is hardly how it looks when I’m in the middle of the idea. In my writing, first drafts hardly resemble the published draft. And even the published draft may be upcycled to other ideas. I’m very happy to see many other students embrace the mess
We are back in our regular rotation. LYT Workshop 12 wrapped last week, as I mentioned in the previous week, so expect this to be more regular.
I’m finally getting back to doing a quarterly review, a month later than I would’ve hoped.
NaNoWriMo is starting this Wednesday, and I’m planning to participate. I put my Project Page up for everyone to see.
At work, we’ve been chugging along working on next product requirements that’s hush hush here
As some people are aware with my father, we’ve followed up with PT this past week where he can start walking supervised without his cane, which is a win all around.
I’ve been returning to this idea about systems, and when I encounter new ones (tagged: experimental), I try to incorporate them in my own workflows and see if they mesh. Most do (I’m looking at you, GTD)
Missed last two weeks, as I’m going through the LYT workshop. I decided to cease publishing anything until I complete it.
Now that it’s the last week, I’m turning my attention back from my PKM to this website again. My goal is to publish once a week. 🤞🏼
Therapy Remark
Share Your Calm
This really resonated with me when talking with my therapist. In times of others’ stress, it’s easy to get caught up in the moment and take that on yourself. Instead, take a moment and show your calmness, rather than echoing the stress.
Freewriting sessions
When I kept up my journaling experiences for a decade, some days, I’d let it all out on paper. Take my thoughts and feelings and let them bleed on paper. Sometimes I’d come up with barely anything. Other times, I’d pour my heart on the page.
I’m going to return to this practice because it’s a form of practicing my calm (tying the previous point back in). I’ll take a short amount of time, 3 minutes to be exact, and do the work in my journal.
Filed under “Challenge what you believe”, this was kind of an eye opener. Sometimes, I want to say I’ve read the evidence and find it very compelling. But I didn’t. I was in a staff development meeting when I was teaching at a Prep school, and we had to work in groups telling each other what learning styles we were.
I’m back from the very last Strangeloop and from visiting my cousin for her baby shower in Las Vegas. I forgot how it feels to do non-stop traveling back-to-back. Reminds me of the time I traveled across the US, then hopped on a plane to South Korea.
I took this idea of “Weekly Notes” from Jamie Tanna who I met at Strangeloop, and I thought this would be a wonderful recurring segment for the blog. Even if I have low readership, this is a nice capsule to look at for my monthly, quarterly, and annual reviews. 😁
Derek Sivers updated his post on Tech Independence, where it’s a single command now
DALL·E 3 - [[OpenAI]] updated DALLE where prompt engineering is needed much less. Positioning is a lot better, with context
There’s a new map style on OpenStreetMap.org! The Tracestrack Topo map from @tracestrack.
I’ve decided to share things that I’ve found throughout the week, curating for you. You will find things that have caught my attention, notes that I think are worth exploring, and thoughts that have been perculating.
Now the list is there for us to add to, revise, and to refer to! He feels more supported and capable in being supportive and actually helping and I feel more supported and, less depressed!
@sharon.a.life
Now the list is there for us to add to, revise, and to refer to! He feels more supported and capable in being supportive and actually helping and I feel more supported and, less depressed!
♬ original sound - Sharon.a.life
Get used to the bear behind you.
— Werner Herzog’s 24th and final maxim
I heard this quote on a podcast in respect to creating. While there are things you can’t control, it’s your attitude to it that matters the most.
Also, Justin Welsh has written enough where his “new” content is really an update to his old content. Hence, having a 730-day content library. I would love to aspire on my ideas like this, and refine, refine, refine.
My dad fell from the roof. It was 10pm, Friday night, July 7th, 2023. It’s the call you never want to receive. I was getting ready for the dog’s last walk, and then go to bed. Instead, I rushed over to Highland Hospital in Oakland.
Initially, it all seemed the head injury he sustained was minor. He had a concussion and some bruising, which did not appear to be a big deal. Matters got out of hand on the second day when the nurse treated the family as if he knew better than the doctors. The nurse forced my dad a standing position, even as he complained of naseua and dizziness. There was a lot of confusion, and the nurse thought he knew better than to ask the doctor if my dad needed another CT scan ordered.
The next day, I got a call from the night nurse that the staff rushed my dad into the operating room. A surgeon performed a craniotomy on my dad. Within 24 hours, they stabilized his intercranial pressure and removed excess blood that pushed his brain to one side. It was a life or death situation, and we were all praying for the best outcome. He was intubated post-operation until the next day. Mentally, he appeared barely existing for the next few days. After being in the ICU that week, he was moved to a step-down unit, a section of the hospital that is less intense than the ICU, where he was under routine supervision for the next week.
Reflecting on the situation, I took a few things away that many care-givers should know.
Don’t take the nurse’s or doctor’s word. If someone you love is in critical care, you are the first observer, especially if you are there 24/7. Having family members help in shifts are really important, as you can cover as much time as possible.
Seek out the patient advocate. If things are not going well, like the nurse has become combative, every hospital has a patient advocate. It may take time to dig up their information, but having someone who truly cares for patient safety can be the difference between life and death.
Don’t be afraid to ask questions. Although I might be an outlier in the amount of medical knowledge I have, I still ask questions, even qualifying ones. It’s important to know which medications are administered and why. It’s important to know when the nurse shift change is. It’s important to know when your loved one will be discharged. Much of what I’ve learned in the last month has helped me navigate what shouldn’t be such a complex healthcare system.
When writing this, I assume the following.
The critical care facility is in the U.S. (California)
Your loved one is in a life or death situation
You have others helping you (makes it a lot easier)
I hope I’ll never have to come back to this note, but in the worst case scenario, I would have loved to read this advice.
In the late 2000s, Google Reader was my jam. The feeds were just beginning to
populate, and I remember enjoying my social feed from MySpace and early Facebook.
What I didn’t realize was how much I would miss the RSS feed aggregator once it
was killed.
But why was Google Reader killed? The Verge wrote an excellent article going over the inception and ultimate demise of the website. It reminds me of the website, KilledByGoogle which chronicles over 200 products Google killed since its inception.
I was one of those die-hard Google Reader users. Once I caught wind of it, I immediately exported my data. I tried alternatives like Feedly and The Old Reader, but it didn’t feel the same.
There were serious limitations, like limited subscriptions, unless I paid for the premium versions. And that leads me to a much more serious problem that I was facing: over-consumption.
The Feeds Take Over
I think I’ve been faced with this information over-consumption more times than I
can count. If Google Reader started my addiction to short-lived information, then
social media certainly made things much worse. My mind was craving the constant
attention of an infinite scroll — a feed that will never stop. With Google Reader,
at least I could control the RSS feeds that were coming in. I remember one time,
I wanted to be informed by the world news events so I subscribed to BBC,
but it backfired quickly to give me a deluge of distractable information. Facebook
and Twitter feeds were no better. They started innocently but quickly turned
into what an algorithm wants me to read. And that loss of control quickly turned me
off.
In more recent years, I thought I could substitute this with email newsletters.
What I quickly learned was email is no substitute for a personal feed. I was overwhelmed with 50, then 100, then 1000 unread messages. There were newsletter
articles I was extremely interested in reading combined with many others I had no
interest in. On top of that, when I needed to reply to an email, I’d be
distracted by something I needed to read.
I’ve heard Cal Newport call this the “Hyperactive Hive Mind” in his book A World Without Email.
What I’ve come to interpret this as is a constant need to be distracted without an
off switch. Every single social media with a feed has given me this same problem.
I remember the top three subreddits I would mindlessly scroll, the YouTube feed
with an endless “Watch Later” playlist, and the email feed with newsletters left
unread. What it always ended with was going cold turkey. Uninstall Reddit. Place
time limits on YouTube. Stop reviewing emails for weeks at a time. It wasn’t a permanent solution.
Confessions of an Information Hoarder
Another thing Google Reader started me off with is information hoarding. Like copying a whole article I want to read to make notes and a summary about it later, but never returning to it. My Evernote became cluttered with
many unrealized things in life I wanted to experience, but can’t do because there’s
limited time. I’m reminded of tsundoku, a Japanese word that means “to pile up”.
I have a pile of books that are left unread for the moment I can pick one up and
start reading. For the pile of articles, the stack is so high, it’s a chore to go
through and just find the articles I want to read. More time is spent
sorting through the ones I know I should read.
Prioritization has never been a strong suit. I tend to spread out my efforts across
multiple projects rather than focus on one. With reading, I’m the same way. I
constantly have 2 or 3 books I’m reading concurrently. With articles, forget them.
I have found when I rely solely on a feed to make decisions for me, I waste the
most time on it.
The Rise of the “Slow Feed”
I talked at length about these problems, and minor band-aids on how I’ve fixed it.
At the root of it, the problem is my behavior interacting with the feed. Unless the feed is short and filtered down, I’ll spend more time in it than what I think is normal (but hey, what is normal anyway?). So I propose the “Slow Feed”.
While I can’t stop myself from browsing feeds, there is a limit on how much
I can save for later. The “Slow Feed” has a hard limit of 15 or fewer items, taking
a lesson from the quick line at the grocery store. If I can’t through this feed,
I can’t add more items. It means I must be very picky and choosy with what I consume.
I’m not didactic about the other feed though. To make it to the “Slow Feed”, it
must be an article or video I want to “save it later”, go into my Readwise Reader feed, then go into my shortlist, which serves as my
“Slow Feed”. I get the best of both worlds. I limit the time spent in the mindless
scrolling portion (the endless feeds) and make time to read the longer articles.
It’s like curing myself of FOMO, without really curing it.
Got any ideas on how to improve this? Email me and let me know!
Errata
I read The Information Diet by Clay Johnson years ago
and may be time to scan it over and see if I can find other ways to improve this.
The book that prompted me to read more consciously is Chris Bailey’s book,
How to Calm Your Mind, which has a section about
anxiety in the age of information overload. As part of my “Year of Intentions”,
this is one of the things I’m working on.
The 7 GUIs is a benchmark for comparing different GUI frameworks, proposed by Eugen Kiss. See his explanation below.
There are countless GUI toolkits in different languages and with diverse approaches to GUI development.
Yet, diligent comparisons between them are rare.
Whereas in a traditional benchmark competing implementations are compared in terms of their resource consumption,
here implementations are compared in terms of their notation.
To that end, 7GUIs defines seven tasks that represent typical challenges in GUI programming.
In addition, 7GUIs provides a recommended set of evaluation dimensions.
— Eugen Kiss
I’m going to walkthrough each GUI using Svelte, and annotate the code.
Counter
The task is to build a frame containing a label or read-only textfield T and a button B.
Initially, the value in T is “0” and each click of B increases the value in T by one.
<script> // Initialize the counter with "0" (as it says in the spec) let count = 0;</script><!-- Display the count, as a number input --><input type="number" bind:value={count}/><!-- Add a button that will increment the counter by 1 with each click. --><button on:click={() => (count += 1)}>count</button>
Temperature
The task is to build a frame containing two textfields TC and
TF representing the temperature in Celsius and Fahrenheit,
respectively. Initially, both TC and TF are empty. When
the user enters a numerical value into TC the corresponding value
in TF is automatically updated and vice versa. When the user enters
a non-numerical string into TC the value in TF is not
updated and vice versa. The formula for converting a temperature C in Celsius
into a temperature F in Fahrenheit is C = (F - 32) * (5/9) and the dual
direction is F = C * (9/5) + 32.
<script lang="ts"> // Initialize the values of celsius and fahrenheit let c = 20; let f = 68; // Given the value from Celsius, update Fahrenheit function setBothFromC(value: number): void { // The + is to convert the string to a number c = +value; // Use the formula from the spec to update fahrenheit f = +(32 + (9 / 5) * c).toFixed(1); } // Given the value from Fahrenheit, update Celsius function setBothFromF(value: number): void { f = +value; // Use the formula from the spec to update celsius c = +((5 / 9) * (f - 32)).toFixed(1); }</script><!--Add two different inputs. Since the inputs are two-way bound by the values,`c` and `f`, we can add an event listener to run the function to convert theother value.--><input value={c} on:input={(e) => setBothFromC(e.target.value)} type="number"/>°C =<input value={f} on:input={(e) => setBothFromF(e.target.value)} type="number"/>°F
Flight Booker
The task is to build a frame containing a form with three textfields
The task is to build a frame containing a combobox C with the two options
“one-way flight” and “return flight”, two textfields T1 and
T2 representing the start and return date, respectively, and a
button B for submitting the selected flight. T2 is enabled iff C’s
value is “return flight”. When C has the value “return flight” and
T2’s date is strictly before T1’s then B is disabled.
When a non-disabled textfield T has an ill-formatted date then T is colored
red and B is disabled. When clicking B a message is displayed informing the
user of his selection (e.g. “You have booked a one-way flight on
04.04.2014.”). Initially, C has the value “one-way flight” and T1
as well as T2 have the same (arbitrary) date (it is implied that
T2 is disabled).
<script> const DAY_IN_MS = 86400000 const tomorrow = new Date(Date.now() + DAY_IN_MS); // Create an array of year, month, day, in this format: YYYY-MM-DD let start = [ tomorrow.getFullYear(), pad(tomorrow.getMonth() + 1, 2), pad(tomorrow.getDate(), 2), ].join("-"); // our reactive variables let end = start; let isReturn = false; // Running statements reactively, updating the variables when they are changed $: startDate = convertToDate(start); $: endDate = convertToDate(end); // Click handler for the button function bookFlight() { // Determine type of return const type = isReturn ? "return" : "one-way"; let message = `You have booked a ${type} flight, leaving ${startDate.toDateString()}`; if (type === "return") { message += ` and returning ${endDate.toDateString()}`; } alert(message); } // Convert a string in the format YYYY-MM-DD to a Date object function convertToDate(str) { const split = str.split("-"); return new Date(+split[0], +split[1] - 1, +split[2]); } // Pad a number with leading zeros function pad(x, len) { x = String(x); while (x.length < len) x = `0${x}`; return x; }</script><!-- Create your select input for one-way or return flight option --><select bind:value={isReturn}> <option value={false}>one-way flight</option> <option value={true}>return flight</option></select><!-- Bind the inputs --><input type="date" bind:value={start} /><input type="date" bind:value={end} disabled={!isReturn} /><!-- Attempt to book flight --><button on:click={bookFlight} disabled={isReturn && startDate >= endDate} >book</button>
Timer
The task is to build a frame containing a gauge G for the elapsed time e, a
label which shows the elapsed time as a numerical value, a slider S by which
the duration d of the timer can be adjusted while the timer is running and a
reset button R. Adjusting S must immediately reflect on d and not only when S
is released. It follows that while moving S the filled amount of G will
(usually) change immediately. When e ≥ d is true then the timer stops (and G
will be full). If, thereafter, d is increased such that d > e will be true
then the timer restarts to tick until e ≥ d is true again. Clicking R will
reset e to zero.
<script> // It turns out, you can't run this in Astro without saying this component is client only import { onDestroy } from "svelte"; // Start elapsed at 0 milliseconds let elapsed = 0; // Set the range input to be 5 seconds / 5000 milliseconds let duration = 5000; let last_time = window.performance.now(); let frame; // IIFE for animation loop (function update() { // pass in the function for the animation frame (infinite looping) frame = requestAnimationFrame(update); // performance.now() is like Date.now(), but more accurate to tenths of a milliseconds const time = window.performance.now(); // Take the minimum of the time elapsed and add it to the new elapsed time elapsed += Math.min(time - last_time, duration - elapsed); last_time = time; })(); // When the component is destroyed, cancel the animation frame onDestroy(() => { cancelAnimationFrame(frame); });</script><!-- Create the label and use the progress tag to show the time elapsed vs duration --><label> elapsed time: <progress value={elapsed / duration} /></label><div>{(elapsed / 1000).toFixed(1)}s</div><label> duration: <!-- Bind the input to the duration. Max 20 seconds --> <input type="range" bind:value={duration} min="1" max="20000" /></label><!-- Allow the user to reset the timer --><button on:click={() => (elapsed = 0)}>reset</button>
CRUD
The task is to build a frame containing the following elements: a textfield
Tprefix, a pair of textfields Tname and
Tsurname, a listbox L, buttons BC, BU and
BD and the three labels as seen in the screenshot. L presents a
view of the data in the database that consists of a list of names. At most one
entry can be selected in L at a time. By entering a string into
Tprefix the user can filter the names whose surname start with the
entered prefix—this should happen immediately without having to submit the
prefix with enter. Clicking BC will append the resulting name from
concatenating the strings in Tname and Tsurname to L.
BU and BD are enabled if an entry in L is selected. In
contrast to BC, BU will not append the resulting name
but instead replace the selected entry with the new name. BD will
remove the selected entry. The layout is to be done like suggested in the
screenshot. In particular, L must occupy all the remaining space.
<script> // Have some people to start with let people = [ { first: "Hans", last: "Emil" }, { first: "Max", last: "Mustermann" }, { first: "Roman", last: "Tisch" }, ]; // Initialize the bound variables let prefix = ""; let first = ""; let last = ""; // Initialize the selected item index let i = 0; // Reactive statements when the changes $: filteredPeople = prefix ? people.filter((person) => { const name = `${person.last}, ${person.first}`; // Filter based off first or last name return name.toLowerCase().startsWith(prefix.toLowerCase()); }) : people; // Reactively change the selected when filtered people $: selected = filteredPeople[i]; // Reset all inputs when new selection made $: reset_inputs(selected); // Create a new person function create() { people = people.concat({ first, last }); i = people.length - 1; first = last = ""; } // Update the selected person function update() { selected.first = first; selected.last = last; people = people; } // Remove the selected person function remove() { // Remove selected person from the source array (people), not the filtered array const index = people.indexOf(selected); people = [...people.slice(0, index), ...people.slice(index + 1)]; first = last = ""; i = Math.min(i, filteredPeople.length - 2); } // Reset the input for first and last names function reset_inputs(person) { first = person ? person.first : ""; last = person ? person.last : ""; }</script><input placeholder="filter prefix" bind:value={prefix}/><select bind:value={i} size={5}> <!-- Loop through the filtered people --> {#each filteredPeople as person, i} <option value={i}>{person.last}, {person.first}</option> {/each}</select><!-- Create inputs for first and last names --><label ><input bind:value={first} placeholder="first" /></label><label ><input bind:value={last} placeholder="last" /></label><!-- CRUD operators --><div class="buttons"> <button on:click={create} disabled={!first || !last}>create</button> <button on:click={update} disabled={!first || !last || !selected} >update</button > <button on:click={remove} disabled={!selected}>delete</button></div>
Circle Drawer
The task is to build a frame containing an undo and redo button as well as a
canvas area underneath. Left-clicking inside an empty area inside the canvas
will create an unfilled circle with a fixed diameter whose center is the
left-clicked point. The circle nearest to the mouse pointer such that the
distance from its center to the pointer is less than its radius, if it exists,
is filled with the color gray. The gray circle is the selected circle C.
Right-clicking C will make a popup menu appear with one entry “Adjust
diameter…”. Clicking on this entry will open another frame with a slider
inside that adjusts the diameter of C. Changes are applied immediately.
Closing this frame will mark the last diameter as significant for the
undo/redo history. Clicking undo will undo the last significant change (i.e.
circle creation or diameter adjustment). Clicking redo will reapply the last
undoed change unless new changes were made by the user in the meantime.
<script> // Initialize the bound variables let i = 0; let undoStack = [[]]; let circles = []; let selected; let adjusting = false; let adjusted = false; // On handling click, create circle with default radius 50 px function handleClick(event) { if (adjusting) { adjusting = false; // if circle was adjusted, // push to the stack if (adjusted) push(); return; } const circle = { cx: event.clientX, cy: event.clientY, r: 50, }; // Add circles to list of circles. The selected circle is the current circle circles = circles.concat(circle); selected = circle; push(); } function adjust(event) { selected.r = +event.target.value; circles = circles; adjusted = true; } function select(circle, event) { if (!adjusting) { event.stopPropagation(); selected = circle; } } // Use a stack for keeping track of the circles function push() { const newUndoStack = undoStack.slice(0, ++i); newUndoStack.push(clone(circles)); undoStack = newUndoStack; } function travel(d) { circles = clone(undoStack[(i += d)]); adjusting = false; } function clone(circles) { return circles.map(({ cx, cy, r }) => ({ cx, cy, r })); }</script><!-- Put in the buttons for controls --><div class="controls"> <button on:click={() => travel(-1)} disabled={i === 0}>undo</button> <button on:click={() => travel(+1)} disabled={i === undoStack.length - 1} >redo</button ></div><!-- Draw with an SVG. Bind the click handler --><!-- svelte-ignore a11y-click-events-have-key-events a11y-no-static-element-interactions --><svg on:click={handleClick}> <!-- Draw all of the circles --> {#each circles as circle} <!-- svelte-ignore a11y-click-events-have-key-events --> <circle cx={circle.cx} cy={circle.cy} r={circle.r} on:click={(event) => select(circle, event)} on:contextmenu|stopPropagation|preventDefault={() => { // When right-clicking, open the adjuster adjusting = !adjusting; if (adjusting) selected = circle; }} fill={circle === selected ? "#ccc" : "white"} /> {/each}</svg><!-- Show the adjuster if adjusting a circle's size -->{#if adjusting} <div class="adjuster"> <p>adjust diameter of circle at {selected.cx}, {selected.cy}</p> <input type="range" value={selected.r} on:input={adjust} /> </div>{/if}
Cells
The task is to create a simple but usable spreadsheet application. The
spreadsheet should be scrollable. The rows should be numbered from 0 to 99 and
the columns from A to Z. Double-clicking a cell C lets the user change C’s
formula. After having finished editing the formula is parsed and evaluated and
its updated value is shown in C. In addition, all cells which depend on C must
be reevaluated. This process repeats until there are no more changes in the
values of any cell (change propagation). Note that one should not just
recompute the value of every cell but only of those cells that depend on
another cell’s changed value. If there is an already provided spreadsheet
widget it should not be used. Instead, another similar widget (like JTable in
Swing) should be customized to become a reusable spreadsheet widget.
This one isn’t in the Svelte documentation, so I found a different
implementation that went through it perfectly. Link
Cells is split up into two Svelte components: Cell and Cells.
<!-- Cell.svelte --><script> // Initialized props export let j; export let i; export let focused; export let data; export let p; export let handleFocus; export let handleBlur; export let handleKeydown; export let handleInput; // Keep track of the current key let key = j + i; // Keep track if a cell is focused let hasFocus = false; $: if (focused === key && !hasFocus) { hasFocus = true; } else if (focused !== key && hasFocus) { hasFocus = false; }</script><!-- When focused, change the cell into an input --><!-- Otherwise parse the formula -->{#if hasFocus} <input id={"input-" + key} value={$data[key] || ""} autofocus on:focus={() => handleFocus(key)} on:blur={() => handleBlur(key)} on:keydown={(e) => handleKeydown(e, j, i)} on:input={(e) => handleInput(e, key)} />{:else} <div>{p.parse($data[key]) || ""}</div>{/if}
<!-- Cells.svelte --><script> import Cell from "./Cell.svelte"; import { data } from "./store.js"; import { sampleData } from "./sampleData.js"; import { Parser } from "./parse.js"; // Initialize with the sample data set data.set(sampleData); // Create 26 columns w/ the letters of the alphabet const LETTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; // Max 100 x 100 cells export let shape = [100, 100]; const rows = range(shape[1]); const columns = letterRange(shape[0]); const p = new Parser(data, columns, rows); let focused; let tBody; // Create range array function range(n) { return [...Array(n).keys()]; } // Create letter range function letterRange(n) { return range(n).map(getNumberAsLetters); } // Loop through letters function getBase26(n) { let result = []; while (n > 25) { let remainder = n % 26; result.push(remainder); n = Math.floor(n / 26) - 1; } result.push(n); return result.reverse(); } // Get the letter range and join them function getNumberAsLetters(n) { let arr = getBase26(n); return arr.map((num) => LETTERS[num]).join(""); } function handleFocus(key) { if (focused !== key) { $data[key] = $data[key] || ""; focused = key; setTimeout(() => { let target = tBody.querySelector("#input-" + key); if (target) { target.focus(); target.setSelectionRange(0, 9999); } }, 10); } } function handleBlur(key) { if (focused === key) focused = undefined; } function handleInput(e, key) { $data[key] = e.target.value; } function handleKeydown(e, column, row) { // Navigate across the spreadsheet with arrow keys (and alt/option key) let selector; if (e.key === "ArrowUp") { let newRow = findAdjacent(rows, row, "before"); selector = newRow !== null ? column + newRow : null; } if (e.key === "ArrowDown" || e.key === "Enter") { let newRow = findAdjacent(rows, row, "after"); selector = newRow !== null ? column + newRow : null; } if (e.key === "ArrowLeft" && e.altKey) { let newColumn = findAdjacent(columns, column, "before"); selector = newColumn !== null ? newColumn + row : null; } if (e.key === "ArrowRight" && e.altKey) { let newColumn = findAdjacent(columns, column, "after"); selector = newColumn !== null ? newColumn + row : null; } if (selector) { e.preventDefault(); handleFocus(selector); } } function findAdjacent(arr, value, direction) { let index = arr.indexOf(value); if (index === -1) return null; if (direction === "before") return arr[index - 1] === undefined ? null : arr[index - 1]; if (direction === "after") return arr[index + 1] || null; return null; } function clear() { data.set({}); }</script><div class="wrapper"> <table> <thead> <tr> <td class="row-key" /> {#each columns as column} <td class="column-key">{column}</td> {/each} </tr> </thead> <tbody bind:this={tBody}> {#each rows as i} <tr id={"row-" + i}> <td class="row-key">{i}</td> {#each columns as j} <td id={j + i} on:click={() => handleFocus(j + i)}> <Cell {j} {i} {focused} {data} {p} {handleFocus} {handleBlur} {handleKeydown} {handleInput} /> </td> {/each} </tr> {/each} </tbody> </table></div><button on:click={clear}>Clear</button>
There are two utility functions to help out the operations: parse and store
(the latter being the Svelte store to save in local state).
// parse.jsexport class Parser { constructor(store, columns, rows) { this.cells = {} this.store = store this.columns = columns this.rows = rows this.operations = { sum: (a, b) => a + b, sub: (a, b) => a - b, mul: (a, b) => a * b, div: (a, b) => a / b, mod: (a, b) => a % b, exp: (a, b) => a ** b } // subscribe to store this.store.subscribe(value => { this.cells = value }) } cartesianProduct(letters, numbers) { var result = [] letters.forEach(letter => { numbers.forEach(number => { result.push(letter + number) }) }) return result } findArrRange(arr, start, end) { let startI = arr.indexOf(start) let endI = arr.indexOf(end) if (startI == -1 || endI == -1 || startI > endI) return [] return arr.slice(startI, endI + 1) } getRange(rangeStart, rangeEnd) { rangeStart = this.splitOperand(rangeStart) rangeEnd = this.splitOperand(rangeEnd) let letters = this.findArrRange(this.columns, rangeStart[0], rangeEnd[0]) let numbers = this.findArrRange(this.rows, rangeStart[1], rangeEnd[1]) return this.cartesianProduct(letters, numbers) } splitOperand(operand) { return [operand.match(/[a-zA-Z]+/)[0], Number(operand.match(/\d+/)[0])] } rangeOperation(op, rangeStart, rangeEnd) { if (!(this.isWellFormed(rangeStart) && this.isWellFormed(rangeEnd))) return this.originalString let range = this.getRange(rangeStart, rangeEnd) return range .map(address => Number(this.parse(this.cells[address]))) .reduce(this.operations[op]) } singleOperation(op, operand1, operand2) { let first = this.parseOperand(operand1) let second = this.parseOperand(operand2) if (first === null || second === null) return this.originalString return this.operations[op](first, second).toString() } isWellFormed(operand) { return /[a-zA-Z]+\d+/.test(operand) } parseOperand(operand) { if (!isNaN(Number(operand))) return Number(operand) if (operand in this.cells) return Number(this.parse(this.cells[operand])) if (this.isWellFormed(operand)) return 0 return null } parseOperation(op, formula) { if (!(formula.startsWith('(') && formula.endsWith(')'))) return this.originalString formula = formula.slice(1, formula.length - 1) let operationType let formulaArr if (formula.includes(',')) { operationType = 'single' formulaArr = formula.split(',') } else if (formula.includes(':')) { operationType = 'range' formulaArr = formula.split(':') } if (formulaArr.length !== 2) return this.originalString if (operationType === 'single') return this.singleOperation(op, formulaArr[0], formulaArr[1]) if (operationType === 'range') return this.rangeOperation(op, formulaArr[0], formulaArr[1]) return this.originalString } parse(str) { this.originalString = str if (typeof str !== 'string') return '' if (!str.startsWith('=')) return str let formula = str.slice(1) if (formula.slice(0, 3).toLowerCase() in this.operations) { return this.parseOperation( formula.slice(0, 3).toLowerCase(), formula.slice(3).toUpperCase() ) } else { return this.cells[formula] || str } }}
// store.jsimport { writable } from "svelte/store";export const data = writable({});
The last file is to load prefilled data, but we don’t need to go over that.
// An example of the sampleData fileexport let sampleData = { A0: "Data", A1: "20", A2: "15"};
SolidJS is a Javascript framework for building fast, declarative UIs on the web. It shares many ideas with React, but does not use the virtual DOM to deliver a more performant and pragmatic developer experience.
In the playground, you can view the compiled output.
Also, you can change the compile mode, between “Client side rendering”, “Server side rendering”, and “Client side rendering with hydration”
Any code that you write in the playground can be exported to a coding sandbox, like Codesandbox. So helpful!
Philosophy - Think Solid
Declarative Data
Vanishing Components
Solid updates are completely independent of the components. Component functions are called once and then cease to exist.
Read/Write segregation
We don’t need true immutability to enforce unidirectional flow, just the ability to make the conscious decision which consumers may write and which may not.
Simple is better than easy
Compilation
Solid’s JSX compiler doesn’t just compile JSX to JavaScript; it also extracts reactive values (which we’ll get to later in the tutorial) and makes things more efficient along the way.
This is more involved than React’s JSX compiler, but much less involved than something like Svelte’s compiler. Solid’s compiler doesn’t touch your JavaScript, only your JSX.
Destructuring props is usually a bad idea in Solid. Under the hood, Solid uses proxies to hook into props objects to know when a prop is accessed. When we destructure our props object in the function signature, we immediately access the object’s properties and lose reactivity.
So in general, avoid the following:
function Bookshelf({ name }) { return ( <div> <h1>{name}'s Bookshelf</h1> <Books /> <AddBook /> </div> );}
And replace with props instead.
Dependency Arrays
In React, you’d declare the dependencies explicitly using the dependency array. If you didn’t, the effect would rerun whenever any state in the component changes. In Solid, dependencies are tracked automatically, and you don’t have to worry about extra reruns.
Looping with array.map
If we used array.map in Solid, every element inside the book would have to rerender whenever the books signal changes. The For component checks the array when it changes, and only updates the necessary element. It’s the same kind of checking that React’s VDOM rendering system does for us when we use .map.
Conditional if statements on re-rendering
In the Building UI with Components section of this tutorial, we noted that component functions run only once in Solid. This means the JSX returned from that initial function return is the only JSX that will ever be returned from the function.
In Solid, if we want to conditionally display JSX in a component, we need that condition to reside within the returned JSX. While this takes some adjustment when coming from React, we have found that the fine-grained control afforded by Solid’s reactive system is worth the trade-off.
Reactivity and proxy objects
In Solid, props and stores are proxy objects that rely on property access for tracking and reactive updates. Watch out for destructuring or early property access, which can cause these properties to lose reactivity or trigger at the wrong time.
onChange vs. onInput
In React, onChange fires whenever an input field is modified, but this isn’t how onChangeworks natively. In Solid, use onInput to subscribe to each value change.
No VDOM or VDOM APIs
Finally, there is no VDOM so imperative VDOM APIs like React.Children and React.cloneElement have no equivalent in Solid. Instead of creating or modifying DOM elements directly, express your intentions declaratively.
Solid Primitives
Signals - The basic way to manage state in the application
Similar to useState in React, but as a reactive value
Derived state - you can track a computed state from a signal, which is also reactive
You can pass the signal as a prop like this: <BookList books={books()} />. It’s not a typo to use the function as it’s passing an accessor, which is important for reactivity.
Effects - ability to react to signal changes
A driving philosophy of Solid is that, by treating everything as a signal or an effect, we can better reason about our application.
Looping
Solid has a component called <For /> with an each prop. You can pass in a signal that will make this reactive.
As you can see, onInput is the event handler that takes in the event. In this case, we are setting the new book for each input (the title and author).
The onClick handler for the button uses the addBook function where it can prevent the form from submitting, set the books using a new array, then resetting the new book. It should be noted that setBooks is using a callback function where you access the current state. Also, it should be noted not to mutate state by creating that new array (much like in Redux practice).
The primitive for any external data source is createResource. The function returns a deconstructed array with the data. It takes two arguments: the signal and the data fetching function.
Putting it all together, query is the signal. searchBooks is the data fetching function. Once the data is returned, we can loop over it, and for each item, we can set the books if selected.
The following is a code example introducing how Reactivity or Reactive Programming works.
import { createSignal, createEffect } from "solid-js";const [count, setCount] = createSignal(2);const [multipler, setMultiplier] = createSignal(2);const product = () => count() * multipler();// Change the count every secondsetInterval(() => { setCount(count() + 1);}, 1000);// Change the multiplier every 2.5 secondssetInterval(() => { setCount(multipler() + 1);}, 2500);// Effect automatically detects when a signal has changed// So you don't have to add a dependency array.// This is defined as "reactivity"createEffect(() => { console.log(`${count()} * ${multiplier()} = ${product()}`);});
createSignal works by creating a data structure that can read and write. To each of these functions, subscribers are added and updated
CreateEffect works by executing on a context queue (JS array). It takes its queue, executes it, then pops it (at least in pseudocode)
SolidJS uses “granular updates” so only the variables that change only update the DOM, and not entire components.
In this example, we extracted Multipler into its own component, added props, like React, and called it multiple times in App. As you will also notice, signals do not have to be in the function scope! This is counter to what you do in React. Of course, if you don’t want to share the signal across other components, you can keep it in the functional lexical scope.
I started this journey into Typescript by taking a ton of notes with Github Copilot X, “Typescript in 50 Lessons”, and the official documentation. I was able to tailor my experience in understanding how to create types through this method. Without further ado, here’s some notes that I generated (and modified).
What is Typescript?
TypeScript is a superset of JavaScript that adds optional static typing and other features to the language. It is designed to make it easier to write and maintain large-scale JavaScript applications. TypeScript code is compiled into JavaScript code that can run in any browser or JavaScript runtime.
TypeScript provides features such as classes, interfaces, enums, and modules that are not available in standard JavaScript. It also includes support for modern JavaScript features such as async/await and decorators.
TypeScript is developed and maintained by Microsoft, and it is open source and free to use. It is widely used in web development, and many popular frameworks and libraries such as Angular, React, and Vue have TypeScript support.
Static Typing
Static typing in TypeScript allows you to specify the types of variables, function parameters, and return values. This means that you can catch type-related errors at compile-time rather than at runtime.
For example, you can specify that a variable is of type string, and TypeScript will give you an error if you try to assign a number to that variable. Similarly, you can specify that a function takes a parameter of type number, and TypeScript will give you an error if you try to call that function with a string.
Here’s an example of a function that takes two numbers and returns their sum, with static typing:
function addNumbers(x: number, y: number): number { return x + y;}
In this example, the x and y parameters are of type number, and the function returns a value of type number. If you try to call this function with non-numeric arguments, TypeScript will give you an error.
In addition, you can declare types for functions separately to the function implementation. This allows you to define a function type once and reuse it in multiple places.
The void type is used to indicate that a function does not return a value. You can use void as the return type of a function to explicitly indicate that the function does not return anything.
Here’s an example of a function that returns void:
function logMessage(message: string): void { console.log(message);}
In this example, the logMessage function takes a parameter of type string and logs it to the console. The function returns void, which means it does not return a value.
Type Assertions
A type assertion is a way to tell the compiler that you know more about the type of a value than it does. Type assertions are sometimes necessary when working with values that have a more general type than you need.
You can use a type assertion by adding the type you want to assert to the end of an expression, preceded by the as keyword. Here’s an example:
let myValue: any = "hello world";let myLength: number = (myValue as string).length;
In this example, the myValue variable is declared as type any, which means it can hold any value. We then use a type assertion to tell the compiler that we know myValue is actually a string, so we can access its length property.
You can also use angle bracket syntax (< >) to perform a type assertion:
let myValue: any = "hello world";let myLength: number = (<string>myValue).length;
In this example, the type assertion is performed using angle bracket syntax instead of the as keyword.
It’s important to note that type assertions do not change the runtime behavior of your code. They only affect the type checking performed by the TypeScript compiler.
You can use rest parameters to represent an indefinite number of arguments as an array. Rest parameters are denoted by an ellipsis (…) followed by the parameter name.
Here’s an example of a function that uses rest parameters:
function sum(...numbers: number[]): number { return numbers.reduce((total, num) => total + num, 0);}
Primitive Types
There are several primitive types that represent the most basic types of values. These primitive types include:
number: represents numeric values, including integers and floating-point numbers.
string: represents textual values, such as words and sentences.
boolean: represents logical values, either true or false.
null: represents the intentional absence of any object value.
undefined: represents the unintentional absence of any object value.
symbol: represents a unique identifier that can be used as an object property.
let age: number = 30;let name: string = "John";let isStudent: boolean = true;let favoriteColor: string | null = null;let phoneNumber: string | undefined = undefined;let id: symbol = Symbol("id");
Non-primitive types are types that are based on objects rather than simple values. These types include:
object: represents any non-primitive value, including arrays, functions, and objects.
array: represents an ordered list of values of a single type.
function: represents a callable object that can be invoked with arguments.
class: represents a blueprint for creating objects that have properties and methods.
interface: represents a contract that describes the shape of an object.
enum: represents a set of named constants.
Dynamically Generated Types
Dynamically generated types are types that are generated at runtime based on the shape of the data. There are several ways to generate types dynamically in TypeScript:
Index signatures: You can use index signatures to define an object type with dynamic keys. For example:
interface Dictionary<T> { [key: string]: T;}
This interface defines a dictionary type with a dynamic key of type string and a value of type T.
Type assertions: You can use type assertions to cast a value to a specific type at runtime.
const data = JSON.parse(jsonString) as MyType;
This code uses a type assertion to cast the parsed JSON data to a specific type called MyType.
Type guards: You can use type guards to check the type of a value at runtime and conditionally cast it to a specific type. For example:
function isPerson(obj: any): obj is Person { return "name" in obj && "age" in obj;}function printPerson(obj: any) { if (isPerson(obj)) { console.log(`Name: ${obj.name}, Age: ${obj.age}`); } else { console.log("Not a person"); }}
Intersection types: You can use intersection types to combine multiple types into one.
Union Types
A union type is a type that can represent values of multiple types. Union types are denoted by the | symbol between the types.
function printId(id: number | string) { console.log(`ID is ${id}`);}
Union types are useful when you want to write code that can handle multiple types of values.
Intersection Types
An intersection type is a type that combines multiple types into one. Intersection types are denoted by the & symbol between the types.
interface Named { name: string;}interface Loggable { log(): void;}function logName(obj: Named & Loggable) { console.log(`Name is ${obj.name}`); obj.log();}
Intersection types are useful when you want to write code that can handle objects with multiple sets of properties and methods.
Value Types
This interface definition ensures that this Event must have a kind property with one of the three specified values. This can help prevent errors and make the code more self-documenting.
You can use a type guard function to check the type of a value at runtime and conditionally cast it to a specific type. A type guard is a function that returns a boolean value and has a special obj is Type syntax that tells TypeScript that the value is of a specific type.
function isPerson(obj: any): obj is Person { return "name" in obj && "age" in obj;}
You can then use the type guard function to conditionally cast a value to a specific type. Here’s an example:
function printPerson(obj: any) { if (isPerson(obj)) { console.log(`Name: ${obj.name}, Age: ${obj.age}`); } else { console.log("Not a person"); }}
Type Assertions
Type assertions in TypeScript are a way to tell the compiler that you know more about the type of a value than it does. Type assertions are similar to type casting in other languages, but they don’t actually change the type of the value at runtime. Type assertions use the as keyword.
const myValue: any = "hello world";const myLength: number = (myValue as string).length;
This can be useful in JSX format too.
const myComponent = ( <MyComponent prop1={value1} prop2={value2} />) as JSX.Element;
Type Aliases
Type aliases in TypeScript are a way to create a new name for an existing type. They allow you to define a custom name for a type that may be complex or difficult to remember.
Type aliases can also be used with union types, intersection types, and other advanced type constructs. They can help make your code more readable and maintainable by giving complex types a simpler name.
Mapped Types
Mapped types in TypeScript are a way to create new types based on an existing type by transforming each property in the original type in a consistent way. Mapped types use the keyof keyword to iterate over the keys of an object type and apply a transformation to each key.
type Readonly<T> = { readonly [P in keyof T]: T[P];};interface Person { name: string; age: number;}const myPerson: Readonly<Person> = { name: 'John', age: 30 };myPerson.name = 'Jane'; // Error: Cannot assign to 'name' because it is a read-only property.
Mapped types can be used to create many other types, such as Partial, Pick, and Record. They are a powerful feature of TypeScript that can help make your code more expressive and maintainable.
Partial is a mapped type that creates a new type with all properties of the original type set to optional. Here’s an example:
A type predicate in TypeScript is a function that takes an argument and returns a boolean value indicating whether the argument is of a certain type. Type predicates are used to narrow the type of a variable or parameter based on a runtime check.
function isString(value: unknown): value is string { return typeof value === 'string';}function myFunc(value: unknown) { if (isString(value)) { // value is now of type string console.log(value.toUpperCase()); } else { console.log('Not a string'); }}
We define a function myFunc that takes an argument value of type unknown. We then use the isString function to check if value is of type string. If it is, we can safely call the toUpperCase method on value because TypeScript has narrowed the type to string.
never, undefined, null Types
never is a type that represents a value that will never occur. It is used to indicate that a function will not return normally, or that a variable will never have a certain value.
function throwError(message: string): never { throw new Error(message);}
undefined and null are both types and values. The undefined type represents a value that is not defined, while the null type represents a value that is explicitly set to null.
TypeScript also has a --strictNullChecks compiler option that can help prevent null and undefined errors. When this option is enabled, variables that are not explicitly set to null or undefined are considered to be of a non-nullable type. This means that you cannot assign null or undefined to these variables without first checking for their existence.
Classes
Classes in TypeScript are a way to define object-oriented programming (OOP) constructs. They allow you to define a blueprint for creating objects that have properties and methods.
Here’s an example of a class in TypeScript:
class Person { name: string; age: number; constructor(name: string, age: number) { this.name = name; this.age = age; } sayHello() { console.log( `Hello, my name is ${this.name} and I am ${this.age} years old.` ); }}
In this example, the Person class has two properties (name and age) and a method (sayHello). The constructor method is used to initialize the properties when a new object is created.
You can create a new Person object like this:
const person = new Person("Alice", 30);person.sayHello(); // logs "Hello, my name is Alice and I am 30 years old."
One of the main differences between TypeScript and JavaScript classes is that TypeScript allows you to specify the types of class properties, method parameters, and return values. This helps catch type-related errors at compile-time rather than at runtime.
Another difference is that TypeScript provides access modifiers such as public, private, and protected, which allow you to control the visibility of class members. This can help you write more secure and maintainable code.
Finally, TypeScript classes can implement interfaces, which are contracts that describe the shape of an object. This can help enforce type checking on objects that implement the interface.
Access modifiers in TypeScript classes are keywords that determine the visibility of class members (properties and methods). There are three access modifiers in TypeScript:
public: Public members are accessible from anywhere, both inside and outside the class.
private: Private members are only accessible from within the class. They cannot be accessed from outside the class, not even from derived classes.
protected: Protected members are accessible from within the class and from derived classes. They cannot be accessed from outside the class hierarchy.
Here’s an example of a class with access modifiers:
class Person { public name: string; private age: number; protected address: string; constructor(name: string, age: number, address: string) { this.name = name; this.age = age; this.address = address; } public sayHello() { console.log( `Hello, my name is ${this.name} and I am ${this.age} years old.` ); } private getAge() { return this.age; } protected getAddress() { return this.address; }}
In this example, the name property is public, so it can be accessed from anywhere. The age property is private, so it can only be accessed from within the Person class. The address property is protected, so it can be accessed from within the Person class and from derived classes.
Abstract Class
An abstract class is a class that cannot be instantiated directly. Instead, it is meant to be subclassed by other classes that provide concrete implementations of its abstract methods.
An abstract class can have both abstract and non-abstract methods. Abstract methods are declared without an implementation, and must be implemented by any concrete subclass. Non-abstract methods can have an implementation, and can be called by concrete subclasses.
Here’s an example of an abstract class in TypeScript:
abstract class Animal { abstract makeSound(): void; move(distanceInMeters: number) { console.log(`Animal moved ${distanceInMeters}m.`); }}class Dog extends Animal { makeSound() { console.log("Woof! Woof!"); }}const dog = new Dog();dog.makeSound(); // logs "Woof! Woof!"dog.move(10); // logs "Animal moved 10m."
In this example, the Animal class is an abstract class that defines an abstract makeSound method and a non-abstract move method. The Dog class is a concrete subclass of Animal that provides an implementation of the makeSound method. The Dog class can also call the move method inherited from Animal.
But then, what’s the difference between an abstract class and an interface? Take a look at the following example:
In this example, the Animal abstract class and the IAnimal interface both describe objects with a makeSound method and a move method. However, the Animal class is meant to be subclassed, while the IAnimal interface is meant to be implemented.
Some advantages of using inheritance instead of interfaces are:
Multiple Inheritance: An interface can be implemented by multiple classes, while an abstract class can only be subclassed by one class. This can help you create more flexible and reusable code.
Lighter Weight: An interface is a lighter weight construct than an abstract class, since it does not have any implementation details. This can help you write more modular and composable code.
Interfaces
In TypeScript, interfaces are contracts that describe the shape of an object. They define a set of properties and methods that an object must have in order to be considered an implementation of the interface.
Here’s an example of an interface in TypeScript:
interface Person { name: string; age: number; sayHello(): void;}
In this example, the Person interface has two properties (name and age) and a method (sayHello). Any object that implements the Person interface must have these properties and method.
You can use an interface to enforce type checking on objects that implement it. For example, you can define a function that takes a Person object as a parameter:
function greet(person: Person) { person.sayHello();}
In this example, the greet function takes a Person object as a parameter. TypeScript will give you an error if you try to call this function with an object that does not implement the Person interface.
While interfaces and classes have similar ways in defining object types, here are some differences:
Implementation: A class can have both properties and methods, while an interface can only have properties and method signatures. A class is an implementation of an object, while an interface is just a description of an object.
Instantiation: A class can be instantiated to create objects, while an interface cannot. An interface is just a contract that describes the shape of an object.
Inheritance: A class can inherit from another class or multiple classes, while an interface can only extend other interfaces.
Access Modifiers: A class can have access modifiers (public, private, protected) to control the visibility of its members, while an interface cannot.
The benefits of using an interface are the following:
Type checking: Interfaces allow you to enforce type checking on objects that implement them. This can help catch errors at compile-time rather than at runtime.
Code reuse: Interfaces can be used to define a common set of properties and methods that multiple objects can implement. This can help reduce code duplication and make your code more modular.
Abstraction: Interfaces can be used to abstract away implementation details and focus on the contract between objects. This can help make your code more maintainable and easier to reason about.
Polymorphism: Interfaces can be used to create polymorphic behavior, where different objects can be used interchangeably as long as they implement the same interface.
Polymorphism
Polymorphism is the ability of objects to take on multiple forms. In TypeScript, interfaces can be used to create polymorphic behavior, where different objects can be used interchangeably as long as they implement the same interface.
Here’s an example of polymorphism in TypeScript:
interface Shape { getArea(): number;}class Rectangle implements Shape { constructor(private width: number, private height: number) {} getArea() { return this.width * this.height; }}class Circle implements Shape { constructor(private radius: number) {} getArea() { return Math.PI * this.radius ** 2; }}function printArea(shape: Shape) { console.log(`The area of the shape is ${shape.getArea()}`);}const rectangle = new Rectangle(10, 20);const circle = new Circle(5);printArea(rectangle); // logs "The area of the shape is 200"printArea(circle); // logs "The area of the shape is 78.53981633974483"
In this example, the Shape interface defines a getArea method that returns a number. The Rectangle and Circle classes both implement the Shape interface, so they both have a getArea method. The printArea function takes a Shape object as a parameter, so it can be called with either a Rectangle or a Circle object. This is an example of polymorphism, where different objects can be used interchangeably as long as they implement the same interface.
Namespace
In TypeScript, a namespace is a way to group related code into a named scope. Namespaces can contain classes, interfaces, functions, and other code constructs.
You can define a namespace using the namespace keyword, and you can access its contents using the dot notation. Here’s an example:
In this example, the MyNamespace namespace contains an interface Person and a function greet. The Person interface is exported so that it can be used outside of the namespace. The greet function is also exported, and it takes a Person object as an argument.
To use the Person interface and the greet function, you can access them using the dot notation with the namespace name (MyNamespace.Person and MyNamespace.greet).
Enums
In TypeScript, an enum is a way to define a set of named constants. Enums are useful when you have a fixed set of values that a variable can take on, such as the days of the week or the colors of the rainbow.
Here’s an example of an enum in TypeScript:
enum Color { Red, Green, Blue,}let myColor: Color = Color.Red;console.log(myColor); // logs 0
In this example, the Color enum defines three named constants (Red, Green, and Blue). Each constant is assigned a numeric value (0, 1, and 2, respectively) by default. You can also assign string or numeric values explicitly:
enum Color { Red = "#ff0000", Green = "#00ff00", Blue = "#0000ff",}
Generics
Generics in TypeScript allow you to create reusable code components that can work with different types. They provide a way to define functions, classes, and interfaces that can work with a variety of data types, without having to write the same code multiple times.
Here’s an example of a generic function that takes an array of any type and returns the first element:
function getFirstElement<T>(arr: T[]): T { return arr[0];}
In this example, the syntax indicates that the function is generic and can work with any type. The T is a placeholder for the actual type that will be used when the function is called.
The arr parameter is an array of type T, and the function returns a value of type T. When the function is called, the actual type for T is inferred from the type of the array that is passed in.
Generics in TypeScript are commonly used in situations where you want to write code that can work with multiple types. Here are some common use cases for generics:
Collections: Generics can be used to create collections that can hold any type of data. For example, you can create a generic List class that can hold a list of any type of data.
Functions: Generics can be used to create functions that can work with any type of data. For example, you can create a generic identity function that returns its argument of type T.
Interfaces: Generics can be used to create interfaces that can work with any type of data. For example, you can create a generic Comparable interface that defines a method for comparing two objects of type T.
Classes: Generics can be used to create classes that can work with any type of data. For example, you can create a generic Repository class that provides CRUD operations for a data type T.
Modules
In TypeScript, a module is a way to organize code into reusable units. A module can contain classes, functions, interfaces, and other code constructs.
A module can be defined using the export keyword, which makes its contents available for use in other modules. You can also use the import keyword to import code from other modules.
Here’s an example of a module in TypeScript:
// math.tsexport function add(a: number, b: number): number { return a + b;}export function subtract(a: number, b: number): number { return a - b;}
In this example, the math.ts file defines a module that exports two functions (add and subtract). These functions can be imported and used in other modules:
In this example, the app.ts file imports the add and subtract functions from the math module using the import keyword.
Decorators
In TypeScript, a decorator is a special kind of declaration that can be attached to a class declaration, method, accessor, property, or parameter. Decorators use the form @expression, where expression must evaluate to a function that will be called at runtime with information about the decorated declaration.
Decorators can be used to modify the behavior of a class or its members, or to annotate them with additional metadata. For example, you can use a decorator to add logging or validation to a method, or to mark a property as required.
Here’s an example of a decorator in TypeScript:
function log(target: any, key: string, descriptor: PropertyDescriptor) { const originalMethod = descriptor.value; descriptor.value = function (...args: any[]) { console.log(`Calling ${key} with arguments: ${JSON.stringify(args)}`); const result = originalMethod.apply(this, args); console.log(`Result of ${key}: ${JSON.stringify(result)}`); return result; }; return descriptor;}class Calculator { @log add(a: number, b: number) { return a + b; }}const calculator = new Calculator();console.log(calculator.add(1, 2)); // logs "Calling add with arguments: [1,2]" and "Result of add: 3"
In this example, the log function is a decorator that takes three arguments: the target object (the class prototype), the name of the decorated method (add), and a descriptor object that describes the method. The log function modifies the behavior of the method by adding logging statements before and after the original method is called.
The Calculator class has a method add that is decorated with the @log decorator. When the add method is called, the log decorator is executed, which logs the arguments and result of the method.
Similarities can occur on the class level. For example, in this following example, you can write a logger for instantiation.
function log(target: any) { console.log(`Creating instance of ${target.name}`);}@logclass Calculator { add(a: number, b: number) { return a + b; }}const calculator = new Calculator(); // logs "Creating instance of Calculator"console.log(calculator.add(1, 2)); // logs 3
Over the past month, I have been making small enhancements to make the website 1% better. I’m excited to talk about many of them, some noticeable, some under the hood.
Major Updates
Tailwind, 🌑 Dark Mode, and Solving My Woes with Styling
Some major updates are around styling. Previously, I was using some CSS files to style the different pages. However, after a lot of tinkering with Tailwind, I went full in. And boy has it made it easier to update styling, especially around media queries.
I hate to think about media queries, write a quick template or some variables, when tailwind makes that super easy. Add to your classes, sm: or md:, or lg: and you’re good to go for what you want to style at a specific breakpoint. What it means is, you have to think about your smallest width first, then move on to where you want your next breakpoint and add that utility class.
Where I immediately saw this benefit was a bug I found with a list of navigation links. With a little bit of tinkering, I was able to make the classes from flex with a default of no wrapping, to flex-wrap then md:flex-no-wrap to get that desired effect.
Another super helpful thing was immediately adding dark mode support. With the prefix, dark:, it made my life so much easier. I saw some initial places where I needed to modify the website immediately, and having this utility class prefix allowed me to get straight to styling vs. thinking about CSS selectors and rules. That said, having a background in CSS is a huge help, and even if I had to write only CSS, I’d still be operable.
Also, you may now notice there are links next to headings. That’s all thanks to installing my first rehype plugin! I had no idea there was such a rich community of rehype and remark plugins for all different use cases. I’m excited to explore more of them.
Lastly, my RSS feed has been updated. The books and films are added to the main feed, as well as styling the feed page itself. I didn’t know it used a .xsl file, and I used a generic template.
New Collections 📚 🎥
I expanded on my library. The films, anti-library, and book reviews have been added. The lindy library is passable and needs a bit more design and explanation. I’m proud of adding the log alongside the movies and books. I plan to link the log back to those pages too, where I can.
A lot of tinkering with Tailwind helped make this a lot easier too. I knew the design needed to look a little different, so for the past month, I’ve been browsing the pages on my own until they looked the way I wanted.
Content Updates
My resume, about page, now page, and many, many other pages have been updated. This was a long time coming. For years, I’ve kept the same about page, being about the “brief” version vs. the Twitter version vs. the LinkedIn version. I don’t think that represented me well. After some inspiration from Derek Sivers’ about page, I restarted the process from scratch. I thought more about it as an autobiography, rather than a professional LinkedIn page. It’s a lot more personal, and hopefully, that shines than the corporate version that I wince at.
Search 🔍
I installed the Algolia Crawler earlier in the month and finally had time to add a search component over the weekend. A little more refinement is needed to get the search results to display correctly (specifically removing the navigation text), but we’ll get there.
Under the hood 🚘
Getting the initial setup with Netlify was a major lift. Everything else has felt like a smaller lift, but also necessary. For example, dependabot wasn’t installed, so I made sure dealing with package updates was automated. I included meta tags that were missing for SEO purposes, verifying Twitter cards and Open Graph links (like LinkedIn) to work correctly.
What’s next?
Honestly, I’m going to take a step back and work on the content. While I’d love to update the Lindy Library, I’d much rather do what I do best, and write more blog posts. I have been working on a personal content pipeline to gather ideas, slowly work through books, and put my own take out there.
If there are any issues you find with the website, feel free to open an issue on GitHub. Ta ta for now 👋.
Changelog
#43 Add Github Actions to automatically tag the repository by semantic versioning
#45 Migrate from vanilla CSS to Tailwind CSS
#48 Dark Mode added!
#50 Additions to “Logs” - Add concert and musical for 2023
#51 Addition to “Library” - Add a brief lindy library
#54 Install Dependabot to Github project
#60, #61 Add first rehype plugin to add relative links to headings
#62 Netlify configuration - add security headers and update timezone
#66 Added top navigation for blog
#75 Expand on the films section and add them to the main page enhancement
#76 Extend press to include more talks, papers, and updated formatting enhancement
#82 Updated meta tags for SEO. Twitter cards and Open Graph links should correctly render updated hero images
#86 RSS page styled, should make it a lot more readable
#91 Migate blog posts with book reviews to the library book detailed pages
I’ll add my schedule, written down so I have a better grasp of it.
It’s equivalent to writing it down on a calendar for the day. Helps remind me I have meetings coming up
I’ll also use this opportunity to interstitial journal to discover retroactively
This Day In The Past
I’ll review my daily review from last year to discover any insights
Mood Ranking
I’ll rank my mood out of 10, which I review at the end of the week.
This helps me see even if there are down days, there will be up days in the future.
Share your daily routine! If you’re systematic like me, I’d love to hear about it. If you free ball it, I’d love to hear from you too!
I took Tiago Forte’s course, “Building a Second Brain” back in 2021, and one of the first exercises we did was “12 Favorite Problems”. The idea is to lay out your favorite questions, and these questions are long-term problems without easy answers. The following are some questions that I continue to think about often, and take notes when I find new insights.
Questions
How can I build my relationship to be of equal partnership, while respecting what makes us unique?
How do I create and maintain a healthy lifestyle?
How do I maintain relationships with family, friends, and community that builds and encourages bonds, trust, and healthy lifestyles?
How do I incorporate rest alongside the stress of everyday life? Related: Tidying up and clear mental space
How do I build a solid financial future for my family and myself?
How can I grow my technical and interpersonal capabilities that continues to solve problems rather than cranking out widgets?
Interpersonal meaning soft-skills
What are the small, incremental changes that, if continued on a short time interval, can have compounding effects over time? Thinking habits, routines
How can I foster inspiration for creative output? Related: music, writing, and painting
How do I actively engage with content rather than passively consume it?
What are your favorite problems? Feel free to email them to me 😄.
When you start the year heartbroken and scared to start again, where do you go? In my mind, being 32 meant looking forward to getting married, starting a family, buying a home. Life had other plans for me. I took some time to reflect, and I started by selecting an annual theme. It was my “Year of Challenges”, where the theme at first meant to start again and regain a sense of agency. It ended as a way to look at events outside your control.
Wake Up Call
One of my biggest takeaways from the past year came from the book “Four Thousand Weeks ”, by Oliver Burkeman. “Seek out novelty in the mundane”, Burkeman writes. When you’re a child, more experiences are novel because those are first time experiences. When you’re an adult, most experiences are mundane because most experiences are routine. Burkeman’s suggestion for making those mundane activities novel is to take the time to notice them and reflect.
A way I’ve been tracking this is by utilizing a second brain and reviewing notes that I’ve saved throughout the week. Little tidbits from articles I read, ideas that are in their infancy, potential future projects I may want to start. It’s like reviewing your journal in a more systematic way, and remembering what your past self said to help inform your present self, and potentially make decisions for your future self. (In the future, I will write about my experiences with developing a second brain, what it means, and how I utilize it).
How Love Lasts
I never expected the year to be where I entered heart broken, and exited engaged. I had a lot of re-learning to do when it came to love. Furthermore, I read through How Not To Die Alone by Logan Ury to be an indispensable resource. Some big takeaways were “Date for a life partner, not a prom date”, and “Screw the spark”.
I had this erroneous belief that you should wait three years to propose to someone.
Year 1. The honeymoon phase.
Year 2. Share life experiences together through integrating with your partner’s family and friends.
Year 3. Share a home together.
But when you know, you know. Instead, I scrapped waiting years and I jumped straight to the ring and question. I was second guessing my plan. I wanted to surprise her at a rose garden in Oakland, but it was far too dark when we arrived. She was annoyed by the midterm elections, and I was thinking, what could a Plan B mean? I proposed in front of Fenton’s Creamery, and her annoyance became a delightful surprise. She was in tears, and I’ll never forget that moment.
A Run To Remember
I ran a marathon! I hadn’t been to the gym in two years, neglected my physical health during the COVID years, and was afraid to start working out again. What was different from the last time I found myself in similar circumstances was that I learned many lessons from my former physical trainer. I found an accountability partner in a friend who moved back to the area.
At first, it was just running every Saturday morning at Golden Gate Park. Then a different friend suggested I run the SF Half Marathon with her. I created a daily workout plan to get myself back in shape in 7 months, and it paid off. I ran the fastest half-marathon I could ever ask for, and it felt much better than the past two years combined. My biggest hope is that I take this feeling away with me for future years to come.
Exiting Thoughts
I intend to write about more experiences in short essays. Returning to writing is scary. I remember the video Ze Frank made about the “An Invocations on Beginnings”. He says “Let me think about the people who I care about the most, and how when they fail or disappoint me, I still love them, I still give them chances, and I still see the best in them. Let me extend that generosity to myself.” I think it’s hard to give yourself another chance, and easy to say “I’ll do this again another day”. Writing was my form of zen, and I miss it so much. Please consider continuing to read what I have to write, and support me in future endeavors.
I decided to re-write my personal website back in 2017, when I was much more active in writing on my blog. However, that changed quickly when I abandoned making updates in 2018 when I started my job at Clear Labs. There was no longer any time to write as we were working on their Clear Safety product.
I’ve had one or two failed attempts at doing a full re-write, and never fully committed to doing it until this past month. Part of the reason is I dreaded the migration from Jekyll. I knew most of my content was in markdown, but there was this fear in the back of my mind like it was an insurmountable task. Of course, that’s a fallacy, and when you know you could do other things with your time, this project inevitable went into my backlog.
Comeback with Astro
I’ve been itching to write again, and the urge trumped my fear of the migration. I decided to use Astro as my static site generator, with plans to run it as a server as a future. I wrote a small project in Astro, and thought how delightful it was, so I decided to see what the starter had for its blog starter kit. I was pleasantly surprised. It had a great base foundation to start migrating over blog posts, as long as I followed their markdown frontmatter, typically written as Yaml. By taking a look at their base schema, I could easily re-adapt the posts and get something rendering on the page write away.
import { defineCollection, z } from "astro:content";const blog = defineCollection({ // Type-check frontmatter using a schema schema: z.object({ title: z.string(), description: z.string(), // Transform string to Date object pubDate: z .string() .or(z.date()) .transform((val) => new Date(val)), updatedDate: z .string() .optional() .transform((str) => (str ? new Date(str) : undefined)), heroImage: z.string().optional(), }),});export const collections = { blog };
I needed additional metadata for my blog posts, like tags, post type, and a boolean for whether it was a draft.
I’ve created Next.js and Remix projects before, so the file-based routing system was intuitive. The preset included a blog folder with an index.astro and [[...slug]].astro file pre-filled. This made it super easy for my to figure out what was going on by reading the code and commenting the parts I didn’t understand.
After the blog posts migrated over, I quickly threw myself into the other pages that weren’t migrated over, specifically the about page, projects, logs, and newsletter series. Each of those became their own schemas. I updated their markdown frontmatter as well, and the personal site started to look like my old site again.
Deployment
The website was using Netlify, and while I personally would’ve preferred Vercel, it was a good choice. I setup some Github actions to continue to push to Github Pages as well. Netlify’s migration was a pain, because the configuration and its cache were set to build to Jekyll’s configuration. Migrating it over to Astro took some finagling to get the settings just right. I spent a good evening scratching my head until I found the correct environment variable to set it to.
A Side Note about Git
I created my old blog back in 2014, and I was still using master branch as the main branch. With this migration, I moved it over to main. For configuration reasons, it was having trouble moving over in my CI pipeline the first two or three builds. So please remember to check your settings.
Styling
At first, Astro gives you the css from the Bear Blog. While the minimalism was great, that’s not my type of styling. So I adapted it until it started the look the way I wanted it to. Quickly, I realized this isn’t going to be scalable. While astro limits their styling to the component you’re working on, it wasn’t good enough. And the global styles weren’t to my taste.
I knew I wanted to use Tailwind in a full project. Previously, I’ve only used it for tiny pet projects. I went full in immersion. At first, my global styles were being modified by the base.css injected styles from Tailwind. I put too much effort in trying to modify them when I realized, “I started from a base project, and I don’t need these base style files”. That’s when I stopped caring about my blog’s styling conventions and migrated over to Tailwind’s conventions.
Sometimes, it’s hard to break hard habits. The mantra of “Convention over configuration”, as heralded by Ruby on Rails”, was echoing in the back of my mind. While I am not fully migrated over to Tailwind yet, I plan to.
Conclusion
There’s a bunch of things left-over from this migration that I have to still work on.
Analytics (ideally, an alternative to Google Analytics)
Add filters for the writing so you can filter by tags
Migrate over my Newsletter from TinyLetter to Buttondown
Overall though, I’m happy with my switch, and plan on working on my website more. Astro makes it incredible easy to add components from other libraries that I’ve worked with in the past (personally used React, Vue, Svelte, and Solid), so I plan on making more interactive blog posts and projects for this website in the future.
If you have any questions about the migration, want to give me feedback, or would like some help on your own Astro blog, feel free to email me. I’m always happy to help. (Email is in the footer of all pages).
In Astro, there’s this concept of islands. You have a few options on making your page interactive.
From the Astro docs,
these are your options.
---// Example: hydrating framework components in the browser.import DemoApp from "../../components/DemoApp.svelte";---<!-- This component's JS will begin importing when the page loads --><DemoApp client:load /><!-- This component's JS will not be sent to the client untilthe user scrolls down and the component is visible on the page --><DemoApp client:visible /><!-- This component won't render on the server, but will render on the client when the page loads --><DemoApp client:only="svelte" />
I’ll go ahead and try each of these and see what happens.
Initially from OpenAI’s fine-tuned GPT-3 version called Codex
AI-powered Code Generation, a smarter text expansion
Trained on open source code from Github
Reinforcement learning means it gets better with time, but maybe just incrementally
Prompt Engineering
Surprising use cases
Giving enough in the comments for generate decent code. Still needs some analysis
Giving a template for unit tests.
A lot of times, developers skip this step. By having an outline for it, the time to write tests go down
AI-powered tools as paired programming
Great alternative to the question and answer sites like StakeOverflow
Limitations
Answers are generative, meaning what you use in the prompt and how the model was training will determine the output
If you are looking for structured data, Google and Wolfram|Alpha do a much better job
Code that’s complexity is still hard to write
Can get very buggy
Training models in a rut w/ a Glitch Token
SMEs need to be the adult in the room
Legality
A class-action lawsuit against GitHub, OpenAI, and Microsoft claims that the training of Codex violated open source licensing agreements. The outcome could have legal implications for models that generate text, images, and other media as well.
Places like PromptBase are an open marketplace for text strings that generate interesting output
Limitations
Training set based off online images, which have inherit biases (see bad algorithms)
For example, sexualizing women unfairly
Concerns
Concern with legality
Concern with artists
ArtStation, an online community for visual artists, launched its own text-to-image features. Many artists, feeling threatened by computer programs that can reproduce an artist’s hard-won personal style in seconds, boycotted the website.
In the table editor, create a new table messages, and add columns for id, created_at, and content.
id should be a uuid
created_at should default now() and never be null
content is text and should never be null
Setting Up a Remix Project
Create a new remix project
Choose “Just the basics”
Choose Vercel as the service
npx create-remix chatter
For the remix project, you can find the main file in index.tsx
Query Supabase Data with Remix Loaders
npm i @supabase/supabase-js
Add supabase env vars to .env, which can be found in the Project Settings > API. Link
SUPABASE_URL={url}SUPABASE_ANON_KEY={anon_key}
Create a utils/supabase.ts file. Create createClient function
A ”!” can be used at the end of a variable so typescript doesn’t give us errors, if we know those will be available at runtime, like env vars
Supabase has row-level security enabled, meaning you have to write policies in order for the user to do CRUD operations (SELECT, INSERT, UPDATE, DELETE, and ALL).
We added a policy to allow all users to read.
Create the loader in the index page, using import { useLoaderData } from "@remix-run/react";, which will allow us to query supabase using the utils.
supabase.from("messages").select() reminds me a lot like mongodb’s client.
Generate TypeScript Type Definitions with the Supabase CLI
supabase gen types typescript --project-id akhdfxiwrelzhhhofvly > db_types.ts
We have to re-run this command every time we have DB updates
Now we use the db_types.ts into our supabase.ts file by adding a type to the createClient function
You can infer types by using typeof in Typescript. This is useful for showcasing what data’s type is in the Index functional component.
To make sure the data is always present, or an empty array rather than of type null, we use a null coalescing operator on the original data return { messages: data ?? [] };
Implement Authentication for Supabase with OAuth and Github
Enable Github OAuth using Supabase
In the supabase project, go to Authentication > Providers
Choose Github
In Github, go to Settings, Developer Settings > OAuth Apps
Create “Chatter”. Copy the Authorization callback URL
In supabase, enter the Client ID, Client Secret, and the Redirect URL.
The generated secret in Github goes away after a few minutes, so be quick
Create the login component in components/login and then add two buttons for logging in and out.
The handlers should be supabase.auth.signInWithOAuth and supabase.auth.signOut
Add the login component back into the index component.
You’ll notice a ReferenceError in that process is not defined because that should only run on the server.
Change the supabase.ts file to supabase.server.ts file. This shows that the supabase file should only be rendered on the server.
The root.tsx component has an Outlet depending on the route based off the routes files (file-based routing)
In the root component, we add the context in Outlet for the supabase instance.
This can now be used in the login file using useOutletContext.
Types can be added by exporting it from root.
type TypedSupabaseClient = SupabaseClient<Database>;
supabase uses Local Storage to store the OAuth tokens.
You can also check the users in the supabase project
Restrict Access to the Messages Table in a Database with Row Level Security (RLS) Policies
Add a column to our database called user_id and add a foreign key to it, with users and the key being id.
Disable Allow Nullable by adding the logged in user id to the first two messages. This can be found in the users table.
Re-run the db_types script
supabase gen types typescript --project-id akhdfxiwrelzhhhofvly > db_types.ts
Update the policy by changing the target roles to be authenticated.
Now only signed in users will be able to view the data.
Make Cookies the User Session Single Source of Truth with Supabase Auth Helpers
Auth tokens by default are stored in the client’s session, not on the server.
Remix is loading from the server’s session, which is null
npm i @supabase/auth-helpers-remix
We need to change the mechanism for the token to use cookies
Auth helpers allows us to use createServerClient and createBrowserClient to create the supabase instance correctly, based if it’s on the client or server.
You need request and response added in the supabase.server.ts
We need to do the same thing in the loader in root and index
Keep Data in Sync with Mutations Using Active Remix Loader Functions
There’s no update for pressing the button because the client doesn’t update the information after the initial load.
Remix has a revalidation hook.
Supabase has a auth state change hook
Combining these together, on server and client token change (either new token, or no longer has the token), then refetch data from loaders.
Securely Mutate Supabase Data with Remix Actions
To create a new message, we add Form from remix, which has a method post.
This is reminiscent of how forms worked alongside the HTML spec before
An action is created to insert the message, include the response headers from before (passing along the cookie)
The message won’t send yet until the supabase policy is set, so we add a policy for INSERT and make sure the user is authenticated and their user_id matches the one in supabase.
Subscribe to Database Changes with Supabase Realtime
Supabase sends out updates via websockets when there is a change to the database
I got a new Macbook at work, 13” w/ M2 Chip, and I thought it would be great to spend the day setting it up. The following is a document I had continued to write as I was going through every step of the way. This might inspire you to do the same, the next Macbook you start from fresh.
Brave Sync Code (Beware, this code should be private)
beach cheap hidden retire giggle gorilla tone pass length what spread march illegal episode fruit enjoy exact drive humble endless razor today follow treat boy
Brave shortcuts in URL bar
Brave Extensions
React Dev Tools
Redux Dev Tools
Apollo Dev Tools
Reader
iTerm2
Install pip3 through XCode Command Line Tools (CLT)
Create workspaces directory
Check if XCode is already installed
xcode-select -p
A M2 chip issue on brew is solved with the following
# Warning: /opt/homebrew/bin is not in your PATH.# - Run these three commands in your terminal to add Homebrew to your PATH:echo '# Set PATH, MANPATH, etc., for Homebrew.' >> /Users/jeremywong/.zprofileecho 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> /Users/jeremywong/.zprofileeval "$(/opt/homebrew/bin/brew shellenv)"
Modify Fonts
NerdFonts - Iconic font aggregator, collection, & patcher. 3,600+ icons, 50+ patched fonts: Hack, Source Code Pro, more. Glyph collections: Font Awesome, Material Design Icons, Octicons, & more
fnm install 16npm loginnpm config set loglevel="warn"# sudo npm install netlify-cli -g# netlify login# npm i -g sign-bunny fortune-node parrotsay # fun little cli utilities to use# npm i -g undollar # for removing $# npm install -g npm-check-updates # for updating deps# sudo npm install -g trash-cli # to add a `trash` command to so you dont permanently delete files
A feature flag is a decision point in your code that can change the behavior of your application. Feature flags can either be temporary or permanent.
Temporary flags are often used to safely deploy changes to your application or to test new behaviors against old ones. After a new behavior is being used by 100% of your users, the flag is intended to be removed.
Permanent flags give you a way to control the behavior of your application at any time. You might use a permanent flag to create a kill-switch or to reveal functionality only to specific users.
Feature flags are context sensitive. The code path token can change based on the context provided; for example, the user’s identity, the plan they’ve paid for, or any other data.
Feature flags can be used to control which users can see each change. This decouples the act of deploying from the act of releasing.
What do we do today
We have the ability to switch temp flags as kill switch for all customers (new field in result analytics). The permanent flags are controlled per customer (e.g. env mapping). A sub-group of those permanent flags control company integrations with third party services (e.g. Terra).
What are we lacking
What we don’t have is fine control of flags for rollout — using context to switch on/off flags by user, company, or other groups. When introducing new flags, we don’t have a standardized way in storing them in the same place. See companyFeatureToggles vs. companyIntegrations vs. featureFlags. We don’t highlighting flag dependencies. Lastly, permanent flags are limited to a per-company basis.
Definitions
Safety valves are permanent feature flags that you can use to quickly disable or limit nonessential parts of your application to keep the rest of the application healthy.
Kill Switches are permanent feature flags that allows you to quickly turn it off a feature if it’s performing poorly.
Circuit Breakers have the ability to switch off feature flags if they meet certain monitoring criteria.
An Operational Feature Flag are flags around features invisible to customers, such as a new backend improvement or infrastructure change. Operational flags give DevOps teams powerful controls that they can use to improve availability and mitigate risk.
Feature Flag Management Platforms
LaunchDarkly
Split
CloudBees
Deployments
Types of Deployments
There are different types of deployments:
Canary Releases - User groups who would like to opt in
Ring Deployments - Different user segments at a time - e.g. beta or power users
Percentage-based Deployments - Start with low percentage, then move to higher. For operational changes
Each of these can be implemented using feature flags.
Feature flags and blue/green deploys are complementary techniques. Although there are areas of overlap, each approach has distinct benefits, and the best strategy is to use both.
Testing
It isn’t necessary (or even possible) to test every combination of feature flags. Testing each variation of a flag in isolation (using default values for the other flags) is usually enough, unless there’s some known interaction between certain flags.
Library Code
Another decision that affects testing is whether you should use feature flags in reusable library code. I think the answer is no—flags are an application-level concern, not a library concern.
Feature Flag Clean-up
Cleaning up flags aggressively is the key to preventing technical debt from building up. There’s no royal road to flag cleanup, but there are some processes that make it manageable.
A stale flag is a temporary flag that is no longer in use and has not been cleaned up. Too many stale flags are a form of technical debt and an antipattern that you should avoid.
Documentation
Document changes It’s good practice to maintain a log of flag updates. It’s even more helpful to leave a comment with every change. When something is going unexpectedly wrong, being able to quickly see if anything has changed recently (and why it did) is an invaluable asset.
Name your flags well It’s also important to help your team understand what flags are for as easily as possible. So, adopt a naming convention that makes it clear at first glance what a flag is for, what part of the system it affects, and what it does.
Configuration Management
Feature management platforms solve many of these change management problems, but I still do not recommend moving configuration data into feature flags.
Configuration parameters are typically stored in files, environment variables, or services like Consul or Redis. As services become more complex, configuration management becomes a real concern. Tasks like versioning configuration data, rolling back changes, and promoting configuration changes across environments become cumbersome and error prone.
Rather than migrate all configuration data into feature flags, I recommend introducing feature flags selectively on top of whatever configuration management mechanism is in place (files, environment variables, etc.). These flags should be introduced only on an as-needed basis. For example, imagine that you’re trying to manage a database migration via feature flags.
If you had managed your migration by moving the entire database configuration into a feature flag, perhaps by creating a multivariate database-configuration flag, you’d need to keep the flag in place permanently.
Design for Failure
Design multiple layers of redundancy. When you write code you must consider what should happen if the feature flag system fails to respond. Most feature flag APIs include the ability to specify a default option—what is to be served if no other information is available. Ensure that you have a default option and that your defaults are safe and sane.
Flag Distribution via a Networked System
In any networked system there are two methods to distribute information. Polling is the method by which the endpoints (clients or servers) periodically ask for updates. Streaming, the second method, is when the central authority pushes the new values to all the endpoints as they change.
Technique
Pros
Cons
Polling
Simple, Easily Cached
Inefficient. All clients need to connect momentarily, regardless of whether there is a change. Changes require roughly twice the polling interval to propagate to all clients. Because of long polling intervals, the system could create a “split brain” situation, in which both new flag and old flag states exist at the same time.
Streaming
Efficient at scale. Each client receives messages only when necessary. Fast Propagation. Changes can be pushed out to clients in real time.
Requires the central service to maintain connections for every client. Assumes a reliable network.
Relay Proxy
For those customers that have the need for another layer of redundancy on top of the four layers provided by our core service (multiple AWS availability zones, the Fastly CDN, local caching, and default values), we also offer the LaunchDarkly relay proxy (formally known as LD-relay). LD-relay is a small application in a Docker container that can be deployed in your own environment, either in the cloud of your choice or on premise in your datacenter(s).
The Relay Proxy is a small Go application that connects to the LaunchDarkly streaming API and proxies that connection to clients within an organization’s network.
We recommend that customers use the Relay Proxy if they are on an Enterprise plan and primarily use feature flagging in server-side applications. The Relay Proxy adds an additional layer of redundancy in the case of a LaunchDarkly outage.
The following was written for interns starting out with Javascript at Clear Labs.
Base Foundation
Whether this is your first time with Javascript or as a seasoned developer, you should have some base knowledge prior to working with React. While you can learn a framework, it’s more beneficial to understand the language it is written in. For example, what are promises and how does javascript handle asynchronous actions? What is the event loop? And how does Javascript fit in?
Here are some resources to get you started
Freecodecamp - if you have no foundational knowledge of Javascript or need a refresher for the Javascript syntax, start here
MDN Javascript - Mozilla’s documentation on where to get started with Javascript
MDN Promises - Mozilla’s documentation on promises
Async functions - Mozilla’s documentation on handling promises using async functions
Error Handling - Mozilla’s documentation about browser javascript errors
Going Deeper
Many developers find Javascript hard because it started as a scripting language, the syntax looks ugly, and you get these TypeErrors if you’re not careful. That said, with some major changes to the language since Node.js and Google’s V8 engine, Javascript has become a more seasoned programming language. You can develop classes, write generator functions, handle asynchronous events, and enumerate over lists much easier.
Once you’ve started with the basics above, feel free to continue to hone your skills with a deeper understanding of Javascript.
ES2015+ - a new set of functionality in Javascript that allows you to write more effective code. See the Ecmascript section below for more information.
You Don’t Know JS - A series of books written by Kyle Simpson that talks about diving deep into the core mechanisms of Javascript
Ecmascript
JavaScript is a subset of ECMAScript. JavaScript is basically ECMAScript at its core but builds upon it. Languages such as ActionScript, JavaScript, JScript all use ECMAScript as its core. As a comparison, AS/JS/JScript are 3 different cars, but they all use the same engine… each of their exteriors is different though, and there have been several modifications done to each to make it unique.
The history is, Brendan Eich created Mocha which became LiveScript, and later JavaScript. Netscape presented JavaScript to Ecma International, which develops standards and it was renamed to ECMA-262 aka ECMAScript.
It’s important to note that Brendan Eich’s “JavaScript” is not the same JavaScript that is a dialect of ECMAScript. He built the core language which was renamed to ECMAScript, which differs from the JavaScript which browser-vendors implement nowadays.
If your base understanding of Javascript is prior to ES6, you’ll want to read up on the basics. To start, arrow functions, classes, let and const statements are used throughout the app.
Arrow Functions
Often times we have nested functions in which we would like to preserve the context of this from its lexical scope. An example is shown below:
function Person(name) { this.name = name;}Person.prototype.prefixName = function (arr) { return arr.map(function (character) { return this.name + character; // Cannot read property 'name' of undefined });};
One common solution to this problem is to store the context of this using a variable:
function Person(name) { this.name = name;}Person.prototype.prefixName = function (arr) { var that = this; // Store the context of this return arr.map(function (character) { return that.name + character; });};
We can also pass in the proper context of this:
function Person(name) { this.name = name;}Person.prototype.prefixName = function (arr) { return arr.map(function (character) { return this.name + character; }, this);};
As well as bind the context:
function Person(name) { this.name = name;}Person.prototype.prefixName = function (arr) { return arr.map( function (character) { return this.name + character; }.bind(this) );};
Using Arrow Functions, the lexical value of this isn’t shadowed and we can re-write the above as shown:
function Person(name) { this.name = name;}Person.prototype.prefixName = function (arr) { return arr.map((character) => this.name + character);};
Best Practice: Use Arrow Functions whenever you need to preserve the lexical value of this.
Arrow Functions are also more concise when used in function expressions which simply return a value:
Best Practice: Use Arrow Functions in place of function expressions when possible.
Template Literals
Using Template Literals, we can now construct strings that have special characters in them without needing to escape them explicitly.
var text = 'This string contains "double quotes" which are escaped.';let text = `This string contains "double quotes" which don't need to be escaped anymore.`;
Template Literals also support interpolation, which makes the task of concatenating strings and values:
var name = "Tiger";var age = 13;console.log("My cat is named " + name + " and is " + age + " years old.");
Much simpler:
const name = "Tiger";const age = 13;console.log(`My cat is named ${name} and is ${age} years old.`);
In ES5, we handled new lines as follows:
var text = "cat\n" + "dog\n" + "nickelodeon";
Or:
var text = ["cat", "dog", "nickelodeon"].join("\n");
Template Literals will preserve new lines for us without having to explicitly place them in:
let text = `catdognickelodeon`;
Template Literals can accept expressions, as well:
let today = new Date();let text = `The time and date is ${today.toLocaleString()}`;
Classes
Prior to ES6, we implemented Classes by creating a constructor function and adding properties by extending the prototype:
class Personal extends Person { constructor(name, age, gender, occupation, hobby) { super(name, age, gender); this.occupation = occupation; this.hobby = hobby; } incrementAge() { super.incrementAge(); this.age += 20; console.log(this.age); }}
Best Practice: While the syntax for creating classes in ES6 obscures how implementation and prototypes work under the hood, it is a good feature for beginners and allows us to write cleaner code.
Let / Const
Besides var, we now have access to two new identifiers for storing values —let and const. Unlike var, let and const statements are not hoisted to the top of their enclosing scope.
An example of using var:
var snack = "Meow Mix";function getFood(food) { if (food) { var snack = "Friskies"; return snack; } return snack;}getFood(false); // undefined
However, observe what happens when we replace var using let:
let snack = "Meow Mix";function getFood(food) { if (food) { let snack = "Friskies"; return snack; } return snack;}getFood(false); // 'Meow Mix'
This change in behavior highlights that we need to be careful when refactoring legacy code which uses var. Blindly replacing instances of var with let may lead to unexpected behavior.
Note: let and const are block scoped. Therefore, referencing block-scoped identifiers before they are defined will produce a ReferenceError.
console.log(x); // ReferenceError: x is not definedlet x = "hi";
Best Practice: Leave var declarations inside of legacy code to denote that it needs to be carefully refactored. When working on a new codebase, use let for variables that will change their value over time, and const for variables which cannot be reassigned.
Destructuring allows us to extract values from arrays and objects (even deeply nested) and store them in variables with a more convenient syntax.
Destructuring Arrays
var arr = [1, 2, 3, 4];var a = arr[0];var b = arr[1];var c = arr[2];var d = arr[3];let [a, b, c, d] = [1, 2, 3, 4];console.log(a); // 1console.log(b); // 2
Destructuring Objects
var luke = { occupation: "jedi", father: "anakin" };var occupation = luke.occupation; // 'jedi'var father = luke.father; // 'anakin'let luke = { occupation: "jedi", father: "anakin" };let { occupation, father } = luke;console.log(occupation); // 'jedi'console.log(father); // 'anakin'
Parameters
In ES5, we had varying ways to handle functions which needed default values, indefinite arguments, and named parameters. With ES6, we can accomplish all of this and more using more concise syntax.
Default Parameters
function addTwoNumbers(x, y) { x = x || 0; y = y || 0; return x + y;}
In ES6, we can simply supply default values for parameters in a function:
function addTwoNumbers(x = 0, y = 0) { return x + y;}addTwoNumbers(2, 4); // 6addTwoNumbers(2); // 2addTwoNumbers(); // 0
Symbols
Symbols have existed prior to ES6, but now we have a public interface to using them directly. Symbols are immutable and unique and can be used as keys in any hash.
Symbol();
Calling Symbol() or Symbol(description) will create a unique symbol that cannot be looked up globally. A Use case for Symbol() is to patch objects or namespaces from third parties with your own logic, but be confident that you won’t collide with updates to that library. For example, if you wanted to add a method refreshComponent to the React.Component class, and be certain that you didn’t trample a method they add in a later update:
Symbol.for(key) will create a Symbol that is still immutable and unique, but can be looked up globally. Two identical calls to Symbol.for(key) will return the same Symbol instance. NOTE: This is not true for Symbol(description):
A common use case for Symbols, and in particular with Symbol.for(key) is for interoperability. This can be achieved by having your code look for a Symbol member on object arguments from third parties that contain some known interface. For example:
function reader(obj) { const specialRead = Symbol.for("specialRead"); if (obj[specialRead]) { const reader = obj[specialRead](); // do something with reader } else { throw new TypeError("object cannot be read"); }}
A notable example of Symbol use for interoperability is Symbol.iterator which exists on all iterable types in ES6: Arrays, strings, generators, etc. When called as a method it returns an object with an Iterator interface.
Maps is a much needed data structure in JavaScript. Prior to ES6, we created hash maps through objects:
var map = new Object();map[key1] = "value1";map[key2] = "value2";
However, this does not protect us from accidentally overriding functions with specific property names:
> getOwnProperty({ hasOwnProperty: 'Hah, overwritten'}, 'Pwned');> TypeError: Property 'hasOwnProperty' is not a function
Actual Maps allow us to set, get and search for values (and much more).
let map = new Map();> map.set('name', 'david');> map.get('name'); // david> map.has('name'); // true
The most amazing part of Maps is that we are no longer limited to just using strings. We can now use any type as a key, and it will not be type-cast to a string.
Note: Using non-primitive values such as functions or objects won’t work when testing equality using methods such as map.get(). As such, stick to primitive values such as Strings, Booleans and Numbers.
We can also iterate over maps using .entries():
for (let [key, value] of map.entries()) { console.log(key, value);}
Promises
Promises allow us to turn our horizontal code (callback hell):
func1(function (value1) { func2(value1, function (value2) { func3(value2, function (value3) { func4(value3, function (value4) { func5(value4, function (value5) { // Do something with value 5 }); }); }); });});
Into vertical code:
func1(value1) .then(func2) .then(func3) .then(func4) .then(func5, (value5) => { // Do something with value 5 });
Prior to ES6, we used bluebird or Q. Now we have Promises natively:
new Promise((resolve, reject) => reject(new Error("Failed to fulfill Promise"))).catch((reason) => console.log(reason));
Where we have two handlers, resolve (a function called when the Promise is fulfilled) and reject (a function called when the Promise is rejected).
Benefits of Promises: Error Handling using a bunch of nested callbacks can get chaotic. Using Promises, we have a clear path to bubbling errors up and handling them appropriately. Moreover, the value of a Promise after it has been resolved/rejected is immutable - it will never change.
Here is a practical example of using Promises:
var request = require("request");return new Promise((resolve, reject) => { request.get(url, (error, response, body) => { if (body) { resolve(JSON.parse(body)); } else { resolve({}); } });});
We can also parallelize Promises to handle an array of asynchronous operations by using Promise.all():
let urls = [ "/api/commits", "/api/issues/opened", "/api/issues/assigned", "/api/issues/completed", "/api/issues/comments", "/api/pullrequests",];let promises = urls.map((url) => { return new Promise((resolve, reject) => { $.ajax({ url: url }).done((data) => { resolve(data); }); });});Promise.all(promises).then((results) => { // Do something with results of all our promises});
Generators
Similar to how Promises allow us to avoid callback hell, Generators allow us to flatten our code - giving our asynchronous code a synchronous feel. Generators are essentially functions which we can pause their execution and subsequently return the value of an expression.
A simple example of using generators is shown below:
Where next will allow us to push our generator forward and evaluate a new expression. While the above example is extremely contrived, we can utilize Generators to write asynchronous code in a synchronous manner:
// Hiding asynchronousity with Generators
function request(url) { getJSON(url, function (response) { generator.next(response); });}
And here we write a generator function that will return our data:
function* getData() { var entry1 = yield request("https://some_api/item1"); var data1 = JSON.parse(entry1); var entry2 = yield request("https://some_api/item2"); var data2 = JSON.parse(entry2);}
By the power of yield, we are guaranteed that entry1 will have the data needed to be parsed and stored in data1.
While generators allow us to write asynchronous code in a synchronous manner, there is no clear and easy path for error propagation. As such, as we can augment our generator with Promises:
function request(url) { return new Promise((resolve, reject) => { getJSON(url, resolve); });}
And we write a function which will step through our generator using next which in turn will utilize our request method above to yield a Promise:
function iterateGenerator(gen) { var generator = gen(); (function iterate(val) { var ret = generator.next(); if (!ret.done) { ret.value.then(iterate); } })();}
By augmenting our Generator with Promises, we have a clear way of propagating errors through the use of our Promise .catch and reject. To use our newly augmented Generator, it is as simple as before:
iterateGenerator(function* getData() { var entry1 = yield request("https://some_api/item1"); var data1 = JSON.parse(entry1); var entry2 = yield request("https://some_api/item2"); var data2 = JSON.parse(entry2);});
We were able to reuse our implementation to use our Generator as before, which shows their power. While Generators and Promises allow us to write asynchronous code in a synchronous manner while retaining the ability to propagate errors in a nice way, we can actually begin to utilize a simpler construction that provides the same benefits: async-await.
Async Await
While this is actually an upcoming ES2016 feature, async await allows us to perform the same thing we accomplished using Generators and Promises with less effort:
var request = require("request");function getJSON(url) { return new Promise(function (resolve, reject) { request(url, function (error, response, body) { resolve(body); }); });}async function main() { var data = await getJSON(); console.log(data); // NOT undefined!}main();
Under the hood, it performs similarly to Generators. I highly recommend using them over Generators + Promises. A great resource for getting up and running with ES7 and Babel can be found here.
Getter and setter functions
ES6 has started supporting getter and setter functions within classes. Using the following example:
class Employee { constructor(name) { this._name = name; } get name() { if (this._name) { return "Mr. " + this._name.toUpperCase(); } else { return undefined; } } set name(newName) { if (newName == this._name) { console.log("I already have this name."); } else if (newName) { this._name = newName; } else { return false; } }}var emp = new Employee("James Bond");// uses the get method in the backgroundif (emp.name) { console.log(emp.name); // Mr. JAMES BOND}// uses the setter in the backgroundemp.name = "Bond 007";console.log(emp.name); // Mr. BOND 007
Latest browsers are also supporting getter/setter functions in Objects and we can use them for computed properties, adding listeners and preprocessing before setting/getting:
var person = { firstName: "James", lastName: "Bond", get fullName() { console.log("Getting FullName"); return this.firstName + " " + this.lastName; }, set fullName(name) { console.log("Setting FullName"); var words = name.toString().split(" "); this.firstName = words[0] || ""; this.lastName = words[1] || ""; },};person.fullName; // James Bondperson.fullName = "Bond 007";person.fullName; // Bond 007
ES6 Modules
Prior to ES6, we used libraries such as Browserify to create modules on the client-side, and require in Node.js. With ES6, we can now directly use modules of all types (AMD and CommonJS).
Exporting in ES6
With ES6, we have various flavors of exporting. We can perform Named Exports:
export let name = 'David';export let age = 25;
As well as exporting a list of objects:
function sumTwo(a, b) { return a + b;}function sumThree(a, b, c) { return a + b + c;}export { sumTwo, sumThree };
We can also export functions, objects and values (etc.) simply by using the export keyword:
export function sumTwo(a, b) { return a + b;}export function sumThree(a, b, c) { return a + b + c;}
And lastly, we can export default bindings:
function sumTwo(a, b) { return a + b;}function sumThree(a, b, c) { return a + b + c;}let api = { sumTwo, sumThree,};export default api;/* Which is the same as * export { api as default }; */
Best Practices: Always use the export default method at the end of the module. It makes it clear what is being exported, and saves time by having to figure out what name a value was exported as. More so, the common practice in CommonJS modules is to export a single value or object. By sticking to this paradigm, we make our code easily readable and allow ourselves to interpolate between CommonJS and ES6 modules.
Importing in ES6
ES6 provides us with various flavors of importing. We can import an entire file:
import "underscore";
It is important to note that simply importing an entire file will execute all code at the top level of that file.
Similar to Python, we have named imports:
import { sumTwo, sumThree } from "math/addition";
We can also rename the named imports:
import { sumTwo as addTwoNumbers, sumThree as sumThreeNumbers,} from "math/addition";
In addition, we can import all the things (also called namespace import):
import * as util from "math/addition";
Lastly, we can import a list of values from a module:
import * as additionUtil from "math/addition";const { sumTwo, sumThree } = additionUtil;
Importing from the default binding like this:
import api from "math/addition";// Same as: import { default as api } from 'math/addition';
While it is better to keep the exports simple, but we can sometimes mix default import and mixed import if needed. When we are exporting like this:
// foos.jsexport { foo as default, foo1, foo2 };
We can import them like the following:
import foo, { foo1, foo2 } from "foos";
When importing a module exported using commonjs syntax (such as React) we can do:
import React from "react";const { Component, PropTypes } = React;
This can also be simplified further, using:
import React, { Component, PropTypes } from "react";
Note: Values that are exported are bindings, not references. Therefore, changing the binding of a variable in one module will affect the value within the exported module. Avoid changing the public interface of these exported values.
Additional Resources
In addition to those features of ES6+, you’ll notice other features that you can incrementally learn as you go along. Here’s an incomplete list.
The following was written for interns starting out with browsers at Clear Labs.
Javascript was initially developed as a scripting language for the browser. The language has expanded into servers, IoT devices, serverless functions. But let’s take it a step back and talk more about its initial use case with browsers.
Back in the early days of the Web, developers wanted to handle more than reading documents. Forms were introduced to start this interactivity, and soon, developers wanted more APIs. These set of APIs for browsers, known as DOM APIs, became the way a developer could interact with the browser using Javascript. Over the years, this has matured into a large set of APIs.
You can find a separate wiki page for the DOM APIs that we use for our app.
Performance
The DOM, or the document object model, is a representation of the HTML on the page. The browser parses the HTML and puts that HTML in a representation called the DOM. In addition, the browser also parses the CSS and places it in a similar representation known as the CSSDOM. When these two are complete, a paint event can occur which can be shown to the user.
Javascript’s execution is slightly different than HTML and CSS. If Javascript gets loaded prior to the CSSDOM completion, it could block the browser’s paint execution until that Javascript is loaded. This phenomenon, known as Blocking, has some effects on performance.
For a deeper dive into browser performance, here are two (paid) books.
High Performance Web Sites - Written in 2007, still holds value in how browsers run. Some syntax has been updated, but the general advice is sound. It is highly likely you can find this book for free
Even Faster Websites - Written in 2009, a good follow-up to “High Performance Web Sites” that tackles additional topics about Javascript, the Browser, and the Network
To understand blocking, you have to understand the event loop. The following resource is a great primer on the event loop.
What the heck is the event loop anyway? - A Youtube video conference talk on how the event loop works. It also goes over some special topics of multi-threading with Javascript.
Event Handling
One of Javascript’s purposes is to handle events from the user. You could write some code like this:
var input = document.getElementById("input-text-username");input.onchange((event) => { // Do something with the event console.log(event);});
The onchange attribute is function that takes a callback. A callback is a function that gets triggered when the event is triggered. Any event that takes place on the DOM can include a callback, for example, focus in on the element or mouseover the element.
The first number is the MAJOR version. The next is the MINOR version. Last digit is the PATCH version.
Patch Update
In our example table above, react-dates has a patch version update.
21.5.0 -> 21.5.1
The last digit changed from 0 to 1. That means the version is backwards compatible.
Usually this means the package has bug fixes.
You can safely update the package.json with this package without doing any checks.
Minor Update
In our example table above, normalizr has a minor version update.
3.4.1 -> 3.5.0
The second digit changed from 4 to 5. That means the version should be backwards compatible.
Usually this means the package has features added.
You can sometimes safely update the package.json with this package.
Use your intuition if you need to check the pacakage in the app.
For example, if the package type is a dev dependency, most likely you don’t have to make changes.
The example package normalizr would fall under this case, and you can safely upgrade.
If there’s a new API or function worth exploring, make some changes and see how they work, if they apply to our application.
Major Update
In our example table above, babel-jest has a major version update.
24.9.0 -> 25.1.0
The first digit changed from 24 to 25. That means the version is not backwards compatible.
Usually this means the package API has changed.
In some cases, it may be because they have dropped support for an old version of Node. YMMV
You can never safely update the package.json with this package.
Do the following:
Check the CHANGELOG.md or releases Github page. Figure out what the change is
If there are API changes, read up on what the changes are. If they are fundamental and big, do not add. Make a task ticket to upgrade.
Sometimes the library might be popular. They may have a blog post on this. (e.g. Storybook, Apollo, React, and Styled-Components)
If it’s for dropped support for an older version of Node, go ahead and upgrade
For all other changes, upgrade locally, then see if anything in the App breaks. Also check Storybook and tests to see if anything breaks.
Be wary of major changes. When in doubt, as a teammate.
This article was written as part of our initial docs. I have many more articles about React, and I’m debating whether I should cover them in a single article, or multiple. Stay tuned.
At Clear Labs, the web app is a front-end application built on top of React. React is a javascript library that, when paired with other libraries, creates a front-end framework. In our project, we have React on the front-end and nginx serving the assets on the back-end.
If you are starting React with no previous knowledge, please start with the official docs.
Once you have familiarized yourself with the library, play around with it on Codesandbox or on your local system using Create React App. If you can build yourself a basic UI, continue reading this wiki.
Base Foundation
To build with React, each developer should hone their vanilla Javascript knowledge. Please refer to the Javascript wiki to see if you have any missing gaps in your knowledge base.
A must for each developer onboarding is a clear understanding of how React works. This includes the following:
What are React’s lifecycle functions? And how are they supplemented with React hooks?
Why would I use a React class component over a functional component? And when?
This post tries to address these questions and many more.
Newer React Functionality (React v15+)
The application uses many techniques that are worth highlighting because we’ve developer our own set of best practices to follow.
React Context
React Hooks
React Performance APIs (useMemo, useCalllback)
Supporting Libraries
Many supporting libraries help support the development of the app. Most of these supporting libraries are open source and have dedicated wiki pages. Here are the highlights:
React-Final-Form
Downshift
d3
i18next
Luxon (migrating from moment)
Components
Our project includes Storybook, an interactive UI tool to develop and document components. In each component, an extra js file is created with the stories suffix. E.g. index.stories.js. This helps with developing components on their own and reduces overhead with creating component properties.
Refactoring class components to functional components
Lifecycle functions can be replaced with useEffect. But be careful, as we mentioned in useEffect vs useLayoutEffect, useEffect is asynchronous and lifecycle functions aren’t a 1
match.
componentDidMount() {// do something}// now becomesuseEffect(() => {// do something}, []);
Building Components
While the previous section introduced us to components, this section expands on how we write components.
Class or Function?
When creating a new component, start off with a function component. What is a function component?
const FunctionComponent = (props) => <div>Here's the JSX</div>;
A function component is an easier markup to read. To React, a function component vs. a class are indistinguishable. As developers, we aim for clean code. Ask yourself the following questions of whether you might need a class.
Do we need lifecycle functions? If this is yes, evaluate whether you can use Hooks instead. If not, use a class.
Do we need a constructor? Rarely do we need a constructor. If you need one ask what special cases are you doing to state or what the justification is for other constructor needs.
Does the component need private or public methods? On a rare occassion, we may want to expose a public class method. Use a class.
Maybe there are private methods a class should have. Use a class.
In general, for most components are function components. With the introduction of hooks, function components can also have state. We have our own section about hooks too.
Component or PureComponent?
If using a class, we can further ask whether a PureComponent should be extended vs. a Component.
Compound Components
Compound components allow you to create and use components which share this state implicitly.
Other Related Articles
I’ve written a few other React articles, as shown below:
The following guide is a modified version that we use at Clear Labs dev team. It’s a starting point for team dev work and contribution.
When contributing to this repository, please first make sure a ticket is filed for the change, whichever ticketing system is used.
At Clear Labs, we use JIRA, but the same can be done for Github issues, or any other ticketing system.
Please note we have a code of conduct. Please follow it in all your interactions with the project.
How To Contribute
When beginning development, you will need to create a git branch. See Git Branches
for more information about naming your git branch.
Git Branches
The app has three main branches.
develop ➡ Maps to the Development environment
main ➡ Maps to the Production environment
release ➡ Maps to the released versions on the Production environment (we have slow release cycles, )
In development, a developer will create a feature branch, named after a ticket number, e.g. ENG-2120.
When the ticket is ready to test, the develop will create a pull request (PR) against the develop branch.
When a set of features are completed, a PR will be created between the develop branch and the master branch.
Before the PR is merged, the developer needs to tag the develop branch with the proper version tag.
QA will approve this PR when they are ready to upgrade the QA environment with the developer’s latest changes.
When a set of features are tested, a develop needs to create a PR between the main and release branch.
When QA approves this PR, the developer will tag and merge this PR.
Naming Scheme for CI
Name your branches with these prefixes. This will test and build the application in our CI.
ENG-*
hotfix-*
feature-*
Commits
All commits need to contain a ticket number. If a commit does not contain a ticket number, the push to Bitbucket will not be allowed.
Example:
git commit -m “ENG-2120 resolve breaking change from GraphQL API for test runs”
In case a commit does not contain a ticket number, you have a few strategies to resolve this:
rebase against develop. git rebase develop -i
if it is the latest commit, you can amend it. git commit --amend
Pull Request Process
Ensure any install or build dependencies are removed before the end of the layer when doing a build. Please use the .gitignore file for ignoring unnecessary files. Make sure all commit messages have a JIRA ticket tag. e.g. git commit -m "ENG-100 commit message"
Update the README.md with details of changes to the interface, this includes new environment variables, exposed ports, useful file locations and container parameters. If there are changes to development, please update the development guide.
If creating a PR to master branch, tag the develop branch with a bump in the version. The same goes for a PR to release by tagging main. For develop ➡ main branch, take the base version, add a hyphen, and concat the date (mm/dd) plus an incrementor. e.g. v1.6.0.0.1-Feb.01.1 For master ➡ release-candidate branch, give the version. e.g. v1.6.1. For additional information about versioning, please refer to the next section.
JIRA should add a list of commits going into this PR. If not, please add them with the JIRA ticket tag.
You may merge the Pull Request in once you have the sign-off of one other developer, or if you do not have permission to do that, you may request the second reviewer to merge it for you.
Preleases are used for git tagging between develop and master branches. This is denoted by an alpha-{number}, e.g. v0.9.13.alpha-1
Releases are versioned without prerelease words, e.g. v0.9.13
For hotfixes, bump the patch version. e.g. v0.9.13 -> v0.9.14
Upon later inspection, we no longer use prereleases.
🚨 Deprecation Notice
Moving forward, release-candidate will be deprecated in favor of using main without release.
Code of Conduct
Our Pledge
In the interest of fostering an open and welcoming environment, we as
contributors and maintainers pledge to making participation in our project and
our community a harassment-free experience for everyone, regardless of age, body
size, disability, ethnicity, gender identity and expression, level of experience,
nationality, personal appearance, race, religion, or sexual identity and
orientation.
Our Standards
Examples of behavior that contributes to creating a positive environment
include:
Using welcoming and inclusive language
Being respectful of differing viewpoints and experiences
Gracefully accepting constructive criticism
Focusing on what is best for the community
Showing empathy towards other community members
Examples of unacceptable behavior by participants include:
The use of sexualized language or imagery and unwelcome sexual attention or advances
Trolling, insulting/derogatory comments, and personal or political attacks
Public or private harassment
Publishing others’ private information, such as a physical or electronic address, without explicit permission
Other conduct which could reasonably be considered inappropriate in a professional setting
Our Responsibilities
Project maintainers are responsible for clarifying the standards of acceptable
behavior and are expected to take appropriate and fair corrective action in
response to any instances of unacceptable behavior.
Project maintainers have the right and responsibility to remove, edit, or
reject comments, commits, code, wiki edits, issues, and other contributions
that are not aligned to this Code of Conduct, or to ban temporarily or
permanently any contributor for other behaviors that they deem inappropriate,
threatening, offensive, or harmful.
Scope
This Code of Conduct applies both within project spaces and in public spaces
when an individual is representing the project or its community. Examples of
representing a project or community include using an official project e-mail
address, posting via an official social media account, or acting as an appointed
representative at an online or offline event. Representation of a project may be
further defined and clarified by project maintainers.
Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the Engineering Manager. All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.
Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project’s leadership.
These notes are a guide I’ve written throughout coding the initial part of the application. The note starts out with fundamentals and continues with specific testing edge cases.
Philosophy
Write tests. Not too many. Mostly integration.
Guillermo Rauch
The more your tests resemble the way your software is used, the more confidence they can give you.
Kent C. Dodds
This project focuses mainly on integration tests. Why? We shouldn’t mock too much as the tests themselves become unmaintainable.
When you make any changes to the code with tests that have a lot of mocking, the tests also have to be updated.
Mostly manual. And we end up creating more work for the developer than is actually worth.
Code coverage also isn’t the best factor to aim for. Yes, we should have tests to cover our code. No, we shouldn’t aim for 100% coverage.
Pareto’s law can apply here. For most cases, we expect few test to cover most use cases. At some point, there’s diminishing returns.
Out of the box, the testing framework and its tools are installed with dependencies.
For more information, checkout the installation section of the README.
Unit tests are run before a building the Docker container.
Tests are run with Jest, that has the Expect expectations library given.
As mentioned in the testing philosophy, we try not to focus on mocking. Sometimes this is inevitable and we have included Enzyme for shallow rendering.
Use shallow sparingly. For more, read this article.
yarn test
Additional Commands
If there are any jest flags you want to add to your tests, like watch mode or coverage, you can add those flags to the command.
Watch
# Run tests in watch modeyarn test --watch
Coverage
# Run a coverage reportyarn test --coverage# This will build a `coverage` folder that can be viewed for a full coverage report
Single file or folder
# Run tests over a single fileyarn test src/path/to/file# Run tests over a folderyarn test src/path/to/folder
State Management Testing
Test all actions, sagas, and reducers.
Action tests are ensuring the action creators create the proper actions
Reducer tests are ensuring the state has been changed properly
Saga tests are more for E2E testing, making sure all side-effects are accounted for
Move data fetching code or side effects to componentDidUpdate.
If you’re updating state whenever props change, refactor your code to use memoization techniques or move it to static getDerivedStateFromProps. Learn more at: https://fb.me/react-derived-state
Rename componentWillReceiveProps to UNSAFEcomponentWillReceiveProps to suppress this warning in non-strict mode. In React 17.x, only the UNSAFE name will work. To rename all deprecated lifecycles to their new names, you can run npx react-codemod rename-unsafe-lifecycles in your project source folder.
Please update the following components: *
With a move to React v16.8 -> v16.9, componentWillMount, componentWillReceiveProps, and componentWillUpdate lifecycle methods have been renamed.
They will be deemed unsafe to use. Our library has updated already, but some libraries may still use this.
Known libraries with issues:
react-dates
react-outside-click-handler (dev dependency to react-dates)
Invariant Violation: Could not find “store” in the context of “Connect(Form(Form))”.
Either wrap the root component in a “Provider”, or pass a custom React context provider
to “Provider” and the corresponding React context consumer to Connect(Form(Form))
in connect options.
Solution
Add imports
import { Provider } from "react-redux";import configureStore from "redux-mock-store";
Create the mock store. Wrap renderer with provider.
You’ve included redux in your test, but you might get the following message.
[redux-saga-thunk] There is no thunk state on reducer
If this is the case, go back to your mock store and include thunk has a key.
it("renders a component that needs to thunk", () => { const mockStore = configureStore(); const store = mockStore({ thunk: {} }); // Be sure to include this line with the thunking const tree = renderer .create( <Provider store={store}> <TestedComponent /> </Provider> ) .toJSON(); expect(tree).toMatchSnapshot();});
i18n Error
Sometimes, an i18n provider isn’t given. The error doesn’t appear to be useful.
TypeError: Cannot read property ‘ready’ of null
Check if the component or a child component uses the Translation component. If so, Translation requires context Provider be wrapped around.
Solution
Add imports
import { I18nextProvider } from "react-i18next";import i18n from "../../../test-utils/i18n-test";
Rerun the test and check the snapshot. If the snapshot looks good, add the -u flag to update the snapshot.
Apollo Error
If the component requires an apollo component, you will want to pass in a mock provider.
Invariant Violation: Could not find “client” in the context or passed in as a prop.
Wrap the root component in an “ApolloProvider”, or pass an ApolloClient instance in via props.
Add imports
import { MockedProvider } from "@apollo/client/testing";
TypeError: Cannot read property ‘createLTR’ of undefined
Solution
Solve by adding the following to the top of the test file
import "react-dates/initialize";
As of v13.0.0 of react-dates, this project relies on react-with-styles. If you want to continue using CSS stylesheets and classes, there is a little bit of extra set-up required to get things going. As such, you need to import react-dates/initialize to set up class names on our components. This import should go at the top of your application as you won’t be able to import any react-dates components without it.
Final Form
Warning: Field must be used inside of a ReactFinalForm component
When you use the test renderer, this won’t work.
For an exhaustive way of triggering events, check out
this post.
The preliminary solution is to run act from the react-test-renderer library.
Currently, there is no documentation to this, so it’s best to
read the code.
Here’s how we use act.
it("creates component with useEffect", () => { // Create your tree const tree = renderer.create( <TestComponentWithEffect>My Effect</TestComponentWithEffect> ); // Tell the renderer to act, pushing the effect through renderer.act(() => {}); expect(tree.toJSON()).toMatchSnapshot();});// Drawbacks:// - Can't handle flushing (yet)
This will be revisited as the API matures.
Dealing with Time
If you need to mock time, you could use this implementation.
const constantDate = new Date("2019-05-16T04:00:00");/* eslint no-global-assign:off */Date = class extends Date { constructor() { super(); return constantDate; }};
I’ve been a bit fascinated by an episode of the Cortex podcast about Yearly Themes.
In the episode, Myke and Grey discuss what the over-arching theme of the year is. If I were to make-up a theme for 2018, it would be reinvention.
I’m in an inflection point of my life. One where I’m ready to let go of my past and look forward to things to come.
Recap
January-February
I was working at Inform in our new office - a co-working space that felt more like a downgrade. I wanted to line up another job so I could quit.
As a co-worker said to me later, “What are you still doing here?”. Touché.
Traveled to Las Vegas to visit friends and get my TSA pre-check.
Around mid-February, I interviewed and accepted my new place of work. Clear Labs. Hired on as a web developer.
March-May
I started my new gig. Forgot how much work it is being at a start-up, but quickly landed on my feet as we build the software from the ground up.
Traveled to Portland for a quick visit to see friends.
Ended April with a vacation to Norway and Sweden with my friend, Teagan. We saw the fjords, viking ships, and some questionable art.
The Questionable Art Pose
Visited the Color Factory & Ice Cream Museum. Watched my sister graduate college. Found out my co-workers at Inform got laid off.
June-July
Participated in my first Kubb competition. Was dating someone I thought could be good for me…
Got Life Insurance. Really didn’t think I’d need this, but after the financial incentives, I had to get it.
Reeling back from slow heart-ache.
September
The busiest month this year. Married my friends. Watched different friends get married in Colorado Springs. Started dating someone substantial. Went to St. Louis for the 2nd time for the Strangeloop Conference.
October-November
Participated in my very first triathalon. It was a relay, and I did the biking portion. We got third!
This is my last letter for the series, “Seven Degrees of Strangers”. If you haven’t followed the journey, you can check it out on my website. I’ve written about 6 different people I talked to one degree of separation apart.
For those of you who may have noticed an error, the phrase is six degrees of separation, not seven. I would like to say I did that on purpose. I didn’t. I could have lied and said this is to close the loop. To be frank, I was deluded by my title, I thought this would be a great experiment.
Nevertheless, Raina chose a wonderful person last. Someone with a perspective I don’t have, yet we had a fantastic conversation.
Enter Megan Jolly
Megan lives in Portland and met Raina through a basketball camp Raina’s husband was starting. I believe Raina chose to ask me to speak with Megan because of Megan’s vision impairment. She has Leber’s disease, a mitochondrial defect that affects the optic nerve and can lead to blindness. Men are more prone to blindness from this recessive trait, and Megan is one of the unlucky ones in the gene pool. She found out in 2016 when she was getting a new prescription for her glasses. That was subsequently the last time she drove.
Going Blind
Megan isn’t completely blind. She’s got no central vision and about 45% of her peripheral vision. Before her diagnosis, Megan’s life was playing soccer, working in non-profit land, hanging out with friends. And after the diagnosis, Megan still does many of the same things, but some activities are a lot harder. Since Megan doesn’t drive, she relies on public transportation. While service is good in Portland, it takes longer to travel. Also, Megan can’t do some of her finances, so her friend became her power of attorney since the banking website she’s supposed to use has poor accessibility support.
For the first two months, Megan’s life wasn’t going well. A few months in, Megan’s mom found the Oregon Commission for the Blind and got her to sign up.
Oregon Commission for the Blind
The Oregon Commission for the Blind is a state agency with paid staff to help teach the blind best practices by delivering courses. They also help students find jobs. The classes run 4 terms a year and each of them lasts around 12 weeks. These classes range from orientation and movement to sightless self-defense.
The instruction is 1 to 1, tailored for each student. Everyone’s skill level is different, like computer competency. Megan’s an expert at using a computer, so the teacher tailored her education accordingly. Someone with no computer skills would have to start out as a novice, like starting by using a keyboard.
While the curriculum has some general guidelines and best practices, the teachers help with one-off things too. Megan wanted to vote for the upcoming election but didn’t know how to do it. Her instructor and she went to the voting station and the person manning the booths didn’t know either. They investigated and figured it out given some other voting staff support.
The commission’s job is to help the blind reach the point of doing what people normally do. Megan loves to hike, so with her instructor James, she’s been able to hike around. Some spots are a bit tricky than others. She recommends Angel’s Rest if you’re every around Portland want to see an awesome view of the Columbia River.
As I was doing some follow-up research about the organization, I ran across this quote. “The real problem of blindness is not the blindness itself—not the acquisition of skills or techniques or competence. The real problem is the lack of understanding and the misconceptions which exist.” It’s from the National Federation for the Blind. After talking to Megan, I walked away with a better understanding of blindness and how it affects us.
Takeaways
I loved talking to Megan. I was able to learn how her disability does not limit her. She told me how the commission has sightless defense classes, how students there come to learn about blind athlete events such as dragon boat races. She is mentally competent, and would like some kind takeaways for readers.
If you come across a blind person, please ask if they need help before helping them.
Don’t touch them. Introduce yourself and ask them if they assistance.
For my web developer friends out there, please build websites with accessiblility in mind
I’ve opened my eyes to a new kind of awareness by talking to Megan. So if you have the chance, strike up a conversation with a visually impaired person. You never know what you’ll learn.
Acknowledgments
I want to take this opportunity to thank everyone who helped me with this project. This wouldn’t be possible without all of you readers who have stuck with me, even while I went through a few months hiatus. It’s time for me to re-read Steven Pressfield’s “The War of Art”. First, I’d like to recognize Megan Gebhart whose blog turned book, 52 Cups of Coffee, inspired me to write this short series.
Of course, I’d like to call out every person I got to interview. To my good friend, Simon, who helped kick off this series and being kick-ass at what he does and reminds me how much potential we have. To the fantastic Evan whose illustrations elevate the writing and logo that signifies the connections between all of us. To Joe for being such a great storyteller and having such a great philosophy on life. To Mary who gave me a phone call earlier this year and continues to remind me how much connections matter. To Julie for writing a book that read after and uses her last concept as a mantra for life. To Raina for waiting patiently for my piece to come out and for reaching out and being a champion. To Megan for showing me a part of life I rarely get to see. You all have been great guests, and I thank every one of you.
And I thank my family and friends for sticking with this series. Your feedback has inspired me to continue writing. And maybe had to stick around and were forced to listen to me talk about all of my guests. Thank you. You’re the best.
If you’ve been keeping up with me for this long, that means I have some loyal readers out there. Hi, it’s been a while. Haven’t spoken about this project in forever. I’ve had this aching feeling of completing this project for months. Every time I would start, I’d get distracted by something else. A new job, obligations, travel. Needless to say, I had trouble with time management for creative pursuits.
And now I’m back. Ready to tell you about the last two people I interviewed for “Seven Degress of Strangers”. This week, I’ll recall a conversation I had with Raina Evans, last September. Yikes. Raina, if you’re reading this, I’m truly sorry this took so long.
Enter Raina Evans
After speaking with Julie, I asked for someone diverse, with a varied background. Enter Raina Evans.
Raina and Julie’s ex-husband used to work for a youth organization in the mid to late 90s. Her daughter and Julie’s oldest son used to play together and were the same age.
On the day I spoke to Raina, she had finished a nice brunch with her daughter and grandchild at Black Bear Cafe. Raina was radiant. This woman was full of energy, excited to talk about what she does and what she’s accomplished.
Raina’s worn many hats. She is the current owner of Ready to Rent, a program to train residential renters. As the owner of the program, Raina trains the instructors of this program. After speaking to Raina, I only found a glimpse of how rich her life really is.
She adds so much detail through her language and exuberance of how she talks. It showed in our conversation in the tiniest details, like her mention of how her brunch went. I knew this was going to be an interesting conversation.
Ready to Rent
In the early 2000’s, Raina was working at the Portland Housing Center. This organization she worked for ran a training program for first time renters. They called the program “Ready to Rent”. In 2006, the board wanted someone to run this program. They asked around, but couldn’t find someone with the right skill set. They kept getting candidates with social work backgrounds. What they were looking for than management and marketing backgrounds. Putting two and two together, and they looked at Raina’s background and saw a great fit. But the first time the board asked her, Raina refused. They came back a few days later and asked again. And again, she refused. On the third try, Raina relented. She just got married a few months prior and lost her position on the board. The new marriage came with their own children. Raina thought this was the third time, and perhaps this might be her calling.
Raina gave the board one year to try it out. And then it turned to giving it a second year. By the third year, Raina stayed at this position. But the board came back and told Raina they would be cutting the program. The board chair asked Raina if she might want to run “Ready to Rent” as a private entity. Ready to Rent’s curriculum is one of a kind. There isn’t one quite like this. Raina, with the support of the chair, spun this out on her own. To her surprise, the program grew. A lot. Raina took this operation across the US and Canada. She trains instructors to be certified in the program.
By 2010, Raina took the IP from the commission. She’s been working at this for a decade and still going strong.
Memorable Moments
I asked Raina what were some memorable moments she’s had training adults. She gave me two stories.
1
On the big island of Hawaii, the mayor of Hawaii country was amongst the group Raina trained. Raina doesn’t jump into the material on the first day of training. She focuses instead on how adults learn. After that first day, Raina jumps into the program.
The mayor spoke with Raina after the class was over and said, “Now I get it. We’ve been communicating wrong this whole time. We’ve been communication with our people and with clients the wrong way. You taught us how adult learners learn.” The course changed the policy on communicating with others. This was an eye opening experience for the mayor.
2
Raina came out to teach in Sacramento, California. During the first week, she taught city and county workers. The second week, she taught a consortium of agencies. Today, about 100 trainers in Sacramento delivers this curriculum. But it didn’t stop there. The woman who first asked Raina to teach in Sacramento moved to another county. She asked Raina to teach people in the county over as well.
Raina continues to thrive by a viral effect. The cirriculum is effective from years of iteration. People take away a lot from the course. All in all, Ready to Rent continues to grow through word of mouth. As Raina puts it, “the program markets itself.”
3
Raina’s niece and boyfriend had a baby shower. The family’s mother came out from the other side of Mt. Hood. Essentially the boonies. They may be the only African American family in their town.
The mom was talking about how they send clients to Ready to Rent. She asked Raina if she heard of it, and Raina revealed she’s behind it. “You are ‘Ready to Rent’?” Raina proves word of mouth is one of the best techniques in marketing. Also, Raina’s right. The curriculum is so good, it does market itself.
Class Evaluations
One of the requirements of teaching the course is distributing class evaluations. At the end of the course, students fill out class evaluations and get sent back to Raina. This helps Raina gauge how the students and teachers are doing and if the classes are of quality. One of the questions on this evaluation asks the students how prepared they are in renting. The students always respond with similar answers: Yes, they are ready.
There’s also freeform text where the students can give back general feedback. Raina was blown away when she read the student “no longer has to lie on housing apps”. Ready to Rent was taught in prisons, and the inmate had that profound realization.
To circle back to the viral effect, 80% of evaluations show they would recommend the course to a friend. Raina often sees the same feedback. “Everyone needs to take this course”. Former students bring “Ready to Rent” up at church, AA meetings, at work. All over.
Takeaway
Raina’s takeaway message was “you never know what your calling is. Leave yourself open to everything”.
Conclusion
After each interview, I realize I want to continue the conversation. Each person I’ve spoken to for this newsletter have more stories to tell. Many more than could ever fit in a one hour time slot or 300 page biography. And, as I truncated an hour-long interview for you, dear reader, I have no doubt I could write so much more.
At the end of our conversation, Raina told me about a talk show she hosted on local broadcasting. This was back in the late 80’s, and it was called “Let’s Talk with Raina”. Raina was talking about inclusion and diversity. I have a huge interest on teaching diversity to youth and Raina and I could talk for hours about this.
At my new job, because we’re building the project from the ground up. The team decided to move forward with a css-in-js approach, which perked my ears. First I was skeptic. How could this remove my css files? What about psuedoelements and complex selectors.
Having worked with it for three months now, I’m a convert. Those initial skepticisms wore away as I started to write React with styled components in mind. Before I jump into a length explanation, let’s do a starter demo.
Intoduction through exercise
import React from "react";import styled from "styled-components";const Wrapper = styled.div` padding: 1rem;`;const MainContent = styled.div` font-size: 1.2rem; text-align: center;`;const App = (props) => ( <Wrapper {...props}> <MainContent> Lorem ipsum dolor sit amet, vim at quando possim oporteat, eu omnium apeirian argumentum per. </MainContent> </Wrapper>);
This year has been tough. Stressful, hard to bear, testing my beliefs. Yet, for all the negative events, I still found time for finding myself and having a deeper understanding of life.
I have not come out publically to talk about my friend’s suicide. It was painful. And then a ex-co-worker died. Then a family friend. Then my backpack was stolen. After that event, I crashed. My emotions got the better of me. I went hermit mode for a month, unsure if I could come out. But I’m reminded I have friends along the way, helping me through the tough times. I also have the option to seek grief counseling. The world can be cruel. The world can be delightful. Depends how you look at it.
So as I take the time this year to reflect on my list of accomplishments, I also reflect on the unexpected. Here’s my list.
The List
I gave a speech at my friend’s wake. I told a story about the last time we hung out. He told me a crazy story where he met a hangglider while hiking. The glider asked my friend if he wanted to try hanggliding. Of course, my friend accepted. The next day, he’s harnessed with the stranger, and he said he felt so serene up in the air. He fell asleep for an hour. When he woke up, he tapped the stranger and told him how peaceful he felt. The glider said my friend was crazy.
I traveled to St. Louis, Missouri, marking off one more state. 15 to go for my goal of all 50 states before 30.
I wrote two series of newsletters. One on repeated failures. The other interviewing people about communication and connection.
I went to New York within a month time-frame for two different conferences. I’m inspired to be submit a call for proposal for conferences next year.
I watched more films this year.
I attended too many talks and lectures to count, ranging from group biases to the history of women in the Black Panther movement.
Attended the “Papers We Love” conference and got to meet some developers I always wanted to talk to
If this is the first time you are reading this series, welcome. This is a series about communication, connections, and perspectives. My last interviewee, Mary Aipoalani, gave me too many choices on who to interview next. I was in choice paralysis until I received this text from Mary. “You need to connect with her. I just told her about you.”
Attached to the text was a VCard, a digital business card that makes it easy to add them to your contacts list. Or at least in theory it’s supposed to be easy. I had the complication of incompatible file formats. Android phones hate Apple’s VCards attachments. If you ever run into this problem, save the VCard text to a computer and add it to your contacts online. And if you’re a iOS or Android developer, please make this integration easier. Thanks.
Enter Julie Valenti
Julie is alive, energized by the southern California sun. She harnesses that energy and uses it to help people rewire their brains. Rewire metaphorically. Her hidden agenda is by rewiring brains, people will be more alive. And by being more alive, she hopes people can become contributors and producers in our world. In turn, she hopes people consume less.
Let’s step back for a moment. Who is Julie? She’s a new resident of San Diego. She moved here because she’d rather soak up the sun than live in a cloudy and low-lit place like Portland, Oregon. She lived in Portland for the past 23 years. From Portland’s dreary weather, she developed SAD - Seasonal Affective Disorder. When Julie’s friend invited her to come out to San Diego months ago, she knew she had to move there.
Besides sun worshipping, Julie is the owner of Portland’s Wisdom and Recovery Wellness Center. She works with patients who suffer from confusing childhoods. This is post-traumatic stress disorder in childhood. This is a result of bad parenting. The range varies from parents who were abusive, or neglectful, or emotionally taxing.
Julie’s center has been around for over a decade. Julie has been in practice from much longer. Julie is also an author. She wrote a book called “Knowing How: The 20 Concepts to Rewiring Your Brain” based off her practice.
Empty Nest Syndrome
Julie cites one of the reasons to move to San Diego was to be closer to her youngest son. Her son was the last child to leave home. He moved to Los Angeles, and Julie wanted to be able to visit.
I asked Julie what was a mother’s perspective on empty nest syndrome. Julie explains “empty nest syndrome” is a fancy term for grief. When children are around, the mother produces a bonding hormone, oxytocin. When the children leave the nest, the mother stops producing as much oxytocin. A result of the hormonal change is the same symptoms of grief and loss.
The mother must come to her terms with the life adjustment. When neglected, the result is oftentimes a “mid-life crisis”. She withdraws and re-evaluates herself. When recognized, the mother feels it in her body.
The mother must setup boundaries with her children. The child is in a different place with life, independent from the nest. Part of the re-adjustments Julie talks about is developing boundaries with the children. For Julie, she had a conversation with her son in LA. She asked how often they would talk over the phone, how often they would see each other, how much space they needed from each other. Julie wants to make sure she would not suffocate her child.
I asked Julie about empty nest syndrome for personal reasons. My sister, the youngest sibling, has left the nest. My mother hasn’t been dealing with empty nest syndrome head on. Armed with a better understanding, I am tasked with having a conversation with my mom about empty nest syndrome and grief.
Wisdom and Recovery Wellness Center
Julie works with patients who suffer from PTSD introduced from childhood. She spends every two weeks in Portland to help with logistics for the center. When she’s back in San Diego, she takes clients remote. When Julie is on-site, she is also training staff members.
To be clear, Julie is not practicing traditional psychotherapy. That means, clients do not come in and lay on a couch for an hour every week for the rest of their lives. Julie is a licensed hypnotherapist. She wants her patients to heal and be less dependent of a therapist. Stop going altogether.
Neuroplasticity
“You can’t teach a dog new tricks.” This is not true. Brains are not fixed after a certain age. Recent research shows neurons that fire together wire together. The result is neuroplasticity, an ability to rewire your brain. By taking the time to learn or un-learn, the brain will form neuropathways that forms new habits.
Carol Dweck wrote a book about this called “Mindset: The New Psychology of Success”. In the book, Dweck describes and differentiates between fixed mindsets and growth mindsets. Dweck talks of people with fixed mindsets are less prone to take risks and fail. She talks about how people with fixed mindsets shut down after unable to do specific tasks. On the contrary, people with a growth mindset allow for failure and learn from mistakes and try again. In reality, everyone is a little of both. We allow for failure in some aspects of our lives, growth mindset, and we are set in our ways in others, fixed mindset.
Julie uses this understanding of neuroplasticity to teach her clients they have the ability to change. With some guidance and practice, the client will be able to re-wire their brains.
Rewiring Communication
I had the chance to read Julie’s book on a plane ride from San Jose to St. Louis. The book is for people with a confusing childhood and therapists. I would make the case the book can also be for people who don’t have a confusing childhood. I recognize I struggle with some of the concepts.
The 20 concepts are tools to help arm the reader. Julie writes about each concept by going into examples of how the concept applies. At the end of the concept, she supplies a self-assessment. The self-assessment asks the reader questions. These questions help solidify their understanding of how the concept relates to them. I have not finished through the self-assessments on my first reading, and will return to them.
Many concepts apply to the reader’s efforts in dealing with tough decisions. By giving alternatives to dealing with these situations, the reader can build habits. Or unlearning habits that have been ingrained since their childhood. After reading the book, Julie hopes the reader asks themselves the big questions. What they are doing in the world? Why do they do what they do based off their hardwiring? What they can do different? How to go about doing different?
Betty is at home, making dinner for her husband James. She’s had a stressful day when her car broke down. She wants to ask James about buying a new car when he gets home. Betty hears James come in and welcomes him home. James has a frustrated look on his face and tells Betty he can’t talk now. James proceeds to the living room, sits down, and turns on the television.
Betty’s confused and frustrated. As mentioned, Betty was expecting James to come home and talk to her. Now that her expectations are thwarted, Betty must face her own thoughts and emotions. Betty has yelled at James in the past for similar behavior before. None of the previous encounters have ended well. Betty takes a breath and reviews the 5 part communication formula.
Observation
Betty takes an objective view of the situation and reviews the events. Betty was making dinner and she noticed her husband came home. He looked frustrated and told Betty not to talk to him.
Thoughts
Betty thinks this is rude. Betty thinks this is a form of rejection, and thinks James doesn’t love her.
Feelings
Betty feels rejected, sad, depressed, confused.
Analyze Desires
Betty wants James to talk to her when she comes home.
Participate
Now that Betty has followed the first four steps, she can recount that to James when they both have calmed down.
“James, I’d like to bring up what happened earlier. I was making dinner and noticed you came home. You looked frustrated and told me not to talk to you. I thought this was rude. I thought this was a form of rejection and thought you don’t love me. I felt rejected, sad, depressed, confused. When you came home, I wanted to be able to talk to you. I wanted your attention because I’ve been alone all day. Are you willing to talk to me when you come home?”
At this point, James could counter with something else. He needs time to calm down from his day at work. The important thing is the conversation has started. Each party can reach a point of compromise. Also, James understands Betty’s perspective, so he is primed with an answer or counter.
With practice, Betty can get better at communicating with others. She can work through her thoughts and feelings and let others know what she is going through. Betty is a metaphor for people who go through similar situations. Betty is a metaphor for situations I’ve found myself in.
Adult Responsibility is Non-Negotiable
Julie grew up in Idaho. Her mother had an addiction to pain killers. Her mother’s addiction affected how her children. Julie’s upbringing and relationship to her mother was toxic. Julie writes how her mother’s dependence to legal drugs created problems at home. When the drugs were there, Julie’s mother was fine. But when the drugs weren’t, Julie’s mother would turn into a different person. Julie thought she had to take care of her mother, and became the caretaker for her mother.
It wasn’t until much later Julie understood the impact. Her relationship with her mother resulted in bad behavior and life choices. For example, Julie was in a relationship where her partner was an addict. Julie played the rescuer to her partner and created a co-dependent dynamic.
Julie made decisions to change her behavior. She studied issues in parent-child relationships. She was able to develop a framework to help her re-wire her brain.
Julie sees traditional therapy as ineffective. Some therapies continue for decades without lasting results. Patients come back, lie on the couch, and talk out their issues to their therapist. Rinse and repeat for years to decades. It feels like all the therapist is there for is someone who will listen, for a hefty sum. Sounds eerily familiar to the co-dependent dynamic.
At the end of the book, Julie’s last concept is “Adult Responsibility is Non-Negotiable”. Say there’s a situation you have had a tough time dealing with. Like having a conversation with a complete stranger. Or getting angry over things out of your control. What do you do now? You take the high road. You act like an adult because you’re an adult. This is my personal take on the book - of being able to liberate yourself. It’s not an easy road for all. For some, it will take time and practice. Julie’s hope is if you’re not able to take on adult responsibility, it is your duty to get to that point.
Takeaway message
Julie’s takeaway is to understand and resolve your childhood trauma. Resolution may come in the form of rewiring your brain.
Promotion
I read through Julie’s book and recommend it. I want to giveaway one free copy of Julie’s book to one of my readers. To enter, reply to this email and tell me what you think of this series so far. If you read this on my social media links, subscribe to the newsletter. New subscribers will be added to the contest. You have one week to apply. Deadline is December 18th, 2017, 12AM PST.
If I have perked your interests with childhood trauma, please buy Julie’s book. If you’re interested in joining a reading group, let me know. I would love to continue the conversation.
Last week, I wrote about my interview with Joe Lazzara, owner of Joe’s Butcher and Fish Market. This week, we’re reviewing the core theme of the series: connection. If you’re new to this newsletter series, I’m interviewing strangers one degree of separation at a time to chronicle connections. And there’s no one better to talk about connection with none other than Mary Aipoalani.
Enter Mary Aipoalani
I had no background on Mary when I asked her to be my next interviewee. I called her a few days before our interview to schedule the meeting, and immediately, I knew I was going to enjoy our conversation. She exuded a lot of energy in her voice. It’s as if she was ready to take on the world and ready to jump on any opportunity.
Mary met Joe through work. Mary is the VP of Product Development at Renaissance Food Group. She met Joe on a business trip to Indiana. Although her company does not sell their products at Joe’s butcher shop, she struck a great conversation with Joe. Mary knows the who’s who in the food industry. When Mary’s work brought her to Indiana, and she could tell the city’s placed a lot of capital building their downtown. She spoke to Joe for two hours about her products, about his shop and life, and the competition he faced. Mary has an eye for marketplaces that sell well.
Mary came from humble beginings in Michigan. She grew up on a farm and her food was her family’s language. She and her husband travel around all over the US, selling and managing food products. From what I can access, Mary is a busy person. Yet, as I find out, Mary makes time for people. Case in point, during our conversation, she was driving her daughter to an appointment.
Storing Contacts
If you’ve read Malcolm Gladwell’s book, “The Tipping Point”, Mary’s a prime example of a super-connector. A super connector is someone who keeps a record or memory of a lot of different people. They connect people who don’t know each other but have mutual benefits. The average person keeps tabs with about 150 people, also known as the Dunbar number. Mary keeps tabs with so many more people. She’s able to do this by her system on how to connect with people.
I was super interested in Mary’s system of recording contacts. Mary explains it to me with Joe as an example. After Mary finished talking to Joe, she writes down additional information about him. She may write, “Joe’s Butcher Shop and Fish Market. Spices and seasoning blends. Carmel, Indiana.” The description can inform Mary that Joe knows how to season meat, and if Mary needs help, she can call him. She may also synthesize later other vendors that might want to work with Joe based off the store name.
Entrepreneurs work on connecting, Mary tells me. They figure out people’s capabilities. At the end of chatting, I mentioned some opportunities I’m looking for. Mary was able to take that information and come up with a few names I could collaborate with. She connects people with head hunters. She elects them to be advisory board candidates. She pairs them with a founder. Mary’s theory is when the student is ready, they have to find the right teacher. If you’re past step one of identifying your problem, step two is to talk to Mary. Check with her if she knows someone in her network. Mary works like a matchmaker and marries the student with the teacher.
I’ll admit, I’m not the best at keeping notes or tabs on people. I try for a little while until I’m discouraged from making any headway with others. I am pessimistic in trying to get people to do things. But I can reframe my position. I can think, “how would Mary approach this?” I would try to get people together who don’t know they need to reach out to each other. If nothing comes out of it, that’s that. But for the few times it does, innovation can happen.
The World is Ripe with Opportunity
Mary sees opportunity. She can’t help it. Her family is a group of entrepreneurs. When I asked Mary who I should speak to next, she recommended her brother, Ed Dominion. It was amusing she referred to her brother as D6, the first letter of their last name followed by their birth order. He runs his own company in Portland, Oregon. Mary runs businesses on the side. For example, she has a high performance camera company. She is starting another venture called Animal Bacon.
When it comes down to it, Mary’s journey reminds me of the protagonist in “The Alchemist”. Mary’s journey is wandering, yet focused on goals. And at the end of goals, that’s not the end of the journey, but the beginning. We talked hypotheticals. If Mary wanted to go to the White House, she’s pretty sure she could go with little to no credentials. That’s because she thinks that in her mind.
Mary learned a long time ago the importance of connections. When her father died, the funeral was packed. People came all over to visit her father. Her father was a man who could walk up to anyone and strike a conversation with them. He would listen to them and try to help in any way. Because the paper wrote about his passing in the paper, people picked up on his passing from all over and came to visit him. That made an impact on Mary, and it’s shaped her to be the way she is today.
And she doesn’t believe in coincidences. Life is nothing buy coincidences. And that’s led to successes. Action comes first. Things are not handed over to you. She gave me some strategies in optimizing the search for opportunities.
Traveling is a great way to make connections. You’ll listen better with fewer distractions.
Dress Appropriately. Don’t wear sweatpants. Dress up. Why? Because people judge you by your appearance. If you dress in business attire, you will attract business people.
Be Interested in people. Ellen DeGeneres does it for a living. You can do it for yourself.
Record people you meet. Everyone has a different strategy of this. You can go with Mary’s, like I described in the last section. Or you could use Twitter and follow handles. It could be rolex based, if you’re into paper.
The Game
Mary travels a lot for work and could spend her time eating alone. But she refuses to. Instead, she’s come up with a game.
Mary enters a restaurant and looks for the bar. She scouts the bar to see if people are there eating alone. This has to be someone who’s eating alone who’s towards the end of their meal. She will sit next to this person and wait for the bartender. When the bartender comes over and asks Mary what she wants to eat, she turns to the person next to her. This is the same person she scouted for when she entered the restaurant. She asks this person, “Oh, that looks delicious. What are you having?”. The person responds with the name of what they’re having. Then, Mary asks the ultimate question, “Can I have a taste?”. Every single person has given her a sample, if not the rest of the plate, of food. Inevitably, this turns into a conversation.
The goal is to have a better experience than to eat alone. If Mary can have a conversation with someone, she will try to. She’s proven to friends and family this game works. She’s even had her daughter do it once. Mary’s daughter isn’t embarrassed by her mother, as I thought. Instead, her daughter has a role model who is brazen and bold to approach strangers.
Mary told this to an Uber driver once. He said, “You inspire me.” He is sold on the experience. I am sold on the experience. The next time I’m traveling and am hungry, I’ll run through the game.
Mary’s pitched this idea to television producers and they say she could get a TV show deal. It sounds appealing because it acts on our human tendencies to want to connect. And she doesn’t do it to flirt with strangers. Mary’s more interested in the stories people have to tell.
Takeaway message
Take the opportunity to reach out to people. And Mary has a saying to go along with this. “Stop looking at your glass, get off your ass”. Her daughter was listening to the conversation, and told me she couldn’t say that last word.
Mary says in the younger community, boys are always on their glass. It is important to move your ass. It can be exercise, smiling and making eye contact with other people, or working on body language. That’s how she sees life.
Side Tangent
Years ago, I visited Budapest and hung out with a friend of a friend. She surprised me by bringing me to the river across from the parliament building during sunset. It was the most magical moment of the trip, and we attempted to open a bottle of wine. We clicked glasses took a sip, and she asked me, “So, Jeremy, what’s your story?”. The question confused me.
“You mean, what do I do?”, I asked.
“No, like what’s your story. Everyone has stories.”
I understood, and told her about the beginning of my trip, the tragedy that had befallen my family. I started to cry. Both for the tragedy as well as for my friend who listened to my story. That was one of many turning points I found in the power of conversation and of listening.
My journey so far has been to listen to others’ stories, to listen to what matters to each of us. If there’s anything I’ve learned from my friend in Budapest is the power each of us has to listen. When Mary tells me the opportunity to reach out to people, I remember this period of my life I didn’t do it. I lived oblivious, not connecting to the people around me. Mary’s takeaway is reinforcement for me and invigorates me to continue this project. I’m glad each stranger I’ve talked to has given me something special, and I hope you have enjoyed this series so far. See you next week for more stories.
Author’s Notes
I lost half of our conversation. Mary was driving through poor cell service areas, so the call dropped many times. For the last part of the interview, I couldn’t record it so I transcribed notes. As my luck would have it, my notes were stolen along with my backpack. I’ve chosen to omit this conversation because my memory is impartial. And to be frank, I can’t remember what we talked about.
Welcome to the Jear Bear Letter’s third letter of the series “Seven Degrees of Strangers”. If you’ve started reading this series, I interview a stranger one degree of separation at a time. This week, I’m presenting a conversation I had with Joe Lazarra. He runs a butcher shop and fish market in Carmel, Indiana. He also happens to be the previous interviewee, Evan, father’s best friend.
Joe has walked an unconventional path. We dive into his past work, his butcher shop, and so much more.
Enter Joe Lazzara
I wasn’t expecting Joe to be a masterful storyteller. If you ever talk to him, he has a very solid sense of self. He started his story by transporting me back over a century ago. His great grandparents grew up in Sicily. Different invaders have conquered Sicily time and time again. So much so that other Italians call them outsiders. Sicilians have a different dialect and different culture. They value family, culture and food. Especially food.
Joe’s grandparents and their brothers sold produce in California and southern Indiana.
Their lives included stories of escapades, murders, and running from the KKK. If I ever get to hang out with Joe, I’d love him to tell me some of them. What’s important to Joe is the Sicilian heritage followed them to America.
Joe’s mother learned recipes passed down from the older generation. Joe’s aunt taught his mother how to cook, handing them generation to generation. Needless to say, the family bonds over food, like Joe helping make the sauce.
Joe is youngest of 6 children. There’s an 18 year generational gap between his oldest brother and himself. Because of that, his father, his eldest brother, and he are born in different generations. His father was born in the 20s, his brother in the 40s, and Joe in the 60s.
Joe’s father didn’t make much money. Yet, he valued education and funded all 6 children through college. He knew that going to college is important. He didn’t have a large house. He made sure none of his children never paid a dime. Joe’s very fortunate and grateful to his father.
College and Early Career
In college, Joe met Charlie Roar, Evan’s dad. They became dependable friends and fraternity brothers. Today, they remain close. Joe is a godfather to Charlie’s daughter. Joe’s a part of Charlie’s family as they moved from Chicago to Minnesota to North Carolina. When Joe’s father passed away, you can bet Charlie was there for him and his family.
Joe studied Quantitative analysis, which during the mid to late 80’s, was the thing to study and get a great job. When Joe graduated, he worked at Indiana Bell on a software project. That project got sold to General Telephone and Electric, GTE. But, Indiana Bell didn’t want to help with maintaining the software.
GTE needed consultants. Joe’s co-workers and Joe saw this as an opportunity to create their own consulting company. They formed United Informations Technology. Joe was 23 at the time and moved with the company to Tampa Bay. On weekends he’d invite friends. The job demanded Joe travel all over. With the sales commissions, Joe was making 6 figures. But the company’s success didn’t last long. The company hired an HR manager to manage pensions as they started growing. But, no one else knew this HR manager would take their pensions and buy coke in Florida and resell it in Chicago. One day, the FBI and DEA knock on Joe’s door asking about the illegal activity. Joe exits as soon as he can; the company gets dissolved.
Joe took a position with GTE in Indianapolis selling cellular to wireless carriers. The market was ripe for cellular networks, and selling was like shooting fish in a barrel. Year over year, Joe was the top 1% of sales people. He rose the ranks and became a general manager over other sales people.
During this period, he got married and had kids. He’s in his early 30’s, and he’s traveling all over the U.S. for his sales job. He got tired of going out to the bars with his guy friends. Instead, he uses this time to explore restaurants. Today, many of these restaurants have Michelin stars or are James Beard candidates. Those are prestigious accolades in the food world.
Joe told me a story of how he met Emeril Lagasse before he was famous. He was in New Orleans. Charlie’s cousin invites Joe to meet Nellie Brennan, owner of Brennan’s restaurant. Nellie brings them to the Commander’s Palace to meet the head chef, who turns out to be none other than Emeril. This was right before he opened his flagship restaurant. Well before he was a Food network celebrity.
Joe meets Susan Spicer before she became big at the Bistro at Maison de Ville. Some of these restaurants catch wind of Joe, thinking he was a food critic. They would invite him at the Chef’s table if he called. When they found out he was only a food enthusiast, they laughed and would cooked up a storm. It was during this time Joe’s food and wine palette expanded.
GTE gets bought out by Bell Atlantic and forms Verizon. Joe becomes in charge of the telecomm act where he has to negotitate contracts on behalf of Verizon. He has to travel even more. In 1999, Joe quits to join a telecomm start-up in Indiana, First Mile Technology. The company was ahead of their competitors.
Business was going well. Then 9/11 happened. VC capital dried up. Joe had a tough time getting developers to invest upfront because they didn’t have the money. Joe left and consulted for a bunch of small companies.
After that, he consulted for a few years. But Joe grew tired on traveling around. Clients were asking Joe to do things that tested against his principles. For example, they asked him to move phone numbers around, move money around, and lose trails. He sought solace from his brothers and Charlie. They reminded him of wanting to start a restaurant or be in food.
Butchershop
Carmel, Indiana is a progressive city and their mayor wanted to build a city center. The mayor asked Joe if he wanted to start a restaurants there. When Joe asked his wife, she objected. She told him they have three children, ages 3, 5, and 7, and he wouldn’t be there for them at night. Joe remembered his friend, Mark Zannoni. He was also Italian, and Mark’s father owned a butcher shop outside of Chicago. Joe asked his wife about a butcher shop, and she agreed that would be a better choice.
They put about a year of work into opening the shop before it opened. The first year’s return was at a loss, but since then, they’ve been on the up. They’re netting a few million a year, and it has become such an integral piece to the community. Joe’s been at it for 11 years. You can find the butcher shop and fish market’s website at the end of the article.
There was an old couple that used to shop at Joe’s butcher shop weekly. They loved talking to Joe and the staff. One week, Joe noticed the husband stopped coming. The next Saturday, she came in early, right after the opening hour. She walks through the entrance, dressed top-to-bottom with a red dress.
Joe asked the lady where her husband. The lady leans over the counter and tells Joe her husband passed away. Joe tells her he’s sorry to hear, but the lady stops him.
“I came here to tell you. We loved interacting with you and the staff. Coming here for the past 5 years made him happy.”
Of course, Joe’s ready to melt after this. It’s situations like this that has taught him he’s the caretaker of community trust. He’s seen customers have babies who have now grown to become pre-teens. He caters to community member’s funerals.
Joe tells me it’s not about the money. It’s all about giving back to the people. It’s the satisfaction knowing you are delivering the turkey to your customer’s home during Thanksgiving. Early on, Joe wanted to franchise the business and build many “Joe’s Butchershops”. Now, Joe wants to make his shop iconic, like Ann Arbor’s Zimmerman’s Deli or San Francisco’s Ghirardelli’s Square. Carmel is an up and coming, affluent city, about an hour or two away from Indianapolis. People from all over the state come to visit the butcher shop.
Joe picked the right location, and he owes his success to his background in sales. Without it, he couldn’t see a different side of business. One where the customer gives you feedback and where you listen. Joe’s mission is to share good karma, because things come back. And he can’t see himself doing anything else.
“I sleep at night. I sleep like a baby, for the most part. Whereas before, I was always concerned about the next sale, or how I was going to get that revenue stream.”
Takeaways
Joe’s takeaway makes a wonderful quote. “Love unconditionally, and you will be returned with unconditional joy.” Very humbling.
If you missed the newsletter last week, I started a new writing series. In this series, I interview one person a week, one degree of separation from the last interviewee. The theme of each talk is about connection and communication. This is the second installment of my series about connections and communication.
In the last newsletter, I talked to Simon Gondeck, a young Web Developer and Entrepreneur. This week, I’m talking to Evan Roer, Simon’s close friend. We talk about how he landed his design job, working for clients, and what Evan’s favorite font is.
Enter Evan Roer
The first thing I wanted to know about Evan was how did he know Simon? As Evan recalls, he’s known Simon and Sevy, Simon’s twin brother, for as long as he can remember. Growing up, their families were part of the same gourmet club. Years ago, Evan’s family moved to North Carolina. Evan was in third grade, yet the families kept in touch. For example, Evan’s older brother is roommates with Simon’s older brother. And, if Evan’s traveling to Minneapolis, which happens once or twice a year, he’s staying with Simon.
Evan resides in Raleigh, North Carolina. He works for Design Dimension, a design firm specializing in exhibit design for museums. He started this job over a year ago and has an unconventional story on how he got there.
Landing the Job
Evan was a brand ambassador at North Carolina State University. That means Evan would prepare the university’s recreation center with school events. The school designates brand ambassadors 13 mandatory office hours to do prep work. But as Evan learned, it doesn’t take that long to set up tables and handout merchandise. With this idle time, he noticed peers making posters in the gym promoting upcoming events.
Evan wasn’t studying graphic design. He was studying business marketing. He wanted to follow a creative itch and make posters. As Evan puts it, he got to see graphic design in the works. He would create posters, learn the tools from Lynda.com tutorials, and develop a portfolio. With his boss’ permission of course. By the end of Evan’s college career, he had an extensive portfolio.
After graduating, Evan was looking for a job. Evan applied to design studios and businesses seeking his skills in Business Marketing. One of those design firms he submitted his portfolio to was Design Dimension.
Evan got an internship with a tech firm. He said the office was decorated like a Silicon Valley start-up. A week or two later, Design Dimension called him. He thought it would be worth a shot at the interview since his current role may not hire him full-time. It was convenient his internship was five buildings away from the Design Dimension.
Evan was the only candidate without a design degree. He meshed well with the firm’s lead designer, Betsy, his future boss. She liked Evan’s portfolio, and even more, his tastes and preferences in beer and music. And it helped they both went to the same school where Evan’s fraternity had close ties to Betsy’s sorority. Betsy likes to blast music in the design studio. Whoever she had to work with would have to be tolerant of that. The candidate had to mesh well with her. And Evan sure did.
Design Dimension
What does it mean to be a professional designer at Design Dimension? From Evan’s perspective, it sounds like a lot of work. He could be juggling many clients at once. “People don’t like to read long paragraphs”, he tells me.
For example, Evan could be working for a Botanical Garden. The job could be to layout a design for explaining photosynthesis. Evan’s work is to take the given space and design the entire experience. Evan knows the exhibitors don’t want to read a barrage of words when they can see pictures.
I thought back to my recent trip to the American Museum of Natural History in New York. The museum had a forest canopy exhibit. There was some text to go with the massive forest installation. But the text was not important to me. I was in awe of the size of the trees with its intricate details. The text is an example of hidden design, open to the curious but not distracting to others.
Restraint
Being a designer means knowing when to restrain. Evan will try to push his client’s brand. For example, a Town Hall, the Opera House in Sumter, NC, or small companies. But if he’s working for an established corporation, like IBM or the Raleigh-Durham International Airport, he will stay within the boundaries of their existing brand.
Restraint also comes to play with dealing with clients. Evan may have clients where his clients want to be the graphic designer as well. The feedback sounds more like barking orders. If he finds himself arguing with a client, and the client is wrong, he has to find a way to come to a compromise. “And that’s what pushes you as a designer”, he tells me.
Clients
In general, the clients come with the content. It’s Design Dimension’s job to make it presentable. And the clients are super involved from start to finish. When Evan was working for a “Black History of Wilson” exhibit in Wilson, North Carolina, the clients wanted to pack as much information as possible. But, it doesn’t tell a story. The client is wrong, and it’s Evan’s job to convince them to change their content by selling them on the design idea.
The work can be rewarding. Evan worked on a children’s museum in Wilson that teaches science and history. Before the design firm came in, the museum was outdated, a relic from the 80s. The museum’s administrator secured the funds to update and upgrade the space. and Evan’s team worked with the administrator to come to a good design. When it was all said and done, this space was resurrected, brought back to life with updated science. And for the administrator, her reaction was priceless because she put her heart and soul in it.
Feedback
It’s only recently Evan’s had interactions with the client. A theme from last week’s newsletter was feedback and criticism. I wanted to know how Evan deals with those themes. Evan tells me it pushes you to be better. You have to be able to speak the same language, and rarely does one design iteration is enough. As a great designer, you have to be able to let things go. Even if Evan thinks one of his logos looks damn amazing, the client could reject it and have the whole process start over. Evan’s learned to let that go.
Takeaways
Evan’s takeaway for you is to make connections in life. Everything’s connected in relationship to each other. And to find those and be able to point those out is a fun thing to do. Put yourself out there. Make connections.
Random Tidbits
After our interview, I hired Evan to create illustrations. Credits to Evan for the letterhead and accompanying illustrations for each letter
Evan loves discovering music, new and old. His favorite music festival is Bonnaroo in Tennessee
Welcome to the next installment of the Jear-Bear Letters. After a half year
hiatus, we’re back with a new series called “Seven Degrees of Strangers”.
The title is a play on “Seven Degrees of Separation” where you are at most
seven links away from knowing any random stranger on Earth. So if I met a
stranger on the street, I could trace them to at most seven degrees of
separation until I found a connection.
Over the course of the next 7 weeks, I will write about the conversation I
had with 7 people, each one degree of separation away. I’ve chosen
communication as the theme for each conversation, trying to understand what it
means to communicate to each other and how can we build connections when we
don’t know the stranger. You’ll get to hear their stories and experiences, and
how I relate to them.
Why are you doing this project?
It started with a thought about connections. On LinkedIn, you can see
potential new friends who are second or third degrees of separation. I
wondered, who are these people? How does everyone know each other? If I
continue down the path of separations, could I meet someone famous?
Then in May, while I was conceiving the idea for this series, I went to a talk
with Bill Burnnett and Dave Evans. They are professors at Stanford who wrote a
book called “Designing Your Life”. In their talk, they asked everyone to turn
to their side, speak with their neighbor, and ask them something you need help
with. I turned to my neighbor, we introduced ourselves, and I asked about a
question about appropriative technologies. She didn’t have any tips, but she
knew someone who could direct me to who might.
I pondered about the interaction for a week. It’s not an everyday feeling for
me to ask for help from strangers. Even though the woman didn’t know someone
directly, she knew of someone who could get me closer to my answer. This
project is my exercise to practice that power of connectedness.
Throughout the series, we’ll find out what connectedness means to other
people. And build a new connection by the end of our conversation.
The First Degree of Separation
To begin this series, I reached out to my friend, Simon Gondeck. He’s an
entrepreneur and web developer for his own consulting company,
MG Web Partners. Besides catching up with an
friend, I wanted to probe him about starting a company. Simon did not disappoint. In our conversation, he went over that and so much more.
Enter Simon
Simon’s a recent grad from the University of St. Thomas with a B.S. in
Accounting. I met Simon three years ago at a software bootcamp. At the time,
he was on his summer break; he was one of the younger members of our cohort. He clicked with me because I grew up in the Bay Area and he wanted to know if I knew G-Eazy. I didn’t, but I know people who knows the rapper, and Simon kept asking more questions about the Bay Area.
And I loved Simon’s enthusiasm. We paired programmed a few times and hung out
outside of the program. I got Simon to join our final team project where we
created a social network for grieving. Simon was a total team player and
whooped my ass into gear when we took a break at the gym.
Simon’s an athlete and spent his college term playing lacrosse player.
Unfortunately, at the time we were talking, he was recovering from an injury
when we had the interview. I realize that he’s a person to go to for my
atheletic questions, so in the future, I’ll be reaching out to him more.
MG Web Partners
After the software bootcamp, Simon returned to school, living in St. Paul,
Minnesota. He got a part-time job working at a web consulting company. While on the job, he discovered he was compensated far less than the contract stipulated.
An epiphany came when he was at a yoga class. The studio were in need of a
website, but all of the contractors they found were out of their budget. Simon and his friend Johnny and he drafted a reasonable offer, and they got their first contract. MG Web Partners was born.
Lessons on Starting a Business
Before their first contract, Simon and Johnny had little to no knowledge on
how to draft one. They looked online to figure out what a contract should say.
And contracts weren’t the only thing they had to figure out for the business.
Simon brought on his twin brother, Sevy, to help out with growing the
business. One of their challenges the team faced was to find more customers.
They drove around the area, going business to business to attract more
customers. They sent out an email campaign last June, seen below.
My partners Johnny Mulvahill, Sevy Gondeck and I have started a web design
and development company called MG Web Partners.
We specialize in building businesses remarkable websites that deliver new
customers and drive revenue.
We help three kinds of companies:
Companies with outdated websites
Companies with poorly designed websites
Or Companies that just need a new website
Most companies fit one of these three scenarios, so if you know of anyone,
please forward them my contact information and I promise we’ll take good
care of them.
Simon was hesitant to use email marketing and social media because he viewed
it as mass spam. He didn’t want disinterested people to see his work, and
worse, find he was bombarding friends and family with unnecessary mail. Sevy
convinced Simon to reach out and not worry about that. What you write will
have no interest to some people, and a lot of interest to a few people. You
never know who those people are until you cast a wide net.
Listening to Simon talk about his business reminded me how much we learn on the job. When we talked about the details of drafting proposals, Simon talked about the mistakes he previously made. For example, it’s better to draw up a proposal that’s less stringent and allows for flexibility with the client. And it’s better to make the process transparent, so the company uses
Proposify, a website that allows clients to review proposals while also giving the business insight into how their clients are reviewing their proposals.
Upon reflection, Simon says the best strategy that attracted the most customers was word of mouth. In the business of contracting, referrals matter more. Having previous clients tell potential future clients of their work has been more substantial than other techniques. And with every new client, the business learns they learned something new.
And while we’re on clients, how do you communicate with them? Simon has found the best way is to make a phone call or face-to-face. Texting and email interactions are easy to evade and do not convey the same tone as his voice.
After the customer signs off on the proposal and agrees to the timeline, the team gets to work on the project. After the first design iteration or prototype, the team shares it with the customer to review. The team has learned that it reduces the amount of time on wasted work if there’s less guesswork on details.
What’s Next?
The team has worked with clients all over the area. All of the team members have graduated college. Sevy will be leaving the company later this summer to join Deloitte. Simon still plans to growing this company, and getting the formula right before bringing more people on.
Questions for me
After our conversation about MG Web Partners, Simon turned the tables and asked me a few questions. The benefit of being a first connection is they already know something about you. And in Simon’s case, he’s a long time reader of the Jear-Bear letters, so he had some questions around writing and growing an online presence.
On Writing
Simon asked some advice about creating a writing habit and how to get through
writer’s block. One of his goals is to boost
his company’s blog by writing more
frequently. I had a few recommendations for him.
Write a minimum amount every day. I choose a page a day.
Read “Bird by Bird” by Anne Lammont, or at least the chapter on “Shitty
First Drafts”.
Don’t be afraid to delete. This one took me a long time. In fact, while writing this section, I deleted half of my work because it didn’t matter.
Don’t expect success. As counter-intuitive as it may be, that piece of advice helped me release what I consider terrible writing to my letter friends. A few of those letters have been very well received, like my “Caltrain Suicides” letter and my “Lost Keys” letter.
Editing is just as important as writing. And its corallary: Polishing takes more time than writing.
Find peers to review your writing. Earlier on in my letter writing, I decided to open up each letter for critique.
I reached out on Twitter to see who could be my critique, and a few people
helped me. I’d send a draft out, and they would give me some helpful criticism.
Take-aways
I asked Simon what’s one thing he wants people to take away with.
Over-communicate with clients. It might not always be clear what they want.
Don’t do it over email. Do it over the phone or in-person, if you can.
Next Week
At the end of each interview, I asked the participant to choose the next person for me to interview. At first, I was loose on criteria, but as I progressed with each interview, I decided to give the participants a question. Who is someone you know you would like to hear an interview from?
I didn’t get to ask Simon this question, yet he knew intuitively I was looking for someone interesting. And he didn’t disappoint. Hope that’s tease enough for you to continue reading.
Acknowledgements
I’d like to thank Simon Gondeck for being the very first participant. Without you, I wouldn’t have started this journey. I’d also like to thank Evan Roer for illustrating the series’ letterhead and an accompanying graphic for this letter. Both of you rock.
Brace expansion is used to generate arbitrary strings. The specified strings are used to generate all possible combinations with the optional surrounding preambles and postscripts.
Usually it’s used to generate mass-arguments for a command, that follow a specific naming-scheme.
:!: It is the very first step in expansion-handling, it’s important to understand that. When you use
echo {a,b}$PATH
then the brace expansion does not expand the variable - this is done in a later step. Brace expansion just makes it being:
echo a$PATH b$PATH
Another common pitfall is to assume that a range like ”{1..200}” can be expressed with variables using ”{$a..$b}”. Due to what I described above, it simply is not possible, because it’s the very first step in doing expansions. A possible way to achieve this, if you really can’t handle this in another way, is using the ”eval” command, which basically evaluates a commandline twice: eval echo {$a..$b} For instance, when embedded inside a for loop : for i in $(eval echo {$a..$b}) This requires that the entire command be properly escaped to avoid unexpected expansions. If the sequence expansion is to be assigned to an array, another method is possible using declaration commands: declare -a 'pics=(img{'"$a..$b"'}.png)'; mv "${pics[@]}" ../imgs This is significantly safer, but one must still be careful to control the values of $a and $b. Both the exact quoting, and explicitly including “-a” are important.
The brace expansion is present in two basic forms, string lists and ranges.
It can be switched on and off under runtime by using the ”set” builtin and the option ”-B” and ”+B” or the long option ”braceexpand”. If brace expansion is enabled, the stringlist in ”SHELLOPTIONS” contains ”braceexpand”.
String lists
{string1,string2,...,stringN}
Without the optional preamble and postscript strings, the result is just a space-separated list of the given strings:
$ echo {I,want,my,money,back}I want my money back
With preamble or postscript strings, the result is a space-separated list of all possible combinations of preamble, specified strings and postscript:
The brace expansion is only performed, if the given string list is really a list of strings, i.e. if there’s minimum one ””,”” (comma)! Something like ”{money}” doesn’t expand to something special, it’s really only the text ””{money}””.
Ranges
{<START>..<END>}
Brace expansion using ranges is written giving the startpoint and the endpoint of the range. This is a “sequence expression”. The sequences can be of two types
integers (optionally zero padded, optionally with a given increment)
characters
$ echo {5..12}5 6 7 8 9 10 11 12$ echo {c..k}c d e f g h i j k
When you mix these both types, brace expansion is not performed:
$ echo {5..k}{5..k}
When you zeropad one of the numbers (or both) in a range, then the generated range is zeropadded, too:
$ echo {01..10}01 02 03 04 05 06 07 08 09 10
There’s a chapter of Bash 4 brace expansion changes at [[#new_in_bash_4.0 | the end of this article]].
Similar to the expansion using stringlists, you can add preamble and postscript strings:
When you combine more brace expansions, you effectively use a brace expansion as preamble or postscribt for another one. Let’s generate all possible combinations of uppercase letters and digits:
Brace expansions can be nested, but too much of it usually makes you losing overview a bit ;-)
Here’s a sample to generate the alphabet, first the uppercase letters, then the lowercase ones:
{% assign special = '{{A..Z},{a..z}}' %}$ echo {{ special }}A B C D E F G H I J K L M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n o p q r s t u v w x y z
Common use and examples
Massdownload from the Web
In this example, ”wget” is used to download documentation that is split over several numbered webpages.
”wget” won’t see your braces. It will see 6 different URLs to download.
See the [[#news_in_bash_4.0 | text below]] for a new Bash 4 method.
Repeating arguments or words
somecommand -v -v -v -v -v
Can be written as
somecommand -v{,,,,}
…which is a kind of a hack, but hey, it works.
More fun
The most optimal possible brace expansion to expand n arguments of course consists of n’s prime factors. We can use the “factor” program bundled with GNU coreutils to emit a brace expansion that will expand any number of arguments.
function braceify { [[ $1 == +([[:digit:]]) ]] || return typeset -a a read -ra a < <(factor "$1") eval "echo $(printf '{$(printf ,%%.s {1..%s})}' "${a[@]:1}")"}printf 'eval printf "$arg"%s' "$(braceify 1000000)"
“Braceify” generates the expansion code itself. In this example we inject that output into a template which displays the most terse brace expansion code that would expand ”“$arg”” 1,000,000 times if evaluated. In this case, the output is:
After reading a lengthy comic from Lin Clark about WebAssembly,
I thought it might be great to do a deep dive with it.
Thank goodness the folks behind the project have a very nice Getting Started tutorial.
Prerequisites
To compile to WebAssembly, we will at the moment need to compile LLVM from source. The following tools are needed as a prerequisite:
I’m on OSX. Check the link for above for your prerequisites.
Git
CMake
Xcode
Python (2.7.x)
Compile Emscripten from Source
Building Emscripten from source is automated via the Emscripten SDK. The required steps are as follows.
After these steps, the installation is complete. To enter an Emscripten compiler environment in the current command line prompt, type
$ source ./emsdk_env.sh
This command adds relevant environment variables and directory entries to PATH to set up the current terminal for easy access to the compiler tools.
Note, the installation process will take a while. Go make yourself some tea.
To conveniently access the selected set of tools from the command line,consider adding the following directories to PATH, or call 'source./emsdk_env.sh' to do this for you.
Compile and run a simple program
We now have a full toolchain we can use to compile a simple program to WebAssembly. There are a few remaining caveats, however:
We have to pass the linker flag -s WASM=1 to emcc (otherwise by default emcc will emit asm.js).
If we want Emscripten to generate an HTML page that runs our program, in addition to the wasm binary and JavaScript wrapper, we have to specify an output filename with a .html extension.
Finally, to actually run the program, we cannot simply open the HTML file in a web browser because cross-origin requests are not supported for the file protocol scheme. We have to actually serve the output files over HTTP.
The commands below will create a simple “hello world” program and compile it. The compilation step is highlighted in bold.
To serve the compiled files over HTTP, we can use the emrun web server provided with the Emscripten SDK:
$ emrun --no_browser --port 8080 .
Once the HTTP server is running, you can open it in your browser. If you see “Hello, world!” printed to the Emscripten console, then congratulations! You’ve successfully compiled to WebAssembly!
Here’s how my logs looked when running the program
➜ hello-wasm emcc hello.c -s WASM=1 -o hello.htmlINFO:root:generating system library: libc.bc... (this will be cached in "/Users/Jeremy/.emscripten_cache/asmjs/libc.bc" for subsequent builds)INFO:root: - okINFO:root:generating system library: dlmalloc.bc... (this will be cached in "/Users/Jeremy/.emscripten_cache/asmjs/dlmalloc.bc" for subsequent builds)INFO:root: - okINFO:root:generating system library: wasm-libc.bc... (this will be cached in "/Users/Jeremy/.emscripten_cache/asmjs/wasm-libc.bc" for subsequent builds)INFO:root: - ok
“Life moves pretty fast. If you don’t stop and look around once in a while, you could miss it.”
— Ferris Bueller’s Day Off
A thought crossed my mind. “Am I rushing to die?” I had this thought before. I used to brush it off. The Ferris Bueller quote encapsulates the essence of life, to open up to live. “Am I missing life?”
Yet, I have an urge to rush to the end. But I risk not thinking through consequences. Rushing through my day, I jump into solutions without thinking about other options and alternative outcomes. When coding, it’s jumping into a solution without thinking about intentions. The implementation could have an immediate problem within the technical details. Or it can have an ethical one. For example, if we have a selection input for gender, you may assume the world operates on a gender binary. That is not the case.
To rush is to deny room to be aware. And thats a decision. It’s my decision if I treat work like race to exhaustion. It’s my decision to rush out of the door every morning, without checking if I have my essentials, to catch the early train. It’s my decision if I prolong getting my eyes checked. It’s my decision to stop working out.
These scenarios lead to stress. Our bodies give us indication of stress. I have made myself numb to some of it. When the neglect goes too far, the body prevents us from moving forward. I’ve been close to passing out the last time I pulled an all nighter at work.
The past few weeks of writing about failures is a reflection of what I’ve neglected in my life and why I stopped paying attention. These letters are to kick myself in the ass and ask, “what I’m going to do about this?”
Let’s say the solution is as simple as slowing down; be present. This is my invocation to begin. I’m standing firm not to neglect the mind and body’s needs. I will let that guide my present intentions.
My hope is for my future self to read this. My hope is my future self has slowed down. And if he has, please follow up and tell everyone how you did it. And say Bueller was right.
In the frantic rush of the morning, I’m scrambling many things. I’ve got to shower, eat breakfast, work-out, gather my things for work. In this scramble I inevitably ask myself, “where are my keys?”. If I was wise, they would be in my bag. If I was unwise, I start my descent into madness.
In my key’s perspective, it’s a journey through my room. First, they’ll be in my pocket, ready to open a door. Then they will be on my work table, eager to see me when I’m ready to leave. Then they’ll be on top of the drawer because I’m changing my pants. Then they’ll be god knows where because I was in the middle of another activity and decided to place them wherever was convenient. Then I’ll spend an inextricable amount of time looking for them.
It’s times like these I feel helpless to my lack of coordination. I hate my forgetfulness because I lack the foresight to place things in proper places. My keys have a place in my bag, and should always be there. And for the scenario where I don’t bring my bag, it should be in my pocket. But therein lies the problem. If I know I won’t bring my bag, where do I place my keys when I change my pants?
A System
When I was working in manufacturing, we implemented a 5 step program to achieving lean manufacturing. One of those steps was setting things in place. In one scenario, say you use a hammer. You take the hammer from its proper placement, use it for a bit, then place it back. To make things easier, one of our technicians placed an outline of a hammer so it is easy to place the hammer in its proper place. The alternative is placing the hammer wherever, which would be harder for the next person who wants to use the hammer.
With this practice, I should be able to implement it in my personal life. However, I am rarely open to the idea of changing my space. This is prompted by a stubborn attitude that I should remember everything. Added to that, I find moving things around my room to be a chore. And it’s all over when I consider something to be a chore because I’ll try to wiggle out of it any way I can.
Applied System
Back to they keys. Because I lack a system to place my keys in the same place for every scenario, I find it difficult to find them when I’ve placed them in a spot at the time I thought was memorable. I’ve thought about a cubby, or a bowl, but haven’t acted on it. I’m skeptic it works for me.
Question for those readers. Do you follow a system for placing your things at home. How do you remember where you put your things? Does your system cover all scenarios?
Addendum
I’ll be honest. After drafting this letter, I’m going to give the bowl a try. At least I can cross it off my list if it really doesn’t work. Then it’s back to the drawing board.
My bestie has a romanticized version of my life where I am a perky, social butterfly always engaging in social activities. This isn’t true. I spend most days alone when I’m outside of work. I tend to keep my personal life in solidarity.
I’m not averse to being around people. I’ve made the decision to be content being alone. My state of solidarity allows me to relish my life in different ways than super extroverts.
In practice, I hang out with friends, spend time on the phone with family, and rest around a fire pit with my housemates. To my bestie’s credit, I am a social butterfly at social events. But those are anomalies in my daily routine.
I wasn’t always at peace with this idea of being alone. I grew up in a large household where everyone shared everything. There weren’t enough restrooms to go around and weren’t enough space to spend alone. I was reliant on the people around me; I would get sad if I was alone too long.
Once, my grandmother took forever to pick me up from school. Turns out, she fell asleep at the wheel a few moments after she entered her car. This was before everyone had cell phones, so there was no way of reaching her. I was close to tears waiting at the school steps, contemplating whether I should walk home alone.
In college, I had times where no one wanted to grab lunch or dinner, so I would go to the campus cafeteria alone. I found the experience miserable because I didn’t socialize with strangers at other tables. My resolution was I brought food back to the dorm and eat in the common area instead where there would always be people hanging out.
This habit continued into my early working life. I had some of these same fears eating at restaurants alone. In a conversation with my housemate’s cousin, she told me about her experience after beating cancer. She said she had no worries about being alone anymore. There’s too little time in life not to appreciate good restaurants, so if that means going alone, so be it. Her motto in life made me re-think the way I approach being alone.
And being alone doesn’t mean one-on-one time with your phone. Quite the opposite. I like to bring a composition notebook and write or draw if I’m in a restaurant. Or people watch. Or talk to the waiter.
I was on a business trip this past week. There was two days there was no one around to grab dinner with. I’ve used the “alone” mantra to justify eating alone. It was a great experience because I got to talk with a sushi chef and an bar tender about their experiences. Also, there was a lot of people watching. So the big lesson learned is not every activity alone has to be depressive. Look past your ego, suck it up, and enjoy yourself alone.
If it’s meaningful to you, share it with the world.
If it means something to someone else, your work has legacy.
Live your work
Your work has meaning when you have breathed life in it.
Like a blacksmith beating a piece of metal, you too beat your life into your work.
Give your work away
If your work has copies, give those copies away.
If the original is worth something to you, giving your work away gives that someone a piece of yourself.
Memory may fade, but if your work is a legacy, it can stand the test of time.
Destroy your work
Every life and creation can be destroyed. Your work is no different.
If you set your work free, your work can be crushed.
This is not a bad thing. Nature is agnostic to the forces of good and evil.
Notes
The piece of prose is inspired by the book, “Show Your Work” by Austin Kleon.
The emotional mind is an elephant and the reasoning mind is the elephant rider. The rider has limited control over the elephant. The elephant is heavy and not always willing to listen to the rider. The rider might not listen to the elephant and demand the elephant follow orders by sheer will. The internal conflicts come when neither can work together.
When I was younger, I thought age tames emotion. But after years of watching my dad get angry at little things, I threw that assumption in the waste basket.
I have been misguided by my emotional mind. If I thought about death, my emotional side kicked in and took over reasoning.
Think about the people who will miss you. Think about your body decaying. Think about the future without you.
Even as I got older, those worries lingered. Depression set and anxiety attacks appeared.
Similar feelings arose when I received rejection letters from grad school, isolated myself from loved ones, and after nasty break-ups.
Meditation, Part 1
So, I tried meditation. I learned emotion can be examined and felt. My emotional side can overwhelm me, and I have fought the feeling head on. Instead, meditation says to examine the feeling and to let it happen. You achieve this through a non-judgment lens.
I witnessed the elephant the first few times I meditated. I approached meditation through a book I read. It stressed posture, breathing, and examination of the body. After the second week, my rational mind didn’t see the elephant. It imagined the daydream version of it. Unable to relax as I had with the previous week, I quit.
Seneca
I applied philosophical thought to the response of my elephant. Seneca, Roman philosopher from two millennia ago, taught his pupils to engage in a morning ritual of telling themselves what was the worst possible thing that could happen that day. Imagine it in detail, trying to put yourself in your own shoes. Imagine what you will be doing, how you’ll be feeling, etc. If the worst were to happen, you would be mentally prepared.
This exercise could be morbid, like imagining you or your significant other’s demise. This might be trivial, like getting angry at drivers who cut you off. Whichever end of the spectrum your imagination takes you, you are experiencing that feeling in a controlled dose.
I did this exercise a bunch at my last job. My manager pulled the rug from our projects a few too many times, and I kept feeling wrecked. In the parking lot before going in the building, I’d ask myself what’s the worst thing that could happen that day.
I could be fired. My project could be pulled. I could receive a demotion.
And after a few days of this exercise, imagining what it would feel like to be first, I wasn’t scared of that prospect any more. And I took that insight and wrote my resignation letter.
Meditation, Part 2
I revisited meditation last year when I got a guided meditation app. This was a lot more relaxing as I placed myself in the guide’s practice. I dedicated a chunk of time each morning to practice. If I couldn’t practice at home, I’d take the time on my train ride to work to do it. The app was more motivating, obtaining badges and tracking my progress.
My practice was less examination of emotion than it was a stress reliever. The rider was able to spend more time working with the elephant, and the elephant sensed the rider was less stressed.
After a long vacation, I stopped. I didn’t want to meditate around friends. When I came home, I dropped the practice. But now as I’m writing this, I may give it a 4th chance because I recognize the benefits.
Conclusion
The rider holds the reins of the elephant, but the elephant overpowers the rider. When the rider is too stubborn to acknowledge the elephant, the elephant dictates the outcome. Many times, this is the voice of instant gratification.
When the rider can notice the elephant’s resistance, the rider’s best option is to roll with it. Now, ask yourself, how can I work with the elephant, and not against it? As the rider, we have the ability to plan ahead and take lessons learned from past failures. Now apply that to your everyday conflicts.
in the morning ready to go home. I punched in my confirmation code in the kiosk, but my ticket wouldn’t print. I pulled up the itinerary email. The flight was marked with tomorrow’s date. I made the mistake of buying the wrong ticket.
I asked the ticketing agent if I could grab an earlier flight. She told me it would cost an extra $400 with charges and fees for a flight that left in a few hours. To add salt to the wound, only middle seats were available.
My body said to stay put, but my mind said to go home. I bit the bullet and paid the extra amount. A few moments later, I regretted my decision. But I went through with it, and I cursed myself because it was the worst decision I made all year.
That was four years ago. Today, I wonder what prompted me to make such a mistake. Everything that ticket agent said was rational, yet my thoughts were caught in a sea of emotions. I was afraid I wasn’t going to make it to work the next day. In reality, I would have made it to work on time given there were no flight delays.
I was reacting to my situation without thinking about the long-term consequences. This feeling goes by many names, like fire-fighting, and if you are surrounded by this behavior, you are likely to adopt this frantic role. The behavior is anchored by the perception of time. “There’s not enough time to think” could be the slogan. And in this slip of time, I’m out of control.
Control / Out of Control
Busy Mind
Growing up, I remember watching “The Price is Right”. Each contestant on the game show must make decisions within a short time frame.
Many can’t think straight with the flashing lights, the potential prizes they could have, and the emotional burst of being on television. They look out to the crowd and try to take the advice of other audience members, likely the ones they came with, in hopes their shouting could be the right answer.
This environment promotes a chaotic mind. How can you think straight with the noise? The show’s producers know this and tell the game developers to use common price biases to throw the contestant off.
For example, there’s a game where the contestant has four items to determine if the item is higher or lower than the tagged price. You can bet the game developers take advantage of anchoring, a bias where the contestant will be affected by the first price they see. When the contestant plays this game, the short decision window clouds their judgment, and that’s susceptible to anchoring.
Online shopping is a similar experience. I have many temptations to buy things I don’t need because of the convenient factor. For this reason, I’ve turned off one-click shopping on Amazon as a safe guard.
My weakness is making decisions around limited time deals, like flash sales, items at the checkout line, and Black Friday. If you’ve read my newsletter on catalogs, my seeds catalog was an instant buy.
The recurring solution I’ve found to all of these decisions is to bench the decision for a certain amount of time. For instant shopping, it’s 24 hours. For the flight change, it’s ten minutes. This time period is reserved for calming time — to get rid of extra baggage and emotion when making my decision.
We’ll explore more next week on anger and the calming down effect.
Whitest Kids You Know - Abe Lincoln telling John Wilkes Booth to calm down
I fail to look past how spotty my memory is. It’s embarrassing how often I give in to the temptation that I will always remember everything pertinent in the future.
While perusing the video store, a stranger walked up to me and asked for some movie recommendations. We got to chatting and it turns out we had similar tastes in movies and video games. I found out we were both around the same age. We were both teenagers; he was a year older. He told me he had moved to this area a month prior and was looking for new friends. I told him I’d be happy to be his friend, and he invited me to come to his place to play video games. Yet I had this tinge I was forgetting something. When I got home later that evening, my dad was furious I had missed my piano lesson.
Surely my memory should be better today. Nope. I’m still failing to remember meetings, engagements, and birthdays. There are some differences between my teenager self and how I operate today. I have a set of strategies to minimize these spots in my memory.
Using a Calendar
I’ve hated time-boxing when I was younger. Chunking time made me feel like I couldn’t have any unstructured time. But I’ve looked past it after I saw how much benefit I got out of it. The important thing is to have the calendar ubiquitous. For example, if I am planning to attend an event next month, I will put it on the calendar immediately.
There’s a major flaw. I forget to do mark my calendar every now and again, especially if I’m busy that moment. Take last weekend as an example. I scheduled to have brunch with some friends, but I forgot to mark it on the calendar. Another friend asked me to help him out around the same time. I agreed and put that in the calendar instead. It was the night before when I had my “a ha” moment.
Calendars don’t work for everyone. You will have to use the tool you feel most comfortable with. It could be a bullet journal, or a paper calendar, or a wad of post-it notes shoved in your pocket.
Delegate When You Can
I suck at the follow-up. I’ll be at a meet-up and forget reach back to people who gave me their card. Let me let you in on a secret about productive people. They are great at delegation. There’s not enough time throughout the day to do everything you can imagine. At most, I can reliably do one thing a day. Anything more is a godsend. So ask the other person to reach back instead. Or ask them to do something they can’t refuse for you. An example can be to make the other person text you when they get home so you don’t get worried about them.
Write Personal Messages
I love personal messages to myself. I have trouble listening to other people, so I listen to myself a lot better if I wrote them in a tone I’d listen to. Here’s a calendar event I set for Saturday, March 3rd, 2018.
Dear Jeremy,
I know you have a tendency to neglect your taxes until April. Don’t do that. Instead, this is a reminder for you to get started on them today.
By now, you should have all of your tax documented gathered. Most likely, you’ve piled them in the corner of your desk. Here’s a checklist of all of the documents you should have.
— List of Documents —
Next steps is to login to Turbo Tax and log in the data. You have kept your donation receipts in this folder.
In case you need it, here’s last year’s tax return.
Cheers, and happy tax filing,
Ghost of Past Jeremy
Automate When Possible
An extension of all three of these ideas culminate to a set it and forget it mindset. If I set the email for next year, why can’t I have it recurring every year?
Or automation could be behavioral. For example, if someone gives me a book recommendations, I have an automatic response to write it down. Developing routines saves us mental energy. Automated strategies are not always technological.
Final Thoughts
These strategies are guidelines, not a matter of fact. Adopt one or all if you so choose. Or modify them to fit your needs. The world’s too much for a one-size-fits-all approach.
I’ve gotten too cozy on the sidelines. Ive justified my position by lame excuses, like “I wouldn’t know how to help. A moment from middle school stands out.
Help to Acquaintances
On the journey to school, I noticed a group a guys harassing a girl from my school. They were across the street, so I stopped and stood there watching. I was one of many bystanders watching my fellow school-mate get angry at these boys. She was screaming at them to stop teasing and calling her name’s. I could have run across the street and intervened, but I didn’t, thinking one of the other kids would help. They didn’t either. After several minutes of heated escalation, a teacher intervened and had the crowd scramble.
Help to Family
These events of “should haves” and “could haves” filled me with regret. The most painful one happened a few months later. One night, as my grandmother was leaving my parent’s house, she fell down on our front porch steps. My parents rushed outside as I watched from the window. They carried her back in the house and my father called emergency services. My grandmother had lost some blood and was loopy.
During the brief time before the ambulance came, I sat in another room frozen. I didn’t offer to help; I was crying because I thought I was losing my grandmother. During the time leading up to this event, I was going through my first major depressive period.
The ambulance came and did some initial diagnosis. They determined my grandmother was fine. The EMT took her to the hospital just in case.
When the chaos subsided, my mom asked me why I didn’t help out. I couldn’t answer her. I couldn’t sleep that night, wondering why I froze up. My belief was I couldn’t bear witness to someone dying. But my grandmother didn’t die that night.
It was after my depressive period that I could see more clearly the problem. My resolution to any similar situations would be to set aside emotions and focus on the task at hand. People involved in a crisis matter beyond my emotions. And I know that line’s not always clear, but let’s not open that set of moral ambiguities.
Help To Strangers
Two years ago, I was challenged with a different dilemma. I was with a date walking around at night when we met a beggar. The beggar was younger than us, a woman with disheveled hair and ragged clothes. She was begging for food for her daughter and her.
The fraud center of my brain began to whirl. My date looked at me to see what I would do. I decided to help this young woman, so we bought her a pizza at the restaurant nearby. As we were waiting, she told us about her money situation, how embarrassing it was to ask for help, and how many people ignored her. She thanked us profusely when the food arrived and we went on our separate ways.
Takeaways
I’m not going to talk about how to evaluate panhandlers and beggars. That’s its own article. Instead, here are two takeaways.
1
My college economics professor started each lecture with a simple saying. “Doing nothing is always an option.” At the time, he was explaining financial opportunity costs. I’m translating it to everyday decisions. If you are on the crossroads of sideline and intervention, choosing the sidelines is a choice. It is up to you to determine if it’s the right choice.
Cartoon at Heaven's Gate
2
I was at the National Civic Day of Hacking event in San Francisco, and the organizer captain, Jesse Biroscak, delivered an outro. To paraphrasing a point I thought was important, “You are the only ones who can help. Look around the room. This is it. There is no one else.” I looked around the room and saw around 30 people.
“Oh my gosh,” I thought, “he’s right. If I want to see change, I’m going to need to start the campaign.”
Jesse was talking about projects for the SF Brigade. One can easily translate that to everyday situations. See debris in the middle of the road? Call highway patrol. A blind person is judging if they should cross the road? Tell them if the coast is clear. Have the skills to help out a non-profit? If you can make the time, do some pro-bono work.
A friend asked for my help with an upcoming interview she’s preparing for,
so I thought it’s a good time to write-up the interview preparation process.
Interview Help Request
The following is the initial exchange of what areas she wanted to focus on.
Here are the areas and key points (I know of) that they will be asking me about during the interview.
For some additional context, the interview itself will have the interviewers seated and me standing in front of a whiteboard I can use when I am trying to explain a concept as well.
Definitely meant to help them get a feel for how a candidate would present the information to a group of students.
1. Explaining the HTTP Request and Response Cycle
This is what [the interviewers] like to start with.
I should be able to comfortably navigate through the [HTTP Request & Response] cycle at its simplest.
[For example, explain a GET request].
Accurately describe major components:
HTTP
DNS
the Client & Server
HTTP request and response anatomy
[And] note possible variations of a particular step.
For example, naming a few common HTTP request and/or response headers that may be included and why.
You must mention when & how a set-session token/key fits into this.
Not sure whether or not I will need to get into the difference between handling a request for static content vs. a request requiring server-side processing.
[They may want me to cover] server-side processing in the next topic.
Additionally, I wouldn’t be surprised if they wanted to test my general knowledge of the server setup.
I would probably touch on this in my explanation, however they may want me to further clarify the role of the load balancer/proxy server software
we typically install during deployment, such as Nginx/Phusion Passenger, and how its role differs from the server where the actual application/site resides.
Or, just throw out a question to test that I know what it is.
While listening to my presentation they will be making sure that I properly refer to the different parts and how they relate to each other.
Interviewers are likely to interject asking for clarification on a point I glossed over, or if they want to see whether I have further knowledge of a component mentioned.
From what I was told they try to make some questions somewhat similar to how a student may probe a new teacher during a lecture.
2. Explaining MVC pattern architecture
I wasn’t asked this in the first interview, however know I will be asked about this on the second.
I am not sure exactly about the depth they will want me to go into. I think it mainly pertains to my understanding purpose of this architecture as well as being able to explain what each component/part does and how they interact.
Finally, they will probably want my presentation to touch on request handling within an MVC pattern framework as well, definitely heard the motto “fat models, skinny controllers” a lot when I was being taught.
I think they want me to be able to provide a good 1-3 sentence definition of each of the three pillars. They will likely ask me to define some basic components and throw in trivial questions regarding classes, objects, method overriding, etc.
In addition to above, they may want me to write out an example of one or possibly all the 3 pillars in Python/Ruby. (for this specific position, they will likely want some verbal/written examples to be provided for most of the topics mentioned)
4. REST APIs & RESTful Routing
These areas I am more unsure about, in regards to what kind of information they would want.
We didn’t go very deeply into the concept of REST APIs during the bootcamp itself, any explanations were usually in optional sections of the platform.
My best guess, based on the curriculum, is they would be satisfied with a well-rounded-sm overview/definition of what REST is and why its used.
Additionally, explaining implementation of RESTful Routing in a framework such as Rails or Django (more semi-RESTful for the latter).
And there is a small chance they may ask me about APIs, which can be as general as “What is an API?” and “How are they used?” or as specific as providing an example of API usage with AJAX and jQuery.
5. JavaScript Algorithms
There is a 75% chance they will ask me to do up to 2 of the following,
however depending on the interviewer there is an off-chance I can get an algorithm I have never seen before or one they know I can’t solve.
Basic Data-type Manipulation (strings/arrays/dictionaries) - eg; reversing an array in place
Popular Sorting Algorithms (Bubble, Selection, Insertion or Merge). most likely culprits, but Quick Sort is on the table as well
Algorithms using Linked Lists or Binary Search Tree data structures. Could be Push/Shift/Unshift/Pop methods, linked lists algorithms & find/search with a BST
Based on the advice I was given, they would first want me to explain how a particular algorithm works/show I understand the objective (eg, that the Push method would mean adding a node to the end of the linked list in question, or that I can explain how the Bubble sort actually sorts an array rather than how the Selection sort would accomplish that), next psuedo-code and say how I plan to approach the solution, then writing out the code (last two parts can be combined, like explaining as I write out the code).
Sample Questions
From this scope, I’m taking a stab at formulating questions I would ask if I was interviewing this candidate.
Questions about HTTP Request & Response Cycle
Explain what happens when a user hits enter after typing a URL in a browser.
What is the difference between latency and bandwidth?
What is DNS?
What is an IP address?
Explain the HTTP request & response cycle
Explain an AJAX request
What are the drawbacks of using cookies? What are alternatives?
What is session management?
Networking Questions
What would you check if a website is slow?
What is a load balancer? What are some examples of solutions?
What are some ways to optimize the payload sent from the server? (For example, gzip, uglfying js, minimizing css/js, shortening header content length, etc.)
What is a CDN?
Security Questions
What is CORS? What can you do with CORS to secure your website from cross-site request forgery (CSRF)?
Questions about MVC Model
What is the MVC model?
How does the model, controller, and view interact with each other in Django?
How about in Rails? How about in any front-end framework?
Have you heard of variations on the MVC model, like MVVM or MVP?
stackoverflow
What are some examples of frameworks with MVC on the back-end?
What are some examples of having MVC or MVC-like frameworks on the front-end?
What are the pros and cons of having MVC all on the back-end?
Extra database questions
What is ORM?
What is a Store Procedure and how is it different to ORM?
Can you write SQL queries in Rails Active Record?
What is NoSQL?
Why use a Document Database over a Relational Database?
What are some purposes of a key-value store like Redis?
Why use placeholders in SQL queries? (Answer: defense against SQL Injections)
Better Question: What is a placeholder and why would you use them in SQL queries?
Questions about JavaScript Algorithms
Write a function that receives an argument for prime # and return the prime in that position.
Example:
getPrime(2); // 3getPrime(5); // 11
Given a nested array, [1, [2, 3, [4]], flatten the array, [1, 2, 3, 4].
In recursion, what is a base condition?
Without using Javascript’s map function, please write your own map implementation.
Write a select function that takes an array of objects and finds the first entry of the object with a given name.
Given an array from 1 to 100, write a binary search which takes a target. What is the O notation of your solution?
(I personally hate this question)
Given a class that mimics linked list data structure, write an add function for it.
(I also hate this question)
Write a function that is a closure, i.e. a function that returns a function, for adding.
The input is how much to add by.
The return is a function that takes a number input that returns the sum of that number
and the first input.
Write a debounce function.
Debouncing is when you stop firing the same function for a certain amount of period after firing for the the first time.
For example, if you had a “resize” function, you would not fire “resize” if you set the debounce for 500ms.
What is the purpose of this keyword in Javascript?
Explain scoping in Javascript.
Explain variable hoisting in Javascript.
Given a list of U.S. states and a list of capital cities, how would you merge these two lists to return one list?
The common factor between these two are state codes.
State collection example entry:
Follow-up: How could you filter this so you only return states that start with “North” or “South”?
Could you do this using the reduce function for Javascript Arrays?
What is a cache and how would you write a simple key-value cache?
What is a lambda and why use this over blocks? How are lambdas and closures related?
What are the differences between private and protected methods?
Other Questions
What is your favorite open source framework? Why is it your favorite? Are you a contributor to that project?
What are the pros and cons of choosing an open source framework over a custom solution? When is it valid for a custom solution?
What are some principles you have to error handling?
Follow-up: What are some common exception types?
Why would you use a try...catch block and should you use this in production?
What are some general use-cases for logging?
What are common failures that would cause your server to crash?
Sample Criteria
Here’s some criteria I look at when interviewing a new candidate. This is from past experience.
Knowledgable: Can the candidate explain the content? Can the candidate solve the whiteboard problem? Can the candidate explain their own code? Can the candidate explain a foreign topic? (BS monitor)
Presentation: Is the candidate concise? Or do they ramble? Can they explain concepts in a minute or less? Do they gauge the interviewer for comprehension? Is the candidate audible?
Personality: Is the candidate asking questions and are they probing on open ended questions? Does the candidate exude humility, like saying “they don’t know” when they don’t know something?
Seriousness: Is the candidate serious about the position? Did they do any research prior?
Team player: Is the candidate’s prior work long-standing at a single company or jumping around a lot in short-term gigs? Can the candidate work well with others?
My glasses were falling apart. I owned them for 4 years and couldn’t persuade myself to get a new pair. To obtain a new pair, I’d need a new prescription. And being sensitive about my eyesight and didn’t want to face the prospect of the optometrist diagnosing me a stronger prescription.
Broken Glasses
So I did the insensible. I neglected to replace the pair of glasses. And I had no excuse. I had health insurance. There was a hurdle in my mind I couldn’t jump over.
The hurdle started with facing the news I will have a stronger prescription. Which leads to being deemed legally blind because my eyesight had deteriorated. Which triggered my fear of being blind.
At that point, I’d think about something else. When the topic came up again, I’d repeat this cycle of worry, hesitation, and negligence.
I broke down when bad became worse. On of the nostril pads came off, so I needed a replacement. I came to my senses and figured out the first actionable step.
Breaking the Cycle
I went online to determine how to schedule an appointment with an optometrist. My hospital website had had online booking. Bingo.
I went in for the appointment and to my surprise, my eyes were the same as they were 4 years ago. By letting myself slip, I failed to see the absurdity of my own bias. All the moments of worry were for nothing. All the times I wondered what if, wasted.
Not broken glasses
An Introduction
We all make mistakes. We all fail to do, or sometimes not do, the important things in life. I want to raise the bar and stop this repetition.
The negligence problem is one of my failures. It’s one of many failures. Each week I’ll break down a different repeated mistake. My aim is to generalize failures common to everyone, although my intent is to write it for my future self if I were to relapse. If this model helps other people, that’s an added benefit.
Bookmark this for later. Re-read often. We’re going to have a fun two months exposing my weaknesses.
Single responsibility means one unit of code does one thing.
It should not be responsibility for many different things.
In other words, it adheres to “separation of concerns”.
In dynamic languages like Javascript, there’s no typechecking what a function can return.
So, a function could take any arguments of any type and return any type.
In general, we want to avoid this. Take the following code example.
Our function, getPlayerBehavior, takes one input that should be a number
However, the first return statement returns a type String,
while the second return returns a type Array.
This is an example where the function is doing two different things in one
unit of code. We want to avoid this behavior and evaludate what this function should do.
Should it pass back the list of behavior names
or should it find the behavior given the index.
Take the following solution as a guideline.
// Same constantfunction getPlayerBehaviors() { return PLAYER_BEHAVIORS.map(playerBehavior => playerBehavior.name);}function findPlayerBehavior(index) { if (Number.isInteger(index)) { const playerBehavior = PLAYER_BEHAVIORS.find(playerBehaviour => playerBehaviour.id === index); if (playerBehavior) { return playerBehavior.name; } else { // Could not find player behavior return ''; } } else { throw new Error('index should be type Number:Integer'); }}
In this example, we have separated the function into two functions because they are doing two separate things.
Depending on how we called this function before, we will have to determine
which function to use before we make the function call.
I left 2015 with optimism. I leave 2016 with mixed feelings. I slowed down my steam for writing. I ramped up with watching classic and contemporary films. We lost some world-changing people. Of course, this is inevitable.
To free me from the past, I must recognize the ups and downs of the year. Hence, the retrospective list.
Obligatory List
I ran my second marathon in San Francisco. Under 6 hours.
Revisited Thailand and Mexico. First-time to the UK.
I wrote 12 letters, far less than the previous year.
I meditated for 60 non-consecutive days. I stopped after traveling to Thailand.
I read 26 books, or one every 2 weeks
I participated in 4 hackathons - two corporate sponsored, the other two more hack for the sake of hacking. That’s how I’d have it. One continues to be a small project about the Zika Virus
I am working on another side project that will not be named at this current time, but has been taking a lot of time
Beginning of the year, I finished a course on The History of Classical Music, up to the beginning of the 20th Century.
The rest of the year was spent learning the history of film. Kicked off by watching the 15 hour documentary, “The Story of Film”. Final tally: 129 films. This has been the highest the past decade. Large contrast to last year being the lowest in a decade.
Continued to go to talks, topics ranging from Time Travel 101 to Gut Bacteria
Add North and South Carolina to list of states visited. Total Count: 33.
I started a papers reading club at work, inspired by “Papers We Love”
Along with many, I helped raise over $1,000 for charity this holiday season
My parents used to leave me at the public library for an hour. It was there I stared at a poster hung in the children’s section, showing what each hundred numbers meant. This was my introduction to the Dewey Decimal system. I was in awe at how every topic in life, the universe, and everything could fit within these 10 category brackets. But alas, they don’t. That was revealed when I asked, “Why are there books on suicide near language learning books?”. Much later, I discovered the field of library science, and I realized librarians curated non-fiction books to fit between 000 to 999.
Seed Catalog
I was fascinated with cataloging systems ever since. So it doesn’t come to anyone’s surprise at my obsession with the 358 page, encyclopedic catalog called “The Whole Seed Catalog from Baker Creek Heirloom Seeds.”
Each plant entry has a crips image, an item code, and a short description from the farmer on why you should grow this plant. Each image whispers in your ear, “this is what your garden can look like.” The curators determined the selection by the limited supply of Baker’s Creek, as well as compatibility with the North American climate. So even with the limited selection, it’s exhilarating to see what exotic or heirloom varietal lie with each page turn.
select page from seed catalog
The catalog has a lot of character. There are photographs of strange vegetable sculptures and children that could be the poster child for “Future Farmers of America”. I love it when you have someone’s personality injected into these catalogs. Counter that with the department store’s 600+ page catalog of generic items.
This same elation came to me as I flipped through the Cool Tools Catalog. Kevin Kelly, co-founder of Wired, published this catalog and helps run the website by the same name along with and a slew of editors. Each page is full of interesting gems about topics I wouldn’t have thought about, like world traveling to cartoons that help you learn. For most items, the reviewer has used the item and shared what use they got out of it. For all other items, they are not vetted for, but the the reviewer describes why the item is cool and why they want to buy it at a future date.
Cool Tools
The selection of oddities feel like the curators were scratching an informational rabbit hole. Why would I want books on beekeeping? Or tiny homes? Or astrology? Because alluring and voyeuristic, like looking through someone else’s grocery cart. It opens my curiosity and sometimes gets me to dig deeper.
Then there’s the catalog of mythic proportions to a machinist. The McMaster-Carr catalog. Every mechanical part you’d ever want appears in this tome. Over a thousand pages, this catalog has a limited print release. I found a copy at The Crucible in Oakland when I took a general machining class. Gears, nuts, bolts, screws, vinyl tubing, and much more. It has everything.
While that’s an incredible feat, McMaster-Carr has created an orderly website. While the website can’t show the catalog’s size and weight, it adds features to the website you can’t translate to a physical object. They share CAD files so you can integrate their products into your 3D models. They make ordering easy.
McMaster Website
Instead of looking at an index in the back of a paper catalog, you can locate any item with the search bar. You lose the unintended discoveries if you were flipping through the catalog. Same same, but different. What you gain is order to their catalog without having to flip through unnecessary details of all possible selections of items you don’t care about.
Filmstruck Website
I am concluding with Filmstruck, the new movie streaming service by TCM, in partnership with Criterion. One of Netflix’s challenges is providing the right content to an individual subscriber. Filmstruck’s solution is to catalog their films by curated themes, like “Classic Bollywood” and “A Smidgeon Of Religion”. And if those are not your flavor of curation, they also have typical genre categories. But you can spend more time viewing short movie descriptions than starting the movie, so let the cinephiles tell you what’s good.
Curation ties all of these catalogs together. Each catalog contextualizes and gives order to multitude of items. Thinking about this helps me think how to organize my work, from determining hierarchy in my code or organizing my thoughts in essays. Don’t think of catalogs are this passive thing we’re given. Think why they are being given to us.
After a year working with JSX syntax in React, I’ve learned a few things reviewing my code as well as other developer’s code.
I am taking the perspective of a code review in these following code samples.
Last fix I would like to see is to alphabetize the tag properties.
I don’t want to find a property if the list is random.
This is more so when the property list is greater than 10.
Some of you may notice the two self-closing tags are unnecessary.
As you may or may not be aware, we are using Bootstrap.
Bootstrap contains “offset” classes that can be used to replace those first two column <div>.
I didn’t address this because the developer may plan to use it.
It’s more simple for me to note that in my review notes to the developer than to tell them to make those changes.
If that developer chooses to keep it, they can leave a comment as to why it is left that way.
The Javascript ES2015 spec introduces object destructing. Object destructing used to pass a single object parameter instead of long argument lists to functions. Take the following code example.
Bad Code:
function enableListFilter(option, filterName, filterIndex, activeAccessTypeIndex) { // Do Something}enableListFilter(option, filterName, filterIndex, activeAccessTypeIndex);
The function requires the developer to know the order of the parameters passed into the function.
When this is one argument, that’s easy.
When it gets to 2 or more arguments, this can get difficult since that stretches a developer’s working memory a la “yet another thing to remember”.
Here’s an alternative.
Better Code:
function enableListFilter({ option, filterName, filterIndex, activeAccessTypeIndex }) { // Do Something}enableListFilter({ option: option, filterName: filterName, filterIndex: filterIndex, activeAccessTypeIndex: activeAccessTypeIndex});
If you want to reduce the number of lines, you can use the object parameter shorthand.
Note: A caveat of this approach your argument names must be the same name.
In most cases, an explicit approach of writing out object keys is better.
Beyond the pagoda decorated with oriental lanterns and stone lions, is a center of Asian-American culture and identity. A common immigrant experience is to make the new home feel less foreign. For the Chinese and other Asian immigrants, that space is Chinatown.
Generations of Discrimination
My grandfather spent his early adulthood in San Francisco Chinatown. It was the 1930’s, and discrimination was rampant. My guess is he was assigned by the Chinese Chamber of Commerce his first job in San Francisco Chinatown. Or perhaps it was his father. Nevertheless, the chamber had their hand directly or indirectly because they helped find employment for most incoming immigrants. The Chamber acted as a gateway because new immigrants weren’t immersed in American culture or language, and during my grandfather’s time, there was rampant discrimination. 8 decades later, the Chamber remains to help. When founded, the Chamber was run by Chinese, for Chinese. Today, it’s expanded to more Asian communities.
While I’m hazy as to how my grandfather got his first job, I know his job was to help run a laundromat. He worked there until the war broke out. He did his duty and fought the Asian Pacific front. When he came back, he courted my grandmother and married her. With the help of the GI Bill, he was able to buy a house in Berkeley. They had four kids, all boys. One of them is my father. By all means, they made their American dream.
My dad and his siblings grew up in that Berkeley house. They grew up under the strict and regimented rule of my grandfather. My grandfather’s kids children weren’t quite keen on the rules. As children do, they rebelled, but not well. As much as my father wouldn’t want to be compared to his father’s flaws, I see this behavior passed on my dad. He gets anal about tiny details that I don’t think matter.
My dad still faced the discrimination in the 50’s and early 60’s. He recalled to me how the grocery store he stops at today didn’t allow him to enter when he was a kid. “No colors” a sign read marked at the front of the store. The tide changed in his early adulthood.
The dirty secret of immigrant communities is they discriminate. During my grandfather’s adulthood, the Chinese community discriminated against anyone who wasn’t Chinese. My grandfather rejected the idea he or any of his children would marry a Japanese woman. From the war, his discrimination grew larger. I’m sure he was livid when one of his sons married a Japanese woman. That was my parent’s generational divide with their parent’s generation. Today, my divide comes in other arenas, like sexual discrimination. I’m much more tolerant of the LGBT community than my parents. It’s not as harsh as my grandfather’s hatred towards the Japanese. Their discriminatory behavior comes from a lack of knowledge. And that becomes a learning opportunity when I speak to them about those things, if of course you can teach old people new tricks.
Chinese Yesterday, Muslims Today
Muslim communities are discriminated like the my grandfather’s Chinese community. Political tensions with China were high with the rise of Mao Zedong. Chinese restaurants were in the tank because the community marked them as a communist symbol. The community didn’t understand not all Chinese were communists. They failed to understand many of them were Nationals and pro-Capitalists. My grandfather was an anti-communist, and agreed with the economic beliefs of the community.Yet, like every other Chinese business, he was fighting to win the respect of his surrounding community.
Today, political tensions are high in the Middle East. In the Midwest, non-Muslim mothers are scared to have their kid play in a playground because they don’t trust the muslims in their community. It was a point of contention in a recent episode of This American Life. Trump caught wind of this and blew it out of proportion, calling for a temporary ban on all Muslim immigrants. Trump undermines the real point. The issue has more to do with the divide between communities.
My grandfather opened his own laundromats after the war. He was able to sustain customers by doing business with everyone, even the people who didn’t like Chinese people. Tensions came down when they saw my grandfather as the average Joe trying to make a living. They connected with him by talking to him on a regular basis. And he did a damn fine job with their laundry.
I have this itch that we, as a collective, no longer talk with one another. The communities with such rising tension do not connect on empathetic levels. The headlines flood us with asserting blame on the growing immigrant population when really, we never took the time to interact. My call of action is to interact with people you don’t agree with. Try to understand where they are coming from, and understand circumstances are different.
Coda
I’m writing to you from London/Gatwick airport returning from holiday. From the last few days I was here, I noticed good portion of service-oriented business is run by immigrants. After a few conversations with locals about Brexit, I noticed some alarming parallels. Some politicians have convinced the country immigration is the issue rather than pointing out the harder question of the economy. My guess is it’s easier to scapegoat immigrants and play off this sentiment with the citizens. Again, my belief is communication is key for dissuading this argument.
Conclusion
My grandfather passed away before my first birthday. I wish I knew him more. I really want to have a conversation with him. Maybe about being an immigrant. More importantly, how he was able to convince people around him he was an American, assimilated. How he could operate a business with customers judging his allegiance to capitalism. But that won’t happen, and I can merely speculate. So the best I could do was scrap this together through second hand accounts, photographs, and letters.
I know a conversation is a start, and let’s continue this from now on. Tell me your immigrant story. Change my view on how I look at other cultures. The advice is concrete because the issues span generations.
Beginning this year, I steered in a film adventure. It started with Mark Cousin’s documentary series, “The Story of Film”. It’s a 15 hour spectacle taking you around the world to learn about film history. Though there are sections where the focus is on Hollywood, it doesn’t linger there too long. Cousins talks about film as a global language. Starting from the beginning of film with the Lumière brothers, Cousins works his way through the silent era but relates it to modern day cinema. As a viewer, you’re taken back and forth through films of different eras, understanding how one generation of film makers borrows from the film language of a previous era.
The series had a profound effect on me. Being able to see people make film from a hundred years ago and more tells me there are commonalities in human behavior and events that cross generation and millennia. I had a similar revelation when studying art history, though that was not as profound because the interpretations of the art were typically from secondary or tertiary sources. In film, there are primary sources from documentarians interviewing directors and cast members. For example, MoMA exhibits Van Gogh paintings, but its descriptions are written by the art curator. As an extra on the Blu-ray of Stagecoach, you can watch an interview with John Ford talking about directing his film.
Aging Film Stock
Thanks to recommendations from some readers, I checked out the Stanford Theatre. I don’t know why I hadn’t gone sooner. I watched “The Blue Angel” from 1930. The film shows its age with the crackles and pops from the audio and dust and scratches on the film. I couldn’t care less. I was invested in the eventual downfall of the professor. I was taken aback by of Lola’s song as a harbinger. I witnessed a screening uncommon for today.
While the majority of this year has been watching restorations, original prints or something close to it is just as important. The Stanford Theatre showed me the value of old film. It’s the living print that has been stored for decades before and will continue to be our go-to until we can restore prints to the highest quality. That definition might be the highest pixel density you can get before there is no discernible detail in the film grain.
Thank goodness there are film preservationist keeping these films alive. Preserving the reels is a tough job. This is worse for film with ammonium nitrate that’s highly combustible, prevalent in film before the 1940s. Some films are lost forever because of neglect from the studios, archive fires, and other damage.
What’s Next for Film?
Despite digital taking over, film still has a place in our world. The latest Star Wars film was shot partially on film to give it the aesthetic of the original trilogy. Tarantino swears by it because he believes it gives that bit of authenticity to movies. Is it enough to keep this medium alive? I wouldn’t know. I’m not in that industry. But I will appreciate film for what it’s worth, if it means going to events at Stanford Theatre, SF MoMA, and Berkeley Art Music and Pacific Film Archive. I love this experience of film and would love if everyone could go watch.
I am coming forward; I glance at my phone during dinner conversations. I glance at my phone to check for notifications. I glance at my phone to check the time. I glance at my phone to preview a text.
Is it rude? Yes. However, I can argue that it depends on circumstance. If there’s a matter more pressing or urgent, the action is warranted. But try to be mindful by letting others know. I make the matter its own event and leave the conversation, i.e. a context switch. I don’t want someone to see me disconnected or disengaged in our conversation. An in-person conversation is dialog that belongs to the participants, not to the outside triggers of life.
I have been experimenting with myself by leaving my phone away from reach when I’m talking to someone. If I’m having a coffee shop chatting with a friend, I’ll leave the phone in my bag. If I have friends over for dinner, I leave it on a counter top where I won’t check it.
The exception is when the phone is the conversational centerpiece. If you want to show something on your phone, then it’s not rude.
The Longer Version
I have a tough time reflecting on ideas that I’ve read. It’s easy for me to read things to learn, but if I were to take a step further and apply what I’ve learned, I become stuck. That’s why this is the fifth time I started writing an essay about Sherry Turkle’s new book, “Reclaiming Compassion”. Each past reflection was a step closer to finding out how Mrs. Turkle’s book applied to my life. I identified the book applies to three areas of my life — my work, my relationships, and my personal life through notifications.
Let’s take a step back. Turkle’s book discusses the shortcomings of communication with our new technology. These shortcomings focus around modifying our behavior that ends up distancing us. The book uses case studies and interviews to demonstrate the main points.
Work
One case reviews new paralegals using email as a primary mode of communication. These employees prefer email over face to face interaction to their boss and the firm’s clients. Before, paralegals booked face-to-face meetings and talk about their client’s cases in person. After reviewing work performance of some NY firms, there were lots more miscommunication between firm and client. (need to review the effects). A few firms recognized this and forced their paralegals to make contact in person. Within a few months, these firms noticed an uptick with client satisfaction.
Thinking about my company, we use an IM service for work. I have found it far easier to IM my boss than to walk over to him and ask a question. The relationship was established prior that he can be asked questions in person, but for the first few months of my job, I preferred to ping him my questions. Then I realized there’s more to learn through a face-to-face interaction, so I’ve asked him more questions. When he’s busy on something else, he’ll let me know he needs a minute.
Further than that, if there are logistic issues between my co-worker and I, I will initiate a conversation in person or a video chat over resolving the issue over chat. When I’ve applied the latter, more effort is used to re-explain many times my point of view. If there’s a highly technical logical issue I know would be better through text, or more likely, images, then I’ll do that. Emails get flooded and many times, it’s hard to respond to everything. But more on that later.
Relationships
The book also examines texting in romantic relationships. Mrs. Turkle talks to a teenage boy about his first relationship. The teen wanted the appearance the relationship mattered, so when she texted him, he made sure he responded immediately. More than that, he would stare at his response for a while to make sure it sounded right. He took advantage of the editing capability of texting. However, when he met with her in real life, he was scared he might say the wrong thing. Sometimes, the girlfriend didn’t want to remarks of her admirable abilities the boy kept making. Because it’s hard to convey annoyance by texting, the girlfriend would respond negatively. This would devastate the teen, so he would text her non-stop trying to re-write his wrong. In the end, the relationship didn’t work. The teen was confused and hurt, unsure what he had done wrong. After examining this with Mrs. Turkle, he starts to see his errors, but he’s unsure if he can escape the anxiety of each texts on the next partner.
I can relate to this teenager. I have found myself editing my texts to my past partners to sound better than something I can come up with on the spot. I don’t have problems in conversation. I have an issue with flirting through texts than expending energy to quality time, the need I have the most in terms of the Five Love Languages. [1] My aim with my partner is to focus on that need and spend less time focusing on making myself sound more interesting through texts. Besides, I love flirting.
Notifications
Notifications pierce through our attention span and jump to the front of our todo list. Turkle’s book examines the consequences of constantly being bombarded by alerts. Her findings don’t look so good. When we get a text message, many of us will drop what we’re doing and read it. Of the many, the majority will respond to that text right away, even in midst of doing a different task. In other words, when we are talking to someone and receive a text message, few of us will stop that conversation and glance at our phone. Even fewer of us will respond to that text message than to continue to carry the conversation we are already having.
I get bombarded by emails, texts, and other phone notifications. Desktop notifications have slowly crept up too. I am okay with not responding to a notification at ping time, but I have a hard time forgetting about it when I’m notified. My solution is to silent those notifications, if not removing them entirely. I removed most of my app’s notifications except for texts. I will silence my texts during work hours and leave my phone away from me once I get home. I know for the rare chance there’s an emergency, there will be a phone call rather than a text. As for when I respond to texts, it’s whenever I have time to dedicate during the day to do it. Typically, that will be when I run out of steam at work and need a break, which is around 3pm. At home, I can check it after dinner. I have found I don’t sleep well if I text right before bed.
Attention
Turkle talks about this case between parent and child. A mother might be worried about how much time her daughter is spending on the phone. However, the mother takes emails and texts during dinner time, and the daughter tells the mother to get off her phone. Children emulate the behavior parents display. If parents don’t change their behavior, it’s hard to imagine this mother changing her daughter’s behavior.
I don’t have children, but I make it a point when I’m out with my friends to check my phone as little as possible. I recognize the moment I see the phone in sight, I have an uneasy feeling I am battling for their attention. Also, I recognize when I don’t know something that comes up during conversation, I should ask others and not try to check my phone. If all participants don’t know the answer, I still should not find the answer because I know I can’t control myself to continue to browse the Internet after I have found the answer. And I know the other person or persons in the conversation will feel left out, per the point I made in the beginning of this paragraph.
Closing thoughts
This week, I crossed my 50 day mark of meditation.[1] It isn’t 50 consecutive days, but I still see the effects it had on me. I feel closer to my body than I have before and I’ve reduced my general anxiety. One of the things therapy helped with in my past is recognizing when my body tenses u during stressful situations. I have not been practicing that behavior as much until I started meditating again, and now I recognize the internal battle I’ve been struggling with everyday. Mrs. Turkle’s book shined light on some other areas that weren’t apparent to me I might also be struggling with. Not every case she wrote about applies to my life, but of the number that did and wrote about here, I have some action steps I’d like to try out. I know I might not be successful with some of my initiatives, and that’s okay. If I didn’t try, that would result in how I’ve approached self-help books in the past. The advice is sound, but because I have no action in place to change my behavior, I continue to fall into my own traps.
[1] Since writing this piece, I have stopped meditating. I crossed 60 days and stopped when I went on my trip to Thailand.
People who run marathons are sadistic. The feet wear down after a dozen or two dozen miles. Full recovery takes a days. Mental capacity gets beat up. Hunger sets in. To say at the very least, this was my state on Sunday. And I’m saying I’m sadistic.
You think after my first marathon, I wouldn’t run again. Despite the critics, I threw myself back in the pool.
Critic: “Why would you pay to run?”
The event is an incentive to get in shape. I dragged myself on extended runs because paid to participate.
Critic: “But why? You could run on your own?”
I guess so, but I like running in large groups. Plus, I like being catered to by marathon volunteers. In this event, that includes the police.
After the run, I love getting small ego boosts when I tell someone I ran the San Francisco marathon. I get an extra boost when they told me how much of an accomplishment that is. I admit, I’m shallow.
Critic: “Are you crazy?”
You should have asked me that the first time around.
The SF marathon is held annually. This year, 27,000 runners took the marathon challenge. I feel proud to have finished under the time limit. But I feel like crap that I made some rookie mistakes. Please don’t make these mistakes.
Run faster than your training pace.
I thought my pace was 11 min per miles. It’s not. I found out my Fitbit can’t measure distance when my strike width is smaller than normal. That difference meant my time was longer than 11 min per mile. Of course, if I only use my Fitbit to pace, that doesn’t matter because the references would be the same. But here’s the kicker; I was still running faster than my “training pace”. I screwed up big time and felt miserable by mile 11. Also, I was surprised I was only at mile 11 when I got to that mile marker.
Run together, alone. Initially, I ran with my earbuds. For 13 miles, I thought I could drown the pain out with music. Not the case at all. I stopped more often with my earbuds in than without. After mile 15, I was about to find at least one chatting partner until the end of the race. I feel grateful to run into chatty folks. They helped me keep a running pace. Also, after I took off the earbuds, I heard a ringing in my ears after. Don’t listen to music too loud!
Train on an irregular schedule. In addition to running, I was also doing gymnastics strength training. Instead of focusing on running a few miles a day, I took more time contorting myself in strange positions. I couldn’t keep a good routine going during my 2 and a half months of training. My legs paid the price.
Run with worn out shoes. I used the same shoes from my first race. 8 months ago. Please don’t do that. My feet hurt unevenly. The right foot hurt more than the left. The traction was all gone. The padding was worn in. For a short distance, that’s fine. For a long distance, it can lead to terrible injuries.
Don’t pack snacks. I needed an extra snack after my stomach gave way. I left an extra Clif bar in my car and completely regret it at the halfway point. The tail-gaters parked close to the finish line were terrible people. I could have slugged one of them in the face if I had the energy to do it.
Take many caffeine shots. The gel packs are a great boost, but use them sparingly. It turns out they give me cramps. That’s extremely unforgiving when I need to sustain a steady pace. I had a really bad muscle cramp towards the 3rd quarter that I shook it off by running more. It came back in the end when I tried to sprint through the last 0.2 miles.
Now that it’s all said and done, I’m glad I ran again. I got to meet people from all over. I got to suffer with people from all over. I got a lot of cheers from all over.
Someone in the race told me, “Not everyone can do this, you know.” She’s right. Not everyone can run a full marathon. But, you’ll never know if you don’t try. I put myself in the arena, and I hope this is your invocation to begin.
The dark masks a new moon as we continue down the streets of Charleston. The tour guide walks us to the entrance of an alleyway. The iron-rot entrance gate is shut and pad-locked.
“Behind this gate is a narrow alleyway leading to the Utilitarian Church’s cemetery,” said the tour guide. “The church locks the gates in the evening to keep out trespassers. I’ll tell you why when we circle around the corner.”
We follow the guide to a small parking lot past an antiques store.
“Just over these walls is the aforementioned cemetery.” The guide points at the 8 foot high cobblestone wall. “Years ago, that gate was not locked and was opened to the public at all hours. That is, until the antiques dealer stumbled through it late one night. You see, he was working late, passed midnight. He didn’t notice the time pass, baffled when he locked at his watch. He gathered his things and decided the alleyway would be a faster route to his car. He had never walked in the alleyway this late at night before.
He locks up his shop and walks down this alleyway. About halfway, he notices a grave mistake. There are no lights; it’s pitch dark.”
The group looks around. There are street lights all around us illuminating the area.
“These lights you see today were installed a few years ago,” the guide continued. “This incident occurred two and a half decades ago. Folks, I assure you, the path was dark.
Not too sure where the dealer was going, he stumbled on a few headstones. Suddenly, he saw a lady in a wedding dress.
‘Excuse me,’ he says, ‘do you know a way out of here?’.
The lady gestures to follow her. Without giving it much thought, the dealer obliges. He thought this woman was peculiar with this eerie glowing presence. She walked into a tree and disappears. The dealer is in shock and runs back the way he came. He runs out of the gate and takes the longer route to his car, swearing never to go through the cemetery again.
The next day, he tells his friends about the encounter. Some people are intrigued by the ghost and try to retrace his steps in finding the woman in the wedding dress. After one too many trespassers, the church got annoyed by the attraction, so they decided to lock the gate. This barred people from entering. As you can see here, no one was going to go around and climb the 8 foot high cobblestone walls.
On one particular night, for whatever reason, the church forgets to lock the doors. A pedestrian decides to see what’s beyond the gate and discovers the woman in the white dress. He calls out to her, but she doesn’t respond. Like the antiques dealer, he sees her disappear into the tree.
The next morning, the man returned to the cemetery but found no grave near this tree. From the description these two men gave, we don’t think this is the ghost of the serial killer. We believe this was Miss Annabel Lee.
It’s the 1820’s. Annabel was a frail young woman who fell in love with a sailor. Because the parents disapproved of this courtship, they would meet every night in the cemetery under this tree. Before the sailor was sent off to duty, he promised he would marry her when he returned. Sadly, Annabel died of yellow fever. On her deathbed, she asked her parents to be buried in a wedding dress. They obliged and buried her somewhere. The area she was buried was never marked, so we don’t know where the grave is. It would take a few months later for the sailor to find out, and he was totally devastated.
Edgar Allan Poe wrote about Annabel in his last poem. He named it after her, “Annabel Lee”. A few months after publishing the poem, he died.”
Then, the guide tells us something unbelievable.
“The reason I think Edgar Allen Poe wrote about Annabel is he was the sailor. The timing checks out. He spent time in Charleston in the 1820’s. He was in the navy before he was married. And most evident was how grim he looked after his time in the Navy. Check out his before and after picture.”
The tour guide holds up his iPad and shows a side by side comparison of Edgar Allan Poe as a sailor and much later after becoming famous.
Edgar Allan Poe in the NavyEdgar Allan Poe later life
We left that spot and continued the tour, but I was left wondering if the legend is true. I did an Internet search last week with very inconclusive results. I don’t think the truth matters though. It got me to think about fabricating reason to the supernatural, and how it tells a compelling story. If the truth were uncovered, I think the story would be mundane and boring. At least this way, we can put a reason to Edgar Allan Poe’s grim face.
Alas, I’ll stop it with the ghost stories. If you enjoyed this, go check out Charleston or Savannah for yourself. Take the ghost tour and decide if the ghosts are real. Or just listen to some great stories about these city’s pasts. They have some great storytellers.
I went on a ghost tour in downtown Charleston where the tour guide told us real ghost stories. His stories were enlivened because we would bear witness to the sighting locations.
First, the tour guide introduced us to the ghost in the jail house. Over a century ago, a confederate prisoner occupied a prison cell in this jail house. One night, he heard footsteps down the hall. It was late so the prisoner thought it was a guard. When he looked up, he saw a woman in a white dress. He felt a chill as she walked passed his cell, laughing hysterically. Years later, the prisoner writes the experience was more horrifying than the dead bothers lost in battles.
The jail closed down and was abandoned for decades. In the early 90’s, a tour guide stumbled into the space and decided he should tell ghosts stories there. He started a ghost tour service and saw business boom. One late night, after telling his ghost story, he broke horror movie rule number 1: Don’t wander off alone. He walked down a long corridor saw a women in a white dress. He shined a light at her asking if she was lost. She smiled at him and walked into the wall. He was taken back and ran off. The next day he resigned from his tour business.
Who was this lady? The tour guide believes she was a serial killer from the colonial days. Her husband and she killed over 30 people. They were captured and sentenced to death. After the beheadings, her body mysteriously disappeared. Perhaps she’s haunting the jail house because no one knows where her body is.
In my quest in developing my data visualization skills, I’m finding validation to be a common interdisciplinary concept. For example, in music, you validate hitting the right notes, keeping beat, and listening to your pitch. In engineering problems, you validate theoretical calculations with empirical data. In business, you validate the business needs with return of investment calculations and customer satisfaction with surveys or field studies. In relationships, we’re validating our perception of the other person. Along the way, when we forget to validate our performance, assumptions, or perceptions, we falter. We play a terrible piano recital. We cause downstream problems in the production line. We take a loss in next quarter’s revenue. We begin to distance ourselves from who we love.
We can classify validation as passive and active. Passive validation is when we gain validation without expecting it. A core essential of validation is feedback loops. Feedback loops are outcomes of validations that when triggered, feed back to the process. Test driven development embraces this by having the developer write tests before code. The rule of thumb is “red, green, refactor”. Red refers to running the test and seeing it fail. Typically, when tests fail, the printed output is red. Green means to write code and see if the tests pass. Typically, passing tests are printed green. Refactor means trying to make that code you just wrote more robust. “Could this piece of code be written better.” Because you already wrote the test, and the code you wrote works, refactoring does not harm. In fact, if your refactored code does not work, the test will give you feedback, invalidating your new code. At that point, you can revert back to the old code.
Active validation requires an effort to test our perceptions. In my data visualization journey, I’m learning how validation works at each level of the process. At the top level, a visual designer asserts the problems of a target user and determines if this problem is best supported with a visualization tool. As a developer, I find myself missing this step of domain validation. Jumping straight to code before thinking about the end user is a smell of disaster. You may be solving the wrong problem or generating a new problem for the user. The old adage that more technology is better is not true. It reminds me of the film, “This Is Spinal Tap” where one of the band members shows the documentarian that his amp goes to 11. The documentarian asks, “Why don’t you just make ten louder and make ten be the top number and make that a little louder?” The band member replies, “These go to eleven.” Building tools for the tool’s sake is missing the mark.
I hate to admit it, but I find myself relying on intuition rather than verification. It takes energy to validate your intuition. But while this may be a short-term loss, it’s a long-term gain, and humans find it hard to perceive long-term gains. This is where awareness can come in handy. Without awareness, we can let confirmation bias get the better of us. Confirmation bias is the fallacy of using purely coincidental evidence to confirm our intuition. With a heightened awareness, we force ourselves to realize we’re making a confirmation bias, and we must validate what we are thinking. Here’s an example. Why do some voters want Trump to be the next president of the US? I find this question really difficult to answer. I’m not a Trump supporter, so I made my own hypotheses. But, I haven’t talked to a single Trump supporter, so my hypotheses will not get validated. Having awareness means while I think I know what’s going on, I don’t have the slightest clue, and I’m painfully aware of that fact. If I wanted to know, I’d go to a Trump rally, interview some of the supporters, look at polls and surveys on the demographics of the voters, and ask experts.
Validation applies to teams. In a production line, you want to decrease your batch size and intervals of work. At each stage, there are feedback loops that validate whether each batch is valid. The result is an increase flow in production. When I was manufacturing stents, each batch size was small enough where we would only sample 5 to 10 parts per each stage of the process. Of course, final quality assurance checks 100% at the very end. If the parts were invalid at a stage, the batch would be removed from the production line and another batch would be added to the production line. The outcome was a faster output and better worker satisfaction. When you don’t have checks at each stage, errors get downstream, meaning a bad batch would waste time in production because you wouldn’t find out until the final quality assurance checkpoint.
Here’s an action to takeaway. Find one problem you’re repeatedly doing. Propose a solution to that problem. Purposely try to make that problem happen again. If it doesn’t happen, you’ve properly validated your solution. If not, propose another solution and try again.
Footnotes
The Pragmatic Programmer is full of tips like “Coding ain’t done until all the tests run”.
“Red, Green, Refactor” is a corollary to this.
Although I only brushed over the top level, there are three other levels.
Tamara Munzner writes in her textbook, Visual Analysis and Design, about the four types of validation.
They are domain validation, abstraction validation, idiom validation, and algorithm validation.
Abstraction validation is testing the translation between domain terms and visual data terms.
Idiom validation is testing the right tool for the right job.
Algorithm validation is benchmarking the algorithms and determining if they’re performant.
The production line example is loosely taken from the three ways described in the book,
“The Phoenix Project”,
which describes software and dev-ops as a production line.
It’s worth a read if you’re in software and you’re having issues in your team’s pipeline.
I repeat the same pattern every few months. I’ll stop being productive on personal projects. I’ll replace it with an obsession, and it takes over my life for the next few weeks. It’s great if the obsession promotes healthy living, like marathon training or yoga. But this past month, it was an obsession with film.
And I mixed this obsession with the feeling of guilt. Every week, I see the task of writing this newsletter. And every week, I follow the same routine. Monday comes and Monday goes. Tuesday morning, I feel guilty I let my readers down. Rinse and repeat the next week.
The obsession began when I started watching a documentary series called “The Story of Film: An Odyssey”. It was a 15 hour series chronicling world cinema since its inception to the early 2000s. About halfway through, I wanted to watch many of the films mentioned. That’s when I found the Criterion Collection. Or rather, re-discovered. I knew about Criterion through their collaboration with Hulu. I thought they were a collection of American films. But it’s much, much more. The Criterion Collection includes films from around the world that cover nearly all decades of film. I was determined to watch some of them and own a few.
On my little journey, I learned most physical Criterion discs include supplemental material, booklets, and books. I also learned about their restoration process for old films, learning there’s an art in film preservation and that we’ve lost many great films over the years. I also learned of their custom artwork for their covers. What I’m trying to say is, I learned about Criterion’s brand. I feel in love with their brand because of this attention to detail. Loyal fans of criterion will speak highly of these things. It almost feels like an Apple cult-like level. I was determined to buy one to see what the big hype was.
Not wanting to pay for such expensive media, I found my local used records and movie store. I hadn’t been there before. When I stepped in, I remembered why I like these stores. I lost myself in the sea of aisles scanning through albums I’ll never listen to. I get excited wondering why someone purchased this record in the first place. Nested behind the soundtracks were an entire section dedicated to Criterions. I was amazed at the selection. I walked away with “Spartacus” and “High and Low”, a Kubrick film and a Kurosawa film. I was not disappointed.
For the next few weeks, I found myself pouring through the collection, either renting some of the films from the library, watching them on Hulu, or binging on the sale from late last month. I found myself collecting films I wouldn’t have watched a few months ago. Silent films? Yes. Foreign Italian films from the neorealist era? Check. I now feel more adept at hearing film director’s names and reciting one of their films.
Tonight, I’m watching Persona from Bergman. 7 minutes in and I know I’m in for a treat. But I must still make time for writing. Writing grounds me not to stray too far away in this little obsessions of mine. The time I spend writing this newsletter has paid back in helping me understand myself better. Today, I feel more confident about writing again. The truth is I felt like I lost my way with writing during the end of January. I sunk myself in film, and now I feel refreshed, ready to talk about some pending items I have in store. In a way, film restored my writing. Watching these directors at the height of their craft really inspires me to lose myself in creativity. So, let us begin another few months of newsletter goodness. I know I’ll enjoy it.
Tonight was the end of my dodgeball season. Here’s a quick list of lessons learned. Some lessons translate to business. Some translate to personal progress.
It’s not about the individual effort, it’s about the team effort.
When you’re the lone dodger out there, you’re team will still be yelling at you.
I’ve been a Javascript developer for the past year and a half. By reading the “You don’t Know Javascript” series, I’m hoping to hone my vanilla Javascript skills and have a deeper knowledge of the language.
In Up & Going, I’m hoping to review the basics and understand more deeply why the language has the set of tools it has, and perhaps a deeper understanding of why we write Javascript the way we do.
When you strive to comprehend your code, you create better work and become better at what you do.
Preface
This You Don’t Know JavaScript book series offers a contrary challenge: learn and deeply understand all of JavaScript, even and especially “The Tough Parts”.
I like this attitude as it focuses on the bits of the language I have to deal with time and time again. It helps me understand the behavior of Javascript without blindly looking at a TypeError with a quizzical expression.
i.e. Cut out the buzzwords. Learn the language
Chapter 1: Into Programming
Explains programming at a high level. I may skip large sections of this.
literal value are values that are itself and are not stored. e.g. in the statement, y = x + 4;, 4 is a literal value.
Expressions are the reference to variables, values, or set of variable(s) and value(s) combined with operators.
Assignment expressions assign a variable to another expression
I’m reviewing this because these basic building blocks can be fundamentally different. In Go, assignments can be completely different
Review later: Javascript compiling in the first two chapters of Scope & Closures
The prompt() function opens an alert with an input. You can assign the function with a variable. age = prompt("What is your age?");
We take it for granted that specifying the variable in an assignment is typically on the left.
Side tangent: Are there languages that do the opposite?
Some lesser known assignments in JS include
Remainder assignment x %= y
Shift assignments x <<= y
Shift bits left or right by a certain amount. The above example shifts bits to the left.
Bitwise assignments x &= y or x = x & y
The above example pertains to bits, using an AND logic.
AND logic table
Bit
Bit
Result
0
0
0
1
0
0
0
1
0
1
1
1
values added to the source code are called literals
Implicit coersion is when you’re making a comparison against two different types. The == operation is ‘loosely equal’ and uses implicit coersion. For this reason, it should be avoided because it can cause unexpected bugs.
More on this later in Chapter 2 of this title & Chapter 4 of Types & Grammar
Code comments help other humans understand your code. It’s a communication point.
Comments should explain why, not what. They can optionally explain how if that’s particularly confusing.
Note to self - focus on why, and less on what.
Static Typing - variables adhere to type enforcement
Dynamic Typing - allows a variable to represent a value regardless of type. Javascript adheres to this.
State is tracking changes to values as the program runs. In redux, we keep a global state to track the user’s progress through the application.
Constants are declared once and don’t change. In ES6, when you declare a constant once, it throws an error if there is an attempt to change it. This is like the static-tying type enforcement.
A group of series of statements strung together are called a block. A block is contained within curly brackets. { .. }
In Ruby, there are different ways to show a block. In fact, there are different types of blocks, like your general block, procs, and lambdas.
Conditions throw an error if its expression between the parentheses are not a boolean.
“Falsy” values are converted to the boolean false. “Truthy” values do the opposite. More on this in Chapter 4 of Types & Grammar
An iteration occurs each time a block is called.
Warning: For a variety of historical reasons, programming languages almost always count things in a zero-based fashion, meaning starting with 0 instead of 1. If you’re not familiar with that mode of thinking, it can be quite confusing at first. Take some time to practice counting starting with 0 to become more comfortable with it!
I rarely use do..while loops. Here’s the syntax.
do { console.log('How may I help you?'); // Help the customer numOfCustomers = numOfCustomers - 1;} while (numOfCustomer > 0);
Like C, the Javascript for loop has three clauses.
The initialization clause
The conditional clause
The update clause
Reusable pieces of code can be gathered into a function
The lexical scope, or scope, is the programming term to tell us where our variables can be accessed.
function outer() { var a = 1; function inner() { var b = 2; // we can access both `a` and `b` here console.log( a + b ); // 3 } inner(); // we can only access `a` here console.log( a ); // 1}outer();
In the example, you can’t call inner(); on the outermost scope. It can only be called within the outer function scope, as shown.
More on lexical scope in the first three chapters of Scope & Closures
Chapter 2. Into Javascript
Note: After reading through the first chapter, I realize I don’t really need to review too much. I’m going to skim this chapter and only note the things that I really think are worthwhile. Otherwise, I will keep notes on this chapter to a minimum.
No value set type is undefined.
I didn’t know null is an object type. Weird bug probably will never get fixed.
typeof null is an interesting case, because it errantly returns “object”, when you’d expect it to return “null”.
To learn: Javascript’s symbols. I’m well aware of Ruby’s implementation of symbols like :symbol_example, which are used in many different contexts like classes. Will elaborate more on this in the ES6 portion.
Arrays and functions are subtypes to objects. In my introduction to JS, I assumed “everything is an object”.
Built-In Type Methods extend the power of Javascript. These methods are like String.prototype.toUpperCase.
Coercion comes in two forms: explicit and implicit
explicit is with both types the same.
implicit is when type conversion can happen.
Coercion is not evil. There are times when you may need to convert types.
List of falsy:
"" (empty string)
0, -0, NaN
null, undefined
false
Things that can be truthy
non-empty strings
non-zero, valid numbers
true
arrays, empty or non-empty
objects, empty or non-empty
functions
== checks for value equality. Coercion allowed.
=== checks for value and type equality. Coercion not allowed. Also known as strict equality
Some simple rules for equality of when to use == or ===.
If either value (aka side) in a comparison could be the true or false value, avoid == and use ===.
If either value in a comparison could be of these specific values (0, "", or [] — empty array), avoid == and use ===.
In all other cases, you’re safe to use ==. Not only is it safe, but in many cases it simplifies your code in a way that improves readability.
I’ve played it safe with this, but I may revisit using == more often, if it doesn’t violate the rules. Important note: think critically before use.
You might think that two arrays with the same contents would be == equal, but they’re not
When comparing numbers with strings, the strings get coerced into a number. When the string contains non-number characters, it gets converted to NaN and when comparing with < or >, NaN is neither greater nor less than a value, hence returns false.
Hoisting is when a variable is moved to the top of the enclosing scope. (conceptually speaking)
Okay to use a function before it is declared as function declarations are hoisted. Generally not good with variables.
Use let for block scoped variables. For example, in an if block, you declare a variable you only want to be used within that block, use let.
function foo() { var a = 1; if (a >= 1) { let b = 2; while (b < 5) { let c = b * 2; b++; console.log( a + c ); } }}foo();// 5 7 9
Strict mode was introduced in ES5. Noted with "use strict".
Strict mode disallows implicit auto-global variable declaration from omitting the var.
I feel computer science needs to put unnecessarily long titles to items. Immediately invoked function expressions (IIFE) are involved upon declaration.
An example use case was with Highcharts and creating an options object. You can’t always assign a key with a function, so this is one way around it.
Closure is a way to “remember” and continue to access a function’s scope.
I think of this as a way to tweak functions without having to write out more functions.
This is least understood by JS developers, and I think I know why. To me, it’s a function generator, although that’s an improper term because Javascript can create a generator function, which is a totally different topic.
The most common usage of closure in Javascript is the module pattern. Modules let you define private implementation details (variables, functions) that are hidden from the outside world, as well as a public API that is accessible from the outside.
Executing the module as a function creates an instance of that module.
The this operator reference depends on how the function is called. That will determine what this is. There are four rules of how this gets set. More on this later in the this & Object Prototype book.
Prototype links allow one object to delegate properties from another object. What this means is a property prototype linked is not attached to that object but to its original object (which could in turn, just be the proto property of Object).
Do not think of applying prototypes as inheritance. It follows a pattern called “behavior delegation”, delegating one part of an object to another.
Bring the old to new with polyfiling and transpiling.
A “polyfill” is to take a definition of a newer feature and produce a piece of code equivalent to the behavior for older JS environments.
An example is lodash that has a bunch of features from ES5 and ES6 which some frameworks utilize, like forEach and map.
Careful writing your own polyfill as you should adhere closely to the specification.
Better yet, use the vetted ones.
Transpiling is great for new syntax. It is a tool that converts your code to older coding environments. You can break down the word “transpiling” into transforming + compiling.
arguments can be used functions to determine which arguments were passed in. It is not a reserved word, so you can assign it to a different value. When calling it, it outputs an array.
The book series doesn’t cover Non-Javascript, like the DOM API. But you need to be aware of it. DOM API could actually be written by the browsers in C/C++.
The document object is a “host object”, a special object that has been implemented by the browser.
Chapter 3: Into YDKJS
This chapter is a preface to the other books. I’ll skip these notes as I’ll be covering this in more detail in those posts.
I ran across the node-glob and realized I didn’t know what a glob is. I read through the node-glob documentation and found out globs are a form of pattern matching. I realized I had been using globs for a long time, like the wildcard notation, without knowing its name.
adventure time glob
Wildcards
There are generally two wildcards you can use for glob functions.
* - “any string of characters”
? - one character
There are also brackets, where the character must be one of the following, or given as a range.
[abc] - one of “a”, “b”, or “c”
[a-z] - between the range of “a” to “z”.
You can also line this up with a ”!” to mean not in the following bracket.
[!abc] - not one of “a”, “b”, or “c”
[!a-z] - not in the range of “a” to “z”
The examples above are used in UNIX-based systems. These commands are slightly different in Window’s Powershell and SQL. For more information about those systems, you can read the Wikipedia article about globs.
Node Example
var glob = require("glob");// options is optionalglob("**/*.js", options, function (er, files) { // files is an array of filenames. // If the `nonull` option is set, and nothing // was found, then files is ["**/*.js"] // er is an error object or null.});
Everybody gets critiqued. Great composers like Beethoven have been critiqued. In this review of Beethoven’s Ninth Symphony, the London Symphony picked up this quote from a Rhode Island newspaper.
The whole orchestral part of Beethoven’s Ninth Symphony I found very wearying indeed.
Several times I had great difficulty in keeping awake … .
It was a great relief when the choral part was arrived at, of which I had great expectations.
It opened with eight bars of a common-place theme, very much like Yankee Doodle … .
As for this part of the famous Symphony, I regret to say that it appeared to be made up of the strange, the ludicrous, the abrupt, the ferocious, and the screechy, with the slightest possible admixture, here and there, of an intelligible melody.
As for following the words printed in the program, it was quite out of the question, and what all the noise was about, it was hard to form any idea.
The general impression it left on me is that of a concert made up of Indian warwhoops and angry wildcats.
Some phrases pop out at me here.
great relief
made up of the strange, the ludicrous, the abrupt, the ferocious, and the screechy
it was hard to form any idea
Indian warwhoops and angry wildcats
What amazes me is easy it was for this critic to put down the famous symphony. The descriptions paint a very bleak picture of Beethoven’s 9th Symphony, painting the part the critic can recognize, the choral part, as a great relief. Yet, the adjectives used for the rest of the piece draws the critic’s point overboard.
For this critic, Beethoven’s music did not try to copy his classical contemporaries like Mozart or Haydn. Instead, Beethoven injected his character in his music, heralding the sense of individualism felt amongst the contemporary thinkers of the time. It was the time of American and French revolution. It was the time of change. It was the time of new ideas and the tearing down of the old. Part of Beethoven’s character are the strange, the ferocious and the screechy. That’s what makes a Beethoven unique. This is the critic’s failings in understanding Beethoven’s music.
Beethoven
Portrait of Ludwig Van
When I’ve listened to the 9th Symphony, I think it’s a masterpiece. Indian warwhoops and angry wildcats do not come to mind. The good news is, the critic’s words haven’t carried over to this century. Beethoven’s 9th Symphony is still played around the world today. Negative criticism for the sake of bitching and moaning from purely subjective responses rarely get carried over as time passes.
If you though Beethoven’s criticism was bad, wait to you hear what this critic says about Anton Bruckner, a Austrian composer from the 19th century. This voiced his opinion to the public, hailing Bruckner as “the greatest living musical peril, a sort of tonal Anti-Christ.” Here’s his argument.
The violent nature of the man is not written on his face—for his expression indicates at most the small soul of the every-day Kapellmeister. Yet he composes nothing but high treason, revolution, and murder. His work is absolutely devoid of art or reason. Perhaps, some day, a devil and an angel will fight for his soul. His music has the fragrance of heavenly roses, but it is poisonous with the sulphurs of hell.
Holy christ! If you give Bruckner’s Symphony No. 7 a listen, you wouldn’t think malice towards to composer who wrote this music. You’d probably shake his hand. Allowing time to pass, we see this critic for who he really is, a hater. It doesn’t matter which century you live in, these haters exist. The critic didn’t recognize the Romantic styling of that century. The sweeping melodies. The dramatic accents and motifs carried over by Beethoven. To Bruckner’s credit, he composed two more symphonies, the ninth unfinished, as well as a smaller pieces for another decade. Like Beethoven, Bruckner is still played today.
Anton Bruckner
A picture of Anton Bruckner
As a side note, you may have already realized it. These two pieces were admired by Hitler. This was not intentional, and I would have missed this reference if it was not for Wikipedia. So, to leave this on a high note, Wikipedia says the adagio from Bruckner’s Symphony No. 7 was played on the official radio announcement of the German defeat at Stalingrad on the 31st of January, 1943. Karma, I guess.
So I ran to the end of the road. And when I got there, I thought maybe I’d run to the end of the town…
— Forrest Gump
I ran across the Golden Gate Bridge, a half marathon, and a full marathon.
Wrote 43 newsletters. Also, I have every one of you to thank to being readers, from the early readers or new subscribers.
According to my calendar, I’ve had dinner with a new stranger, many turned friends, each week from January to June, on average. That means some weeks may be 2 while other weeks may be 0.
Watched 29 movies I had not seen before. This is my lowest number in the last decade. Recommendations: Whiplash, Wolfpack, The Search for General Tso
Read 45 books. See recommendations below.
Went to a number of Maptime meetups and got my intro to map making. I took on my first freelance gig as a result.
My friend took me on my first backpacking trip up in Castle Rock.
Implemented inbox zero.
A former friend broke up with me. Can’t be all shine in 2015.
Counter to that, I made up with old friends. Yes, plural.
Participated in a number hackathons. The exact number eludes me. Didn’t win any of them.
As I flip through my journal, I’m reminded the first few months of 2015 were riddled with Caltrain suicides. I wrote a newsletter about it, and the death count doubled by the end of the year. Very, very sad.
Went to Atlanta for the first time.
My job survived an acquisition.
A friend and I helped my trans friend through facial feminization surgery. In Chicago!
Got to watch some excellent speakers. Highlights: Dr. Silvia Earle, Gavin Aung Than, Gretchen Rubin, Elizabeth Holmes, Nancy Duarte, & John Resig. Note to self: Reflection write-ups would be great journal entries.
Visited a few national parks. First time in Joshua Tree and Zion National Park. Obligatory photo at the end of the post.
Toured the Pier 9 space
Finished 3 large paintings, divided them up to 90 recipients, and included typed letters as Christmas cards
The Book List
The Gift: Creativity and the Artist in the Modern World. Thanks to Helin for the recommendation. Each chapter goes through a different aspect of gift giving, leading up to analysis on the poetry of Walt Whitman and Erza Pound. Perked my interests especially after writing the newsletter post on Nerina Pallot and creativity.
The Crossroads of Should and Must: Find and Follow Your Passion. An extension of Elle Luna’s Medium post. Mixed with her drawings, it really inspires you to find your “must”. This was my first giveaway from the short-lived giveaways I was giving to the subscribers of this newsletter.
40 Days of Dating. I read through the blog. I still picked up this book. On my first read through, I realize this is why I love books. The detail in this book is stunning and it reminds me books are a different medium than the web. Plus, the experiment just draws you in. Two friends who decide to date for 40 days. You can’t stop wondering if they’ll make it past 40 days.
Breaking the Chains of Gravity: The Story of Spaceflight before NASA. Honestly, this isn’t fair to put this on my list. The print copy hasn’t come out in the US yet, so I read it through Audible. I’m a sucker for the history of science. I had no grounding for the pre-cursors to NASA, so this overview made me giddy.
The “Goal”
Last year, I wrote up a list called the “Fuck-it” list. It recognized all the things I didn’t want to do or care about. Instead of a list, I’m going to give myself one goal. Finish research and start writing a novel.
I gave myself this goal 6 years ago, and I accomplished my first novel in 2012. It was about 200 pages and will never see the light of day because of how bad it is. This novel I’m going to write should be publish-able. I’m staying hush-hush about what it will be about. Can’t spoil it for everyone this early on.
Errata
Enjoy this picture I took somewhere between Northern Arizona and Southern Utah.
A few years ago, Radiolab ran an episode called “Finding Emilie”. Emilie Gossiaux and her boyfriend, Alan, were art students in New York City and the story chronicles Emilie’s fatal accident and recovery, where her mother and Alan almost pulled the plug when all hope seemed lost for finding Emilie.
One tragic day, Emilie was hit by a vehicle and was rushed to a hospital. The doctors stabilized her condition, except there was too much damage to her optic nerve where even if she recovered, she would no longer be able to see. When her mother and boyfriend, Alan, made it to the hospital, Emilie was in a coma.
Emilie was partially deaf and had hearing aids. After the accident, the doctors didn’t put her hearing aids back, so for days, the doctors tried to talk to Emilie to see if she was out of her coma, but she did not respond. They did not know Emilie needed hearing aids, and because of this, the doctors thought there was no hope for Emilie. Needless to say, the doctors were wrong, and I won’t spoil the rest of the episode. I’ve placed the link conveniently at the end so you can go listen to it after reading the rest of this letter.
Back in October, Emilie had an art exhibit at the StoreFrontLab in San Francisco. The exhibit was part of a larger series celebrating the life and work of Oliver Sacks. Emilie hosted a spaghetti night where she served spaghetti on a ceramic bowl that wasn’t glazed, and gave out laser cut forks for everyone to twirl and eat their spaghetti with.
The sauce stained the bowl, placing a permanent mark that says, “someone ate spaghetti in me”. The permanent markings of the spaghetti stains reminds Emilie of her childhood. Taking a part of this experience forced me to think of the creativity of blind artists trying to represent what matters to them in a medium besides visuals. The feel of the bowl was raw and unfinished, much like the texture of stone. You can hear the spaghetti splash around as you dig into it. You can smell the generic Preggo sauce and all of its familiarity, even after the local season of tomatoes were on their way out.
Emilie at her art show serving spaghetti
The meal was frustrating. The fork was oddly shaped, and you could twirl the spaghetti with ease. And I imagine that’s the point. Stripped of your sense of sight, what are you left with? I’ll say it again, frustration. Yet, it exposes me another point of reflection about other’s experiences that I would otherwise not have experienced on my own. It showed me another layer of appreciating art, that it can expand beyond the visual aesthetic.
Have you ever felt like you’ve stalled in improving your skills? You reach 20,000 miles driving your car, and you think, “yeah, there’s nothing more I can do to improve my driving skills.” You feel comfortable clocking in at work, mindlessly going through the actions because you’ve done this work a thousand times before, and there’s absolutely nothing that will shock you. I’m not critiquing the boredom one could face droning through work. I’m making an observation that you don’t even notice when you’ve reached a peak in growth.
graph of peak growth
At First, How Much
This week, I read Scott H. Young’s article, “Failures of Intensity”. In the article, Scott argues for skill acquisition advice to be geared towards how much you should do rather than what you should do. Scott mentions there is lack of information about how much time it takes learning a new skill as well as frequency. Almost all advice columns out there are about what to do to learn a new skill.
If I open the top stories on Medium, you’ll find posts titled “These 12 Habits Are Killing Your Productivity”, “Building your design portfolio? Here are 8 things I wish I’d known”, and “How to be like Steve Ballmer”. The last article, it started with the word, “how”, but when you get to the meat of the article, you find out its telling you the “what”, as in “what do you need to do in order to achieve success like Steve Ballmer.” I’m not trashing these articles. I’m sure they’re all a perfectly good read, but Scott was right. They’re focused on telling people the “what” and not of “how much” and “how frequent”.
How much is enough to learn a skill? Last year, I read Josh Kaufman’s book, “The First 20 Hours: How to Learn Anything … Fast!” Like most books, Josh first breaks down the question of what. For this book, it’s the what of of skill acquisition. But unlike other books, the second half is Josh chronicling the first twenty hours of learning a new skill. He breaks down the first twenty hours of learning yoga, programming, touch typing, the game go, the ukulele, and windsurfing. He learned it wasn’t worth pursuing touch typing after twenty hours, but it was worth pursuing programming a bit further.
What we can learn from Josh is to give new skills a shot. Give yourself a goal or milestone to reach by twenty hours. At the end of the twenty hours, you take a moment of reflection. Do you continue to put more effort in this skill or let it go?
Reflection Points
If you decide to continue with your skill, place checkpoints to review the progress. All too often, we don’t reflect on where we are. If you check in with yourself at fixed time intervals, like every week or every month, you can review the progress you’ve made. Then, you can adjust the frequency of how much more practice you’ll need.
When you don’t have checkpoints for reflecting, you could be comfortable with mediocre skills and stop working on growth. This is especially harmful if you wish to continue growing. I have made this mistake repeatedly. Years into my piano lessons, I’d practice with an automated mind, letting myself play the music without thinking about timing, about playing the correct notes or keeping good form. Bad habits such as finger slip mistakes creeped in and stuck, in other words, I learned to adapt to hearing the bad note. Before I knew it, I wasted a good 100 hours practicing music that didn’t sound great. I stalled on my skills and wasn’t going to improve them with more time spent on practice. I had fallen pray to my autopilot mind.
Flow is the balance between doing a task that is challenging while having a high skill level in that task. Deliberate practice is being in that flow state. Regular practice regards all practice, whether deliberate or not. I won’t talk much about flow, as that was the topic of a previous post. If you find yourself in that stalled funk, here are a few tips to help you get out.
Work on something new. In piano practice, this is as easy as playing a new song in a new genre. Last month, I found my fingers tired and sore trying to play improv salsa. It was a genre I hadn’t tackled before, and by the end of my practice, I remembered what a beginner felt like.
Write about the process. This past week, I started using Vim as a text editor. After a year of using Sublime and Atom, I put those aside and took two hours to go through a tutorial called vimtutor. The tutorial taught me the basics of how to use Vim. At the end of the tutorial, I wrote up a piece about my experience with the tutorial, mainly to help myself with what I learned, but with a bonus side effect that it may help someone else just starting out with Vim.
Reflect with a teacher. Whenever I feel I’m not challenged enough, I talk to a teacher, a boss, or a mentor who has a higher skill level. Talking to someone with a higher skill level, you may be able to extract what you could do next. I was at a data visualization unconference two weekends ago and people I talked to pointed me to bunch of new programs to sharpen my toolset.
Be the teacher. If you know the skill well enough, you should be able to teach it to others. A lot of times, you won’t know there’s gaps in your knowledge or skill until you have to teach it to someone else. It makes you reflect on being the beginner again. During Thanksgiving, I tried to teach my 8 year old cousin how to play a 14 and up card game. When I was explaining the rules to my cousin, I used large words he couldn’t understand. Looking at my cousin’s dumbfounded face, I realized I’m still terrible throwing away large words in favor of shorter ones a 8 year old could understand. Reflecting on this situation, I need to work on communicating more clearly to children.
While I’ve recommended this book in the past, it’s a great book to recommend again. “Pragmatic Thinking & Learning. Refactor Your Wetware” by Andy Hunt has more tips about getting out of the rut.
Remember skill acquisition takes time, and you should focus on the journey rather than the destination. Perhaps twenty hours utilizing one of these tips might just be what you need to grow into the master you wish to become.
Vim tutor is a great guide to get you started with vim.
Getting Started
To start with Vim Tutor, simply type vimtutor in your terminal.
The tutorial says it should take about 25 to 30 minutes, but because I was also messing around with writing up this post and including their lesson summaries, all trying to use vim, I spend a bit longer with it.
If you’re running low on time, I’d say do each lesson in a 5 to 10 minute window span each day. You’re allowed to take it slow.
I learned it’s about the journey, not about the speed in which it takes for you to pick it up. It’s there where you can start nitpicking on how to do “x” or “y”.
The next following sections are summaries of what vim tutor teaches you. I modified some of the summaries to best fit markdown format.
Lesson 1 Summary
The cursor is moved using either the arrow keys or the hjkl keys.
h (left)
j (down)
k (up)
l (right)
To start Vim from the shell prompt type: vim FILENAME <ENTER>
To exit Vim type: <ESC>:q!<ENTER> to trash all changes.
OR type: <ESC>:wq<ENTER> to save the changes.
To delete the character at the cursor type: x
To insert or append text type:
i type inserted text <ESC> insert before the cursor
A type appended text <ESC> append after the line
NOTE: Pressing <ESC> will place you in Normal mode or will cancel an unwanted and partially completed command.
Lesson 2 Summary
To delete from the cursor up to the next word type: dw
To delete from the cursor to the end of a line type: d$
To delete a whole line type: dd
To repeat a motion prepend it with a number: 2w
The format for a change command is:
operator [number] motion
where:
- **operator** - is what to do, such as d for delete- **[number]** - is an optional count to repeat the motion- **motion** - moves over the text to operate on, such as w (word), (to the end of line), etc.
6. To move to the start of the line use a zero: 0
Undo & redo actions
To undo previous actions, type: u (lowercase u)
To undo all the changes on a line, type: U (capital U)
To undo the undo’s, type: CTRL-R
Lesson 3 Summary
To put back text that has just been deleted, type p . This puts the
deleted text AFTER the cursor (if a line was deleted it will go on the
line below the cursor).
To replace the character under the cursor, type r and then the
character you want to have there.
The change operator allows you to change from the cursor to where the
motion takes you. eg. Type ce to change from the cursor to the end of
the word, c$ to change to the end of a line.
The format for change is:
c [number] motion
Lesson 4 Summary
CTRL-G displays your location in the file and the file status.
G moves to the end of the file.
[number] G moves to that line number.
gg moves to the first line.
Find command
Typing / followed by a phrase searches FORWARD for the phrase.
Typing ? followed by a phrase searches BACKWARD for the phrase.
After a search type n to find the next occurrence in the same direction
or N to search in the opposite direction.
CTRL-O takes you back to older positions, CTRL-I to newer positions.
Typing % while the cursor is on a ( , ), [, ], {, or } goes to its match.
Substitute command
To substitute new for the first old in a line type :s/old/new
To substitute new for all ‘old’s on a line type :s/old/new/g
To substitute phrases between two line #‘s type :#,#s/old/new/g
To substitute all occurrences in the file type :%s/old/new/g
To ask for confirmation each time add c:%s/old/new/gc
Lesson 5 Summary
:!command executes an external command.
Some useful examples are:
(MS-DOS)
(Unix)
description
:!dir
:!ls
shows a directory listing
:!del FILENAME
:!rm FILENAME
removes file FILENAME
:w FILENAME writes the current Vim file to disk with name FILENAME.
v motion :w FILENAME saves the Visually selected lines in file FILENAME.
:r FILENAME retrieves disk file FILENAME and puts it below the cursor position.
:r !dir reads the output of the dir command and puts it below the cursor position.
Lesson 6 Summary
Open a line in insert mode
Type o to open a line BELOW the cursor and start Insert mode.
Type O to open a line ABOVE the cursor.
Append text
Type a to insert text AFTER the cursor.
Type A to insert text after the end of the line.
The e command moves to the end of a word.
The y operator yanks (copies) text, p puts (pastes) it.
Typing a capital R enters Replace mode until <ESC> is pressed.
Typing :set xxx sets the option xxx. Some options are:
icignorecase ignore upper/lower case when searching
isincsearch show partial matches for a search phrase
hlshlsearch highlight all matching phrases
You can either use the long or the short option name.
Prepend no to switch an option off: :set noic
Lesson 7 Summary
Type :help or press <F1> or <Help> to open a help window.
Type :help cmd to find help on cmd.
Type CTRL-W CTRL-W to jump to another window
Type :q to close the help window
Create a vimrc startup script to keep your preferred settings.
When typing a : command, press CTRL-D to see possible completions. Press <TAB> to use one completion.
Post Tutorial Reflection
The tutorial got me through the basics, and only scraps the surface of what you can do with vim. One of the things I found useful after going through this tutorial was saying out loud what the command I was using does.
For example, if I was using the w command, I would say “word”. If I was going to the word, and I was using the diw command, I would say “delete instance word”. Using words instead of letters helps with getting the commands down. It’s the same technique I used when learning the bash terminal, e.g. with pwd, I would say in my head, “print working directory”.
I wrote up a much longer post about vim that I will publish soon.
I got into vim from a co-worker.
I thought it’s that clunky text editor in your terminal you must use when you have ssh into the linux server.
However, I’ve grown to understand vim is much more than a text editor.
It can also be an IDE.
When I first used vim, it just looked plain an boring.
The black screen with hard to understand shortcuts.
There weren’t any line numbers.
I didn’t even know how to exit the damn program for a good 5 minutes.
Then I started figuring it out slowly.
Vim has different modes.
Vim can do macros.
Vim can find things with the same grep commands.
And it’s quite expandable with the limitless plugins.
Vim is an endless rabbithole where you will get sucked in hours just setting it up.
But it’s your customization.
And that’s the beauty of vim.
Best advice - configure vim, and for that matter dotfiles, on your own.
Don’t blindly copy and paste configurations, because you’ll never understand them all.
Modal Editing
Quoted from Nick Nisi
Change the meaning of the keys in each mode of operation
Normal mode - navigate the structure of the file
Insert Mode - editing the file
Visual mode - highlighting portions of the file to manipulate at once
Ex mode - command mode
Line Numbers
Where are my line numbers?
Simply type the following.
:set number
To remove the numbers, you can use this command.
:set nonumber
Configuration
If you’re sick and tired of setting everything up every time you boot up vim, simply place the configuration in your configuration file.
You can find the configuration file at this location.
~/.vimrc
Here’s a truncated version of my general settings.
syntax enable " Enable syntax highlightingset tabstop=2 " set the tab stop at 2 spacesset shiftwidth=2 " set the shift width by 2 spacesset noexpandtab " do not expand tabset number " show line numbers
I’m currently using Monokai, mainly because it was a default I had with Ruby on sublime.
I set it up using vim-monokai, which I actually want to go back and figure out how to hook it up with vundle and have it linked to the repo.
I want to figure out how to do this better, so I placed a todo with the wiki from the vim wikia.
Let’s keep this a bit informal. I’m thankful for a year of newsletters, thankful for all of you reading, and thankful for all of the support y’all have given me. Without your support, I don’t know if I’d be writing essays every week. This weekly piece of writing is a way to bring together as well as synthesize what I’ve learned throughout the week. Now that it’s been a year, I wanted to look back at what I wrote and take a look at the journey.
The Numbers
Since last year, I’ve sent 45 letters. That tells me I’ve missed 8 letters. Back in October, I announced I would cut back on my load of work by publishing an essay once every other week. However, I want to challenge myself in the month of December to bring to you all original essays once a week again.
Challenge Accepted
When I started, I had six subscribers. Today, as of November 29th at 8
, it’s 36. The thing I love about these letters is I get to share it with all of you. Yes, I’m pandering, but it’s also the truth. I get this thrill that rushes through me when I hit send, and subsequently hit, “Yes, send it now” because Tinyletter wants to make sure I don’t send a bad message to you folks. It’s saved me on two separate occasions.
Combined, the total word count for my letters is 48,476. Keep in mind I love to lift quotes, passages, and re-post other stories my friends have written. That’s pretty close to the NaNoWriMo goal of their 50k word count. To give some perspective, “The Great Gatsby” has a word count of 47,094. “Slaughterhouse-Five” has a word count of 49,4459. You can check out Commonplace Book’s website for more novel word counts.
Reflections
Between December to June, I was releasing these letters on Medium. I stopped posting in June because I wasn’t getting much readership on Medium. When I published on Medium, I hoped more strangers would read what I posted. I tried advertising on social media, but did not have much luck besides two posts, one in which was recommended by Dave Hoover and another which was following the Caltrain suicide news circus. With Tinyletter, it’s guaranteed these emails will reach my particular audience. I will only post to Medium today if I think the post has a clear message and should reach a wider audience. Most of my posts on Medium have on average 5 reads. It should be noted a read is when a user scrolls through the article from top to bottom counter to a page view which could also include a bounce behavior, i.e. a user clicks on the article and immediately goes to a different website or closes the tab or window of the browser.
And it should be noted I’m not trying to write for an unknown audience. I’m writing for my friends and whoever wants to join in on my essays. I’ve stated on the Tinyletter landing page that I’m not going to social media to post a longform essay, because no one will read it there either. On Facebook, we are inundated by the endless scrolling content where a wall of text would not appeal to anyone’s eyes. That post would be surrounded by an environment of short, multimedia content that shouts, click on me, and has a shelf life of two seconds.
The last thing I will say about writing this piece every week is I really enjoy the writing process. I’m selecting my words carefully, trying not to use too many adverbs and quips that add no value to the writing. One of my friend’s pet peeves is the world albeit. “We can go to the store, albeit by the time I get there, I may have to use the restroom.” In this context, albeit was not necessary to get the point across. On that same thought, I try not to use words like “just”, “finally”, and “definitely”, which are overused in my writing.
Again, thanks for all of you for reading my posts. One year goes by so fast, I forget easily how much I’ve written. I hope you continue to join me for the next year as I have more to share with y’all.
“Impostor syndrome can be defined as a collection of feelings of inadequacy that persist even in face of information that indicates that the opposite is true. It is experienced internally as chronic self-doubt, and feelings of intellectual fraudulence.”
— Taken from Caltech Counseling Center
It’s easy to latch on to a concept to answer the question, “What’s wrong with me?” I asked that question about a year into my last job. I knew the ins and outs of laser cutting metal rods. I knew the basics in making jigs and fixtures for manufacturing custom parts. I knew how to break down problems using the scientific method. But my work project was ten weeks late, and I was feeling quite defeated that I wasn’t the right person to do this job, which was a slippery slope in thinking I wasn’t cut out to be in this line of work. I didn’t know it at the time, but I thought what was wrong with me was I had imposter syndrome.
To add insult to injury, it was revealed in my performance review that my boss had given me low marks on competence. Their feedback was unhelpful in giving actionable steps in how to perform better, and I was left with low self-esteem. I thought I didn’t have what it takes to be an engineer, that I was a fraud, and at some point I was going to be fired. It was at that point where I started to really slip up, not making any progress on the project I was working on. My boss, sensing my discomfort, pulled me in a meeting with the CEO and a co-worker and told me to pair up on this project, because two heads are better than one.
But the plan backfired. Three more weeks past by, and neither my co-worker nor I could figure out how to complete the project. Initially on the project, I didn’t ask for much help, so we decided it might be best to get the CTO to help us. But his practice of teaching us in a yoga-like manner did not help either of us in creating a viable solution. We had many false breakthroughs, eventually resulting in my resignation. It would take the company the next year and different engineers to complete the project.
Reflecting back on it, I realized that it wasn’t just my mental performance that was bleak, but also the fact that it really was an incredibly difficult project. This experience wasn’t an attack on my competence, nor is it a tale of imposter syndrome. It is an example of believing self-doubt was a bad attribute to have. This week, I read Alicia Liu’s post on “Imposter Syndrome Is Not Just A Confidence Problem”, which I took away that I need a healthy dose of self-doubt. I’m unable to know everything, so not knowing something is a gut feeling that I should pursue other avenues of exploration rather than just seek within. This could be asking for help, doing research on what other’s have done in the past, or talking to a rubber duck to re-access the problem. And it turns out, experts and masters of their own field can have moments or large lapses of time of self-doubt. That’s when you’re supposed to put on the kettle and think.
For nearly three months, there has been talk about when the rain will come in California. We have started to treat El Niño as the second coming of Christ where nature will save us all. I know those conversations are in the context of the drought, but taking a step back, they sound spiritual, as if nature is our savior. And yet, we don’t know this to be the case. We’re unable to predict the future, especially since nature tends to work in mysterious ways. We call our models predictive because they’re just that, a prediction.
This morning, it started raining for what seems like the first time in a very long time. It rained earlier this year with the same intensity, but it felt like eons ago. I woke up early since I have a hard time adjusting to Daylight Savings Time, and it was dark all around me. I could hear the pitter patter of the raindrops on the roof, and I was shaken up, unable to get a good night’s rest. I find it peculiar yet fascinating how my body can forget how to sleep in a loud environment.
I’m not going to hail this as, “El Niño is here! Let’s praise nature our drought is over!” One downpour can not make up for years of no downpour. Perhaps I’m being a pessimist because I don’t want to believe in one grand event solving everything, a deus ex machina. I guess this is to say I have optimism from the success of small wins rather than one large miracle. You decide what this rain means.
However, I’ll embrace this event. It’s a good shake up to the monotonous routine and the banalities of everyday life. At least, that’s the feeling I got when I woke up today.
I was turned on to audiobooks by accident. I had a free half hour of commuting and didn’t want to waste it staring out the window or listening to the same people on podcasts. I was commuting to and from school at the time, and I kept hearing the same Audible ads on TWiT, a weekly podcast about tech. I decided to give the free subscription a try on Audible and give an audiobook a chance. While the first book I read didn’t change my life, I understood the medium a lot better. I could commute and listen to an audiobook and be excited to continue a story I had left off the day before. It’s a lot like a TV show, and the format is different than what you would find on a podcast, e.g. interviews, round table discussions, and reporter segments.
Some 100 audiobooks later, I owe it to audiobooks to introducing me to authors I now adore and giving me an opportunity to learn something new. On my road trip last year from Dallas to San Jose, I finished reading “The Goldfinch”. I’m in the camp of people who didn’t care too much about the second act of the book as I felt it could’ve been trimmed down from it’s mostly mundane descriptions that parallels a Dickinson novel. During these long and arduous reads, I was glad someone else was reading them to me as I was yelling expletives in the car at how much the main character was an idiot. But that’s the beauty of audiobooks. The reader keeps reading through the audiobook even if you’re excited, in tears, or just plain bored. If it wasn’t for the audiobook version of “A Storm of Swords”, the third book of “A Song of Ice and Fire”, I don’t know how I could’ve mustered to read through the red wedding.
When I talk to a non-audiobook reader, they have a hard time understanding the value of an audiobook. When someone tells me listening to an audiobook is not reading, I ask them whether they used to listen to their teacher read to them, or their parents, or whether they read to their kids. Many famous works came from oral tradition, like the Greek epics “The Iliad” and “The Odyssey”. “The Hitchhiker’s Guide to the Galaxy” was a radio program before it was in print form. When someone tells me they couldn’t sit an hour listening to a book, I ask them how long they commute for or how long a day they sit at a desk. When someone tells me they can’t bear the narrator’s voice, I ask them to try another audiobook. Stephen Fry does great narration in the Harry Potter series, giving each character a unique voice. Granted, non-fiction can be very dry if the narrator’s voice is dry and not vivacious.
When I talk to an audiobook reader, we tend to hit it off about what we enjoy reading, who’s our favorite narrator, what we’re looking forward to read next. If nothing else, you should listen to audiobooks too as a conversation piece at your next dinner party. Entertain your guests with the lore of “A Song of Ice and Fire”. Tell them about your foray into the bibliography of Einstein. Recite what you learned about empathy from Brené Brown. And, if audiobooks don’t work, why not pick up a book?
This past Saturday, I finished my first marathon. To add difficulty to my challenge, it was a trail run marathon. I didn’t realize this detail when I registered. But coming in faster than expected blew me away. I’d like to acknowledge the people that helped me and try to point out it wasn’t a journey done on my own.
Thanks to Megan who started me on a regimented running routine earlier last year. By motivating me to help her running journey by doing couch to 5k, I learned the value in pacing and intervals.
Thanks to Simon for repeated using the phrase, “The Obstacle is the Way.” I chanted that mantra throughout the run, and it helped my inner game by focusing on the run rather than the finish. Conveniently, I read Ryan Holiday’s book by the same name earlier this year. If you want a taste of stoic philosophy, I’d recommend the book.
Thanks to Christin for introducing me to trail running. I found out I get an adrenaline rush running up and down mountains. She also helped pick me up from my half marathon, which I completed earlier this year.
Thanks to Carlos for letting me know about this marathon. He didn’t participate, but is egging me on to do the LA marathon next year. I haven’t made up my mind about that one yet.
Thanks to Victor for helping me train in Arizona. Nothing can capture those four days of wild and crazy trail runs through different terrain.
Thanks to Teagan for taking me to my marathon. Thanks to my dad for picking me up.
And lastly, thanks to the countless people who have given me support on my journey. I really couldn’t have made it without you.
I’m still exhausted and stiff from my run, and I hope to come up with a longer, more cohesive essay next week.
Before I started sending Christmas Cards, I didn’t get the point of sending cards. The only times I sent cards were if I found them funny or I was told to send one. In late 2011, my roommate Teagan asked if I could help her make a Christmas Card to send to her family and close friends. She wanted to show her parents the friends that she lived with. I accepted her task, which started the Christmas Card tradition.
Teagan grew up with them. She told me her parents got all six siblings and her together for one shot. She missed that tradition, being away from family for the four years she had been in college, and really wanted to participate in her family’s tradition. I didn’t grow up with them. My family had a one-way gift exchange, receiving a card from other family or friends.
Teagan and I decided to mock the generic format of the Christmas Card. The card had individual pictures of each roommate in the background followed by a center picture of everyone together. The generic heading, “Merry Christmas”, curved it’s way in on the bottom. I was glad our roommates participated in our absurd card, and I printed enough for each roommate to distribute 6 copies of the card. When I gave it to my family, there had a hoot. I remember they laughed so hard, and I wanted to cherish that moment. However, I was disappointed I didn’t have more to give.
Year 1 of Christmas Cards
The next year, I wanted to continue this gift. I decided this should be a running tradition. I created another card of just myself. On it, there are three panels. In the first panel, I dressed up like Santa Claus, the next panel, I was taking off the costume, and the third panel, I made a “ta-da” pose. Laughing at it for a minute, I thought this would be perfect. With the disappointment of having only 6 cards to distribute last year, I preemptively ordered a hundred copies. To my dismay, only 30 people replied, leaving me with 70 unusable Christmas Cards. But, I shouldn’t say it wasn’t worth it because those who were sent the card gave me their gratitude.
Year 2 of Christmas Cards
Instead of keeping to the same format year after year, the following year, I went all out. Recognizing I probably wouldn’t need to send too many out, I sent out invitations telling everyone I would send pictures of us together on the postcard. By making this simple change, my number of recipients grew by over two-fold. This time, everyone was elated when they received my card and saw their own face on it. I learned personalization is key to making a better Christmas Card with greater emotional weight.
Last year was quite wonderful. I changed it up again, creating hand-drawn card of something that reminded me of them. For one of my friends, I drew a rock climber because I knew that’s an activity she enjoyed. On another card was a petri dish because my friend worked in a lab at UCSF. However, I was worn out when I found out I had to create 140 of these cards. I had just graduated from Dev Bootcamp and wanted to keep in touch with everyone I had met.
Despite feeling worn out, this has been a high point each year. Being able to reach out to people I haven’t talked to in a year and making something meaningful for them. It’s a great feeling, and I wish everyone had the time to do this. I’ve changed my position about gift-giving, and I really want the people I know I am thinking about them.
The Idea
This holiday season, I want to do something new and fresh. Different ideas floated around my head, and I settled on an idea that I think will be really fun and therapeutic. I would like to give every a piece of a large art piece and type-written letters from an old typewriter.
I started water coloring this year, and think it would be really neat to do a few large canvases. I’ll take those canvases and cut them up in card sized squares. The idea is the gift recipient gets a part of a larger masterpiece. I stole the idea from Nerina Pallot who did this as prizes for supporting her new album.
Last year, I learned hand writing 140 letters may result in minor forearm muscle cramps. Instead of hand writing, I wanted some way of showing I wrote the letter with meaningful though. Enter a typewriter. I’m using an Olivetti Praxis 48, an electric typewriter from the late 1960’s. Some of the relic’s buttons don’t function. I’m looking at you, letter z, 2 and shift key! I’ve chosen to use plain dot matrix printer paper with the side perforations. These two items pair well as it shows a world we’ve left behind.
Olivetti Typewriter
Now I know I could send this all digitally. But, there’s something about the physical medium that changes the perception of a gift. An email can whiz by you without a moment’s notice. A physical card is something you must take the time and look at. Instead of that 6 second email interaction, you may take up to a few minutes looking at my Christmas Card. Some websites have caught on to this, such as Reddit Gifts or Metafilter’s CD swap.
Some of you may be wondering why am I starting in October? To be honest, I’m lazy. The administrative tasks, such as asking everyone for their mailing address, filling out each envelope, putting the stamps on it, going to the post office, obtain postage for international letters, and physically mailing them, are boring. Plus, last year, I was late, so I’m hoping that proverb, “The early bird gets the worm,” actually works as implied.
The Value of a Gift
On my friend, Helin, recommendation, I read a book called “The Gift” a few months back. The book has this sector about monetary gifts versus gifts with no inherent price tag. A takeaway I learned was how I should continue this gift giving process without thought about receiving something back. There’s an implicit value that is reciprocated that may not take the form of a tangible gift, like writing a letter of recommendation when asked. The moment the gift has a price tag, the monetary value distracts from the emotional pull of a gift, and the gift recipient use the monetary value of the gift as an indication of the value of the relationship, e.g. a cheap gift means a poor relationship.
In addition to the benefits to the gift recipient, the cards have a major benefit to the gift giver. These Christmas cards are a gift for me to initiate a conversation to my contacts. It’s my lazy excuse to talk to someone I may have not reached out to for a year. It bugs me that people enter and exit your life, while the only thing keeping you from reaching out with a simple phone call, text, or email. I’m reminded of the poem by writer Charles Hanson Towne.
Around the corner I have a friend,
In this great city that has no end;
Yet the days go by, and weeks rush on,
And before I know it a year is gone,
And I never see my old friend’s face,
For Life is a swift and terrible race.
He knows I like him just as well,
As in the days when I rang his bell,
And he rang mine. We were younger then,
And now we are busy, tired men:
Tired with playing a foolish game,
Tired with trying to make a name.
”To-morrow,” I say, “I will call on Jim
”Just to show that I’m thinking of him.”
But to-morrow comes — and to-morrow goes,
And distance between us grows and grows.
Around the corner — yet miles away,…
”Here’s a telegram sir,…"
"Jim died today.”
And that’s what we get, and deserve in the end:
Around the corner, a vanished friend.
— Charles Hanson Towne
I never expected this ritual to occupy so much time. But I think of the benefits make it worthwhile, of catching up with old friends, of being able to go beyond normal gifts, of being creative. I absolutely love doing this, too much to the point this is what I think about on my free time.
“Thats morbid,” everyone responded when I tell them I’ve been reading the New York Times collection of obituaries. I disagree. I read an obituary a day to test a practice I read about from Austin Kleon from his book, “Show Your Work.” Mr. Kleon states it simulates the feeling about being hit with a life altering event. My expectation was I would be grounded in the reality, being reminded of my inevitable death if I read them. This is to simulate the feeling that you know your end will come some day without having to go through a life altering event. At least, that’s the theory.
The sum of every obituary is how heroic people are, and how noble.
— Maira Kalman
A few years back, I read Gretchen Rubin’s “The Happiness Project” where she concluded she had a deeper contemplation of life after reading memoirs with catastrophe. I’m reminded of similar consensus of feeling uplifted and reflective after I read Victor Frankl’s book, “Man’s Search for Meaning,” and Primo Levi’s “If This Is A Man”. Both are about the concentration camps and neither dwell on the gross detail nor have a negative outlook on life.
The obituaries writers spotlight the recently deceased accomplishments, major struggles, and the family survivors. There’s some vesiage of their personality with a mixture of their accounts through a one liner quote with several second or third person views of how they made then feel. For example, Patricia O’Neal’s obituary included an annodote from people who worked with her on set. However, there are major shortcomings of an obituary as it does not capture the small moments, the cumulative effect they had to the community, all the short stories of their experiences. It’s highly condensed writing to laud their efforts in life. And that’s okay, because that’s the format of an obituary. This is unlike biographies like that of Peter Barton, Steve Jobs, and Oliver Sacks. Those have little gems of knowledge that one can use in their everyday lives. Obituaries try to tie things up with a knot of someone’s passing.
After reading one a day for the past two weeks, I don’t feel life altering different. I’m a little more aware of myself, of the small things I do that I can change like being gratuitous to friends, family, and strangers, going out of my way to put that extra effort in my work, and learning to slow down. Actually, that last one is something I struggle with on a daily basis, but more of that in a future post. If that’s the kind of kick you want in your daily routine, open a newspaper or buy a collection of obituaries and read one a day. And don’t let anyone tell you that’s morbid because the effect is quite the contrary; obituaries celebrate life.
Obituaries are like near-death experiences for cowards. Reading them is a way for me to think about death while also keeping it at arm’s length. Obituaries aren’t really about death; they’re about life… . Reading about people who are dead now and did things with their lives makes me want to get up and do something decent with mine. Thinking about death every morning makes me want to live.
— Austin Kleon
Sometimes the best part of a show is the curtain call, when the job is done and the actors bask in their well-deserved accolades. Here is a wonderful book filled with curtain calls. Count me among those on my feet and applauding like mad.
—Stephen King
Austin Kleon’s book, Show Your Work, references the practice of reading obituaries in Chapter 1, “You Don’t Have To Be A Genius”. He also writes about this in a blog post after being inspired by Maira Kalman.
Gretchen Rubin’s book, The Happiness Project, read memoirs with catastrophes in Chapter 8, “August”
If you haven’t read Victor Frankl’s book, Man’s Search for Meaning, it has sound advice even though it’s over a half century old. Same with Primo Levi’s book, If This Is A Man.
I have two Ted Talks that share the same vein as this essay. One is by Ric Elias about how he thought he was going to die on a plane during the Hudson River plane landing incident, and what he changed in his life after. The other is by Sam Berns, who proves he can do anything even with his genetic disorder, progeria. He died in early 2014.
On the fourth day of my trail running adventure last week, I was a torn mess. My left calf was aching, my joints were abused, my willpower depleted. And yet, I continued, with the sun beating down at 104 degree Fahrenheit weather. I rab on the golf concourse in the middle of Death Valley, possible the lowest point of the world. The concourse was covered with salt, reflecting the sun’s radiant light and adding an extra source of irritation.
At this particular point of my journey, I was slowly losing the inner game. My conscious self got defensive, shouting “you’ll pass out before you get to the finish line.” I felt faint for being outside for a half an hour, and water was a short lived refresher. It’s the last quarter-mile stretch, and all I wanted was an ice tea by a cool, ocean breeze.
This happened the first day too. It was at Joshua Tree, and I had a low reserve of willpower from a lack of sleep the night before. I wanted to stop running; my mind was the greatest obstacle. I tried the strategies I picked up from marathon training to stop thinking by placing focus on breathe. In the back of my head, Simon was telling me “the obstacle is the way.” My travel campanion was running beside me shouting words of encouragement. I try to listen and not let my mind get the better of me.
Death Valley in the summer is miserable as people say. It’s dry, you can faint by heat stroke, and you can’t imagine how there’s life in the desert. But glancing around, there were bushes, ants and other inserts around. I’m unsure if life was giving me a sign, but I was going to make it. At least, that’s the mantra I decided to use.
At the finish line, I panted heavily. “I made it,” I thought, but it was a large mental struggle. I found it hard to explain this to my travel friend as we packed up out gear to leave. My head throbbed from the lack of proper sleep. I wanted to leave the desert, go to a cooler place. I wanted to let my aching left calf rest.
That’s the inner game. An internal struggle to bypass the thoughts of quitting, of giving into the temptation that what you’re doing is not worth it, of letting your body do the last 10%. I look back at the situation now and realize those efforts were crucial. We may not understand why, but we need to rely on our gut feeling and stop listening to our head.
I came across this sentence when I was reading through the book, “40 Days of Dating”. “I think whatever you do, just make sure you’re responding and not reacting. It’s easy to get comfortable. Take your time, please.” Timothy Goodman, graphic designer and one half of the “40 Days of Dating” project, was responding to a fan of the project on Facebook, and he decided to give the fan some advice about failed relationships. He is trying to tell this fan to be more mindful in her relationships by sliding back into an abusive relationship. Reacting is allowing the emotions to come out. Responding is allowing the mind to analyze the consequences of what those emotions will produce. “I don’t want to be one of those people who just gets sucked back into a relationship because it’s more comfortable than having to start over,” says the fan.
I’ve written about feeling uncomfortable in the past, and it has an questionable counterpart, comfort. I remember I had this habit of venting to my co-worker on how terrible my life was when she asked me how my day was. She would feed off of that energy and tell me everything that was wrong with her. It was doing me harm because it would leave a bad aftertaste for the rest of my day. Instead of thinking about what my words meant, I allowed my mind to react to this moment as a time to unload all of my problems. It would have been better to avoid those conversations and talk about those things that were bothering me in a safe place.
It’s not enough to identify this problem areas once. Dealing with uncomfortable situations should be a daily habit. There are plenty of moments throughout my day to practice responding to situations rather than reacting. I was on the road earlier today and someone cut me off. Instead of acting out and honking my horn, I listened to my body’s emotional reaction and let it go. The process of letting go is different for person to person. I try to find my non-judgement headspace. If that doesn’t work, I try to take a stab at rational thought, like “I have the ability to control my behavior, and honking the horn doesn’t solve the problem.”
I absolutely love this story by Maurice Rabb, instructor at Dev Bootcamp, that he shared on Facebook.
I had an odd experience today. This morning I was hurrying to meet Audrey and Ella in the Loop. I hate paying for downtown parking, so I was doing my usual trick of parking south of 16th St and riding my folding bike north to the Loop. As I was preparing to pull into a small spot, I noticed that there was someone in the driver’s seat of the car in front of the space. I pulled up and asked > the woman, Excuse me, are you leaving?”
Lady: “No.”
Me (Seeing that no one was parked ahead of her): “Can you give me a foot?”
Lady: “Huh?” Turning towards me looking confused and annoyed.
Me: “Can you move up a bit so that I can get in the spot?”
Lady (Turning fully towards me and glaring.): “If you can’t get that little car > in there, YOU DON”T DESERVE THE SPACE!”
Me (taken aback and shocked by her profound stanktitudes): “Do you need to be > so FUCKING RUDE?!?”
I slid into the spot in one fell swoop. (In your face, asshole!) I hop out of the car and made my way around to the back. As I’m unloading my bike, I hear muffled Charlie Brown teacher style chatter from the woman - she’s unintelligibly and angrily loud talking me from her car. I immediately regret cursing at her and escalating the situation. As mean and ignorant as her > comment was, I’m concerned she might key my car when I leave.
As a defensive move, I take a picture of her car to capture her license plate. As I’m unfolding my bike, she gets out her car yelling at me. She’s a > 60/70-something black woman. She’s now taking photos of my car.
Lady: “Look at all these scratches on your bumper. You obviously don’t know how > to park!”
I ignore her. (Dummy, didn’t you just see that pro valet parking attendant move > I just pulled? You better recognize, fool!)
She walks closer: “Look at all these scratches on the side of you car. You > clearly don’t know how to drive!”
I glare at her. Now she’s taking pictures of me. Now I’m livid. I step to her. > I’m right in her face, eye to eye.
Me: “You are rude!!” (Barely containing all the foul stuff I wanted to spit in > her face.)
Lady: “Don’t touch me! Don’t you think of touching me!!”
Me: “I’m not going to touch you!”
Lady: “You’re rude for cursing at me! I didn’t curse at you. Not all black > people are like that.”
Me: “You know. You are right!” (Still in angry yelling mode.)
“I shouldn’t have used profanity at you. I’m sorry.” (My face softening but > cheeks still tight.)
She takes two quick steps back in retreat. Her mouth opens to say something but > nothing comes out. She looks stunned. Finally, she speaks.
Lady: “I’m sorry, too.”
Awkward silence.
Me: “I’m sorry I lost my temper.”
I extend my hand. We shake hands.
Lady: “I’m glad we resolved this this way.”
Me: “Me too.”
We both smile a barely detectable smile.
Me: “I hope you have an easier day.”
Lady: “You too.”
I hopped on my bike.
Me: “Again, I’m sorry for losing my temper.”
She nods.
When I returned hours later, her car was gone. My car was unmolested. I wonder > what story (if any) she tells tonight.
I love this story so much because there’s mutual understanding between both parties responding in rational behavior, not allowing their heavy-handed emotional side get the better of them. It shows that even when we are at fault for our words, we can still act with dignity and respect if we look inward and reflect.
I will close with this. Identify one thing a day where you find yourself reacting instead of responding. When you’re in that situation again, stop for a second, it could go longer, and think about the consequences before you proceed with that action. You may be surprised by your behavior.
Last October, Carlos Bueno gave a lightning talk called “Science Education: Refactoring Computer Science.” In that talk, he talked about writing “Lauren Ipsum” and how it was easier to teach children about recursion than binary numbers. Recursion is the event when a function calls itself, creating a new stack. Binary numbers are a base two number system, primarily used by computers by way of electrical signals between relays and switches. Recursion is easier to explain to children because the concept of stacks are a lot easier to comprehend than the abstract world of counting by base two. As adults, it feels like it is easier to learn the binary number system because the idea of counting is relatively easy. When Bueno explained this to us, I was pleasantly surprised and it started me thinking about how we can teach the next generation about other ideas.
When I read Oliver Sack’s new autobiography, “On The Move: A Life”, that idea came back to me. Somewhere in the book, I really wish I could find the quote, Sacks writes about a colleague who died young and had a profound effect on Sacks that he must continue his life by writing about his work. I realized we continue to work through what others had to leave behind under unfortunate circumstance, whether it be circumstance or death. It is our duty to teach the next generation the ideas and worldview of the world so that they could carry them on and continue to improve them. Also, we don’t want the next generation to make the same mistakes as we do.
“When people die, they cannot be replaced. They leave holes that cannot be filled, for it is the fate — the genetic and neural fate — of every human being to be a unique individual, to find his own path, to live his own life, to die his own death.”
— Oliver Sacks, op-ed in The New York Times on learning he has terminal cancer
When I read this quote, I think of what the holes mean. The holes are the missing pieces, the partial pictures, a sliver of the what the dead thought. I believe poetry is a fitting analogy for what is left behind. Poetry is open-ended, goes into much interpretation, yet it is condensed and full of meaning. Homer, and perhaps those before him, distilled down the Trojan War epics, The Iliad and The Odyssey into lyrical language. I believe the descriptors of the characters was to help abide the memories of the audience so they can pass these stories down orally. We see this in other literature and famous folks with King Arthur of Camelot, Alexander the Great, Joan of Arc and countless others.
Two weeks ago, I met someone who was heavily influenced by Buckminster Fuller. He met Fuller when he was a kid and wished he could ask him a question about his work. But as he was too young, he didn’t get to read about Fuller’s concepts and ideas until he was a teenager, after Fuller’s death. Even with a partial understanding of Fuller’s ideas, he took them to heart and worked in the forestry department. He tells me he tries to apply Fuller’s ideas about nature to his everyday work. I love this story because it is metaphorically passing the torch. It should be noted that there’s a book about Buckminster Fuller entitled “Fuller’s Earth: A Day With Buckminster Fuller and the Kids” where Fuller literally gives children his philosophy in words the children can understand.
I’ll leave you with this. Uncork your mind from its secrets and spill out the good ideas. Help people around you, and those after you, understand why you made certain decisions, your struggles and forays into problems, and help us all collectively understand the world a little more.
I’ve been journaling more four years, one entry a day. I’ve skipped a few days here or there, but I go back and fill them in. The entries capture my daily mood, or current obsession, or the thing that’s been worrying me. Sometimes, I go back to some old entries and reflect upon myself of where I was a year ago, two years ago, or perhaps just last week. That window is a primary source of information, and not jumbled by my own bias of how I want to reconstruct the past. I’ve surprised myself many times before when I read these entries because I’ve reconstructed my memories of how I’ve felt, like we all do, glamorizing the pleasurable moments and hiding from our darkness.
These entries were always free form, sometimes filled with art, or rants about politics, or quotes I really like from a book I’m reading. Two weeks ago, I decided to take a break from this free form method and experiment with a Q&A format where I would ask myself a series of questions, like “What are you grateful for?”, “What would you do differently?”, and “What do you anticipate for today?”. Here’s a glimpse into some of those entries.
July 27th, 2015
What am I grateful for?
I’m grateful I was able to exercise this morning and that I remembered, even though I was late, to text my cousin “Happy Birthday”.
For those who really matter to me in life, I’ve tried to reach out to them on their birthday. It’s these little things in life that I cherish the most.
July 30th, 2015
Anything you’d do differently?
Don’t drunk order chicken wings at my local pizza restaurant — terrible wings. Also, don’t hesitate to go to the waiter and ask where your order is.
First, don’t get drunk on a Wednesday night. I was working the next day and had regrets the next morning. Secondly, the drunk mindset makes things up, like thinking the the food staff takes thirty minutes to make six chicken wings when in fact, the order was up and I just didn’t pester the waiter about where my food was.
August 6th, 2015
What could you take what you learned this week and apply it to the next week?
Start writing earlier and not be so hung up by the menial things. The little concerns I have throughout the day doesn’t mean much, so I should take the time to practice mindfulness.
That’s well said. Although contrary to the initial piece of advice, I’m writing this after work on Monday night when I should have finished this piece of writing the night before. But, as the second sentence says, I’m not sweating it.
Looking back at these entries, they’re more legible and start to tell a story about the day and sets the mood for what I was feeling. Over the years, I’ve learned that’s what I gain from writing everyday, an insight into my past behaviors, connecting dots of how the larger picture looks.
Do you keep a journal? Do you write everyday? Do you ever go back and read what you wrote?
The Solano Stroll in Berkeley is an annual event where the entire stretch of Solano Street is closed. Local businesses and residents would participate in turning the street into a street festival. The firefighter departments of Berkeley and Albany would come with a fire truck where kids could sit in the driver seat and understand what it could feel like to be the firefighter driver. Restaurants would bring out their grills and serve some street food. Clothing stores would try to give discounts for their end of season sales.
It was there, over fifteen years ago, where I started a collection of business cards. At the stroll, the street is littered with booths from local businesses, artists, specialists, and because it’s Berkeley, radicals. Each one of these booths had business cards there for the taking, so I ran up and down the two and half mile stretch to collect them all. Besides the booths, there were people on the streets handing out their own personal business cards next to their signs. One guy in particular was an artist trying to sell his ceramic pieces and made custom jewelry.
A normal response when someone receives a business card would be to commit to an action to it or, more likely, throw it away in the trash. I decided to keep the cards in a box, serving as a container for the Solano Stroll experience. But it expanded beyond the event. I found myself taking business cards from restaurants, gift shops, travel agencies, community boards, and other businesses. I collected the punch cards you would receive at sandwich shops. I collected the strange, square shaped ones. I collected the last one on the business card tray. One time, I entered a photo store, and as I was taking a card next to the register, the store clerk looked at me sternly and asked, “Why are you taking a business card?” Flustered, I scurried off, clenching the business card in hand.
On family vacations, I would fill the pocket of my suitcases with business cards from the various places we went. The cards transformed from words with contact information to personal stored memories. I have this particularly strange one from Taiwan that introduced me to their calendar system. 93? Whoa! Sometimes other paraphernalia would find its way into my collection, like tickets from the movies, plane rides, and the theater. One in particular comes in recent memory. I have this ticket stub from the Alcazar, a theater in Pattaya, Thailand that ran shows every night of their most beautiful lady boys.
Over the years, I’ve asked the central question to this collection. Why keep this up? As I said, most sane people would throw them away. A day before the planes hit 9/11, my grandmother visited the World Trade Center. She bought a bouncy ball from the gift shop that glowed after impact. When she came home, she gave this to me as a gift. I couldn’t see the ball more than just a reminder of the tragedy that hit this nation. A month or two after she gave me the gift, I lost it as I threw it on the school grounds. It rolled underneath the bungalow of my classroom and I felt devastated. The ball had this history I only knew about. That’s what these cards mean to me now, memories that remind me of specific moments of my life.
At a recent meet-up I attended, I was introduced to the concept of perceived distance. Perceived distance is the mind’s perception of how far you have traveled while absolute distance is the distance actually traveled. Obstacles could increase the perceived distance, like road blocks, traffic, rough terrain, and changes in elevation. At the meet-up, the speaker used the example of bicycling on the same lane as fast driving cars. Here in Silicon Valley, we have expressways connecting different cities where cars could drive easily 50 to 60 mph (that’s roughly 80 to 96 km/h for you non-Americans). When a bike has to share that same road, the biker will perceived the distance to be longer because of the stress of getting hit by a car.
This made me think about how similar the concept of perceived distance is to perceived difficulty. Sometimes I can be quite stubborn and refuse to do something because the initial action is cumbersome. I held off on writing an email for a whole month because I thought the writing would take an hour. In my mind, I place a 1 to 1 ratio between time and difficulty, meaning the more time it takes, the more difficult it becomes. In reality, the email took me 5 minutes to write and one click to send.
David Allen, author of “Getting Things Done”, talks about how to get incoming work done. If the activity takes two minutes or less, do it now. If it doesn’t, figure out the next action that must be taken, whether that is blocking off a part of your schedule to do it, defer it to someone else, or figure out an action at a later date. However, in my implementation of his system, that last part about taking the action at a later date never comes. I’ll have my inbox stack up and be left with an overwhelming number of 10, 20, or 30 minute activities.
When I read Kelly McGonigal’s book, “The Willpower Instinct”, I learned about willpower depletion and how easily we can be susceptible to wasting our time when in that state. To diverge from this path, I’ve been reduced to doing things while I have the self-control and drive to do them. But with a large stack of todo items that take longer than 2 minutes, there’s no possible way I can do that in the allotted time when I have the willpower to do them. This leads me to an unfortunate conclusion; I don’t know how to lower the perceived difficulty and stop overloading my schedule. I would actually like to hear how others deal with perceived difficulty and getting things done. What are some techniques you use to get things done?
Before I went to Iowa, fireflies were meaningless to me. Early last spring, my roommate bought a string of solar green LED lights and hung them on a tree. At night, they would glow in and out, simulating the fireflies lights. Living in Northern California for most of my life, it was easy for me to overlook this as a cheap gimmick. When my roommate installed them, I had a hard time finding the emotional pull they had for my roommate.
On my cross-country road trip last summer, I stopped for the night in Omaha. One of the locals invited me to a weekly Taco Tuesday event. The major difference in this event than others I’ve been to is the locals really make you work for the tacos. Locals ride their bikes on an old railroad tracks path paved into a bike path for ten miles ending in a outdoor seating restaurant that served cheap tacos. Luckily, at the half way point, there’s an oasis of booze called Margaritaville where you can stop, talk, and drink. I drove across the Mississippi River to Iowa stateside in awe of the flat landscape. By the time I got to the trail head, the sun was just starting to set and I was a bit worried I was going to have to ride in the dark. Much to my chagrin, the path was illuminated by fireflies. I gazed at the bugs, awed by their bright glow of hope. They seem to say, “winter has past, you can come out now”. Their presence allowed me to finally understand what many writers were talking about in those children books — a glow of summer.
I thought back to my roommate’s fake firefly lights hanging in our backyard tree. It was a representation of this kind of emotion where he would be taken back to his summers in Boston trying to catch them. I stopped my bike and tried to catch one. Although I didn’t have much success, I felt like a kid. I realized adults can have the empathy and nostalgia for a past childhood they never had.
And yet, I don’t understand how something as simple as a glowing green light could make me feel so happy. It set the setting, and for the rest of that night; they were the entertainment. It was more entertainment than any manufactured, designed, or advertised piece of media humans had developed. It felt pure, and in a way, the path I was taking was this magical journey down the rabbit hole. And appreciating these tiny things are why we live life, right?
Here come real stars to fill the upper skies,
And here on earth come emulating flies,
That though they never equal stars in size,
(And they were never really stars at heart)
Achieve at times a very star-like start.
Only, of course, they can’t sustain the part.”
― Robert Frost
With over half a year of writing these letters, I am taking the time to review the differences in my writing between the past and present. I haven’t noticed a difference in writing quality, to my dismay, but I’ve learned something much more valuable. I’ve learned the value of editing. Before, I thought editing was a cumbersome and not necessary. “Shouldn’t everyone understand my stream of consciousness?” It turns out, no, the reader cannot. When I went back to re-read my writing, I realized I couldn’t read it. I had to think of the context in which I wrote it in to determine what I was trying to say.
Programming helped build part of this muscle. For over a year, I’ve been reading and reviewing my code, and I’ve noticed holes everywhere. As I learn how to become a pragmatic developer, I notice the code I wrote in the past just isn’t up to my standards today. And the code I write today won’t be at the standards that I hope for tomorrow. With writing, I strive for the same things. I want it to be legible for the intended audience with hopes that they will understand my point of view.
It felt embarrassing having my audience read such verbose verbiage. For the past month, I’ve tried to cut back on using adverbs and other modifiers. I’ve scrutinized words such as “only”, “very”, and “just” and tried to cut them out. Now when I read through my writing, I immediately cut those things out as soon as I can.
I pass my essays through the Hemingway App to detect awkward sentences. For example, the app can detect passive voice and difficult to read sentences. In grade school, most of us learned to avoid these techniques. I didn’t comprehend these things until I started recognizing them as mistakes. When I had a friend edit my writing, I learned that it’s hard to recognize these things on your own. Speaking of editors, if you would like to help edit these in the future, reach out to me.
When I read writing from some of my favorite authors, I’m awed by their clarity and narration. I aim myself for that target, but I’m not quite there yet. I will need to deliberately practice more, but I recognize that I’m making progress. Also, I still loads to say, so I’m not going to quit writing anytime soon.
I’ve been experiencing heavy burnout over the past few weeks. I didn’t spare myself much time besides work, scheduled play, travel, and sleep. I’ve even deferred to eating out rather than cooking. The lifestyle, quite an unsustainable one, started to take a toll on my health. I took a run through Big Basin last weekend and was almost wiped out. I looked in the mirror at my pecks two days ago and saw sagging breasts and a round, bulging stomach. It was a pitiful sight since I use one visual metric as an indicator if I’m healthy, that of looking good naked. Some of those armpit wrinkles had their own wrinkles.
I took this time and started to reflect what was stressing me out. I stayed up later on nights where I should have gone to sleep earlier. I stopped exercising as much since late-April after coming back from Chicago, using travel as an excuse that threw off my exercise regime. I’ve been eating out when I have been used to home cooked meals. All of this sums up to looking at myself in the fitting room mirror at the mall staring at my own man boobs.
While a funny recollection, it scared the crap out of my. I have insecurities with my body shape, wearing loose clothing to hide some of those imperfections, and not doing anything about it. I know I could make the time, but with burnout, it is hard to feel elated to go for a run after work. I’m going back to basics, some may call it common sense, and work on the fundamentals again.
Don’t overload yourself
I switched over to the Todoist app, that worked quite well for a few months, but slowly piled up into ten daily tasks. I’m scrapping that out and re-doing my schedule to only handle one important task per day. Anything more that I accomplish will be a fun for the future.
The other thing is I’ve been overloaded with going back and forth between San Francisco and Palo Alto to go to events. I have to have a better, clear mission to do those things and know what events I can skip and which ones I should actually go to. It got bad over the past few weeks when I was going to an event every work day, which means more travel time.
Health Comes Primarily From Diet
In college, my big revelation was diet, not exercise, makes up most of the work needed to stay healthy. To stay fit, that’s where you introduce exercise. When I cut most sugar out of my diet, meaning no soda or juice, I saw results in my body. There were some side-effects, like getting these strange headaches along with sugar cravings, but after pushing through that hump, I have no regrets about that decision.
However, in most recent years, I’ve replaced those things with wine, which is a lot worse, especially when not in moderation. I will enact a limit of one glass if I do drink.
Listen To Your Body
Your body is quite acute to stress if you listen to it. I’ve had an issue with going to lunch, making terrible decisions listening to my body’s hunger pains. Instead, I’ll try to continue working, but my productivity has tanked. When I get lunch, I’ll buy too much food, get stuffed, and collapse with a food coma, ruining more work productivity. If I actually listened to my body initially, I would have had some willpower to tell myself to get a small salad and to stop eating when I feel full.
Caffeine, Or Your Drug of Choice, Is Not A Panacea
Last week, without much sleep the night before, I thought it would be a good idea to buy cup of coffee to get me through the day. If you don’t know me well, you’ll find out I rarely have caffeine. A cup of coffee for me it’s like crack, used sparingly for those rare, tired occasions. One this particular day, I was a bit hungover. I finished my coffee, and within minutes, felt that body ache.
I’m not giving caffeine a bad name, but I understand people hold on to it as a crutch, because it’s become their addiction. They can’t function without it, as witnessed through my roommates. When I use it as a quick solution, it’s never full proof and there’s always side-effects.
All of these things are measures and habits that I used to use as a basis for a clean, healthy way of living. It’s been hard to maintain balance, but there needs to be recognition that I’m going through this along with some reflection about how to take counter measures. And by relaxing this weekend and taking the time to write this out, I feel one step closer to that goal.
Last night, I celebrated Father’s Day by taking my father out to the restaurant of his choice. He decided to go to Tomei’s, a Japanese/Chinese open buffet serving a wide spread of options. I don’t typically eat at places like this because I know they will be packed, the quality of food will be subpar, and I come out stuffed because I don’t have a gauge of how much food I actually ate. But being a good son, I obliged to take him out there.
When we were seated, I looked around at the crowd. There were tables and seats packed in a large, dimly lit room full of families. The buffet line was barely tolerable with long waits and impatient people who cut in line in order to satisfy their cravings rather than abide to the unspoken rule of lines. It’s as if respect were thrown out the door and indecency was invited in.
I finished my third half-plate of food and stopped myself from eating more. There was no point in over-stuffing myself with previously frozen crab legs, under appreciated sea urchin, or under ripe watermelon. What’s the use of trying to stuff myself to the brim? I try to stick with the 60% rule of eating to 60% satiety, or at least the perception of it. I look at those around me, and I see they’ve lost control, allowing their cravings to dictate their actions. Thoughtless actions lead to lower empathy with the people around us. I remember a buffet I was at in Thailand, most of the customers went over to the buffet serving station with no care about shoving other people out of the way to fill their plate. It was rude and disheartening because I felt like I was being treated as an obstacle in their way.
Service workers are also have less empathy to those around them. Since the customers don’t serve as good examples of how to behave, it affects how the service workers behaves, and vice versa. This can be reflected in the care and attention given to the food. At Tomei’s, I thought the quality could have been better. And that’s not saying I want something top-class; I want the people preparing and cooking my food to have the care and attention they would give feeding their own children. I tip a barista something large when they take the time and actually brew a nice cup of tea or coffee. One of my favorite restaurants from the past year is a Guatemalan restaurant that serves hand-made tortillas, and you can buy them at an affordable price, i.e one dollar sign on Yelp. They knew quality, and their customers respected that. Couldn’t Tomei’s have that?
Let’s be clear. I’m not chastising buffets. I think there are some great buffets out there. I live by an extraordinary Indian lunch buffet that serves some of the best tandoori I’ve ever had. The cooks stick with the few dishes they know how to make best and make a lot of it. You can tell the cashier genuinely cares about your experience at the restaurant. At Tomei’s, I found myself rejecting most of the food because I knew it wasn’t going to be worth it. How could you mix dim sum with sushi? They just don’t go together and they’re two different disciplines.
Maybe I’m tooting my own horn because I have these cuisines on separate occasions and maybe I’m the wrong audience for this place. And if that’s the case, that’s fine. This buffet doesn’t need my business in order to survive. Last month, on Mother’s day, they had a three hour wait for those arriving ten minutes after opening time. I’d like to think that buffets like this are a gateway drug, and eventually the customers find something they really like and go out to find a restaurant that specializes in that thing. To those people, I am delighted to open up my own culture’s food to them. But I draw the line in the inexcusable behavior of thoughtless actions that negatively effect the experience of other customers. What’s the point when you’re trying to eat your food while being angry at the person seated next to you?
Fireflies are the signs of summer. They are this bright glow of hope. They seem to say, “winter has past, you can come out now”. Their green ominous glow like magic as you walk down the road. At least, this is what I would tell you if I hadn’t grown up in California. As a Californian, I can tell you there were no fireflies, no glimmer signaling the start of summer. When I read about fireflies in grade school, I would wonder what was so special about them. They were the mythical unicorns of my childhood.
It wasn’t until an adult when I first encountered a firefly. It was in the midwest, Iowa, biking through the woods. The sun was hanging low and there they were. Glowing in short spurts luminance, shining the path for my bike to head towards. They made me smile, and I wondered if I should be a kid at that moment, drop my bike, and try to catch them. Their presence allowed me to finally understand what many writers were talking about in those children books - a glow to the summer.
I don’t understand how something as simple as a glowing green light could make me feel so happy. It set the setting, and for the rest of that night, they were the entertainment. It was more entertainment than any manufactured, designed, or advertised piece of media humans had developed, at least for my tastes. It felt pure, and in a way, the path I was taking was this magical journey down the rabbit hole. And appreciating these tiny things are why we live life, right?
I’ve found the answer I’ve been looking for. I already found the answer years ago, but I’ve got to dig it up every now and again. The question: What’s the meaning of life? The answer: It’s different for everyone, so you’ve got to figure it out. This time, I’m revisiting it in a different context. I’m reading “Not Fade Away: A Short Life Well Lived” by Peter Barton & Laurence Shames and I’ve been tying it with conversations I’ve had with my roommates about a recent death of a former co-worker. In “Not Fade Away”, Peter, who had terminal cancer, writes about coming to terms with his impending death and trying to help everyone’s struggle with their eventual end. In this short excerpt, Peter is suffering through the side-effects of chemotherapy, and he’s complaining to his wife.
One day, when my body was wracked and my head ached and my spirits were at their lowest, I said to my wife: “I just don’t see the point.”
Now, my wife Laura is as supportive and kind as a person could possibly be. I’m in awe of her gentleness. But in that moment she was something other than tender; she was absolutely fierce.
Fierce on my behalf — and, I think, on her own. She still had the determination that I was having such a hard time mustering. She still saw value in the struggle. She wasn’t about to let me wallow. She already had enough burdens; she didn’t want to cater to someone who had given up.
“So find one!” she declared.
I was so surprised by her vehemence that I lost my train of thought. I said, “Huh?”
“You don’t see the point?” she said. “Find a point!”
Looking back, I realize just how important that brief but intense conversation was.
— Peter Barton, Not Fade Away, pages 83 - 84
Peter’s revelation after this incident was there is a separation of the body and mind, something he eventually considers the soul. The body is the physical attachment, one bound by nature to decay and fall apart. The mind can take the role of the body and do the same. However, if we have control over our mind, we don’t have to allow it to decay and rot. We have the ability to not allow it to taint everyone else.
My roommate Mark keeps asking the question, “What’s the point?” while we were all sitting around the backyard fire pit. He follows up with his explanation for why the elderly tend to be mean and grumpy. “They’re in pain all of the time.” While true, the bodies of many elderly people are in pain, many of them allow the pain to get the better of them. When we don’t make this separation of mind and body, we can get terribly depressed.
The best counter example I know of for someone who didn’t let their body’s pain get to their mind was Stuart Scott, ESPN anchor. In the following video, Scott talks about his struggle with cancer and shows us what’s possible when faced with death.
Reading this book, I couldn’t help but well up and cry, get depressed, get overwhelmed by the emotions Peter was going through. And then, it’s followed by hope, knowing that I can make the most out of life. My biggest take-away is not to let this moment slip again and really determine what my own purpose is for my life.
I wrote two separate pieces that I thought would become this week’s letter, but I scrapped them before I was finished. Each of these pieces devolved into a rant about what was going wrong with a painful decision point I had at the beginning of the week. This frustration became my creative rut. It’s a series of second guesses given by a very harsh, inner voice.
I started writing the first paragraph of the first draft, and really hated it. I deleted the paragraph and started over, but the writing sounded worse. The thing I’ve come to compromise about longer format writing in the past few months is that deleting a whole paragraph, paragraphs, or almost the entire piece is okay. In fact, I encourage it because it allows you to go back, read the piece with the deleted text and recognize what’s missing from it. Also, since you’re not looking at that bad paragraph, you’re not going to use that as a reference. As the saying goes, out of sight, out of mind.
I learned from this first draft that I shouldn’t try and shape writing around a quote. I included a stanza from a song and tried to tie it together. But I re-read the quote and I re-read the subsequent paragraph; they were not saying the same things. That made me feel like the core idea was jumbled and I really don’t know what I’m supposed to say.
The placeholder title didn’t help either. In school, they teach you how to write a generic thesis before your write your essay. However, in practice, my thesis usually emerges after writing for a bit and trying to recognize what my piece is about. For example, in this piece, the thesis is trying to dissect what is so difficult about writing. In my first draft, it started as how to tear down barriers, and slowly turned into a piece about how to come to grips that one day, you’re going to die, so you should use that to stop fearing things you have no control over. Eventually, the piece started ranting about the issues in my personal life, and I know how no one wants to hear someone bitch in a longford essay. That’s when I decided to scrap it and start over.
I know I’ve written about this before, but I love revisiting this concept of shitty first drafts. Anne Lamott introduced it in her book, “Bird by Bird”, an excellent guide to writing that I’ve read at least twice. The problem that I encountered with this first draft was sheer frustration that I wanted to write something meaningful and beautiful, but turds kept coming out no matter how I tried to edit the piece. The second draft was getting better. Initially, it sounded great. I trudged along, knowing my writing was a work in progress and would need severe editing, but it didn’t matter because I was churning paragraph after paragraph. When I would finish the piece, I would go back and edit those sections. And then, nearly finished with the piece, I start ranting about the discomfort of this week’s events again. It was supposed to be about networking, which quickly turned into how to build meaningful relationships, which quickly turned into why a personal relationship of mine went south.
In hindsight, prep work may have helped with these pieces. However, I recognize if I put too much time in prepping a piece, like making outlines or brainstorming ideas, the less I would actually want to write about that topic. I start drafts because I know they would at least give me a prototype of what the piece could be. In Robin Sloan’s last newsletter, “Primes”, in late March, he showed a screenshot of all the drafts that he had for that piece. His Gmail inbox, shown below, has at least 20 ideas for the drafts or things he wanted to share, but didn’t make the cut. When I saw that, I was amazed that I’m not the only one who has a troubled time sticking to one topic. The drafts aren’t all bad news or failed starts. They also have some idea that I cannot yet figure out, and when I do, it will be addressed in a later letter.
Robin Sloan on Primes newsletter drafts
I write all of my letters in Evernote which has this feature to look at past revisions of a note. If I ever wanted to, I can re-read a draft and see all of my deleted sentences and paragraphs. All of this data is saved upon future investigation on the topic.
Looking at my the sidebar where all the notes live in my “Drafts” folder, and there are at least half of the notes that will never see the light of day. They’re a constant reminder to tell me writing drafts and crafting ideas don’t get much easier. In a way, I want it to be like that because if it was easy, I wouldn’t really enjoy the activity. It calms my mind knowing frustration is part of the process because I know there’s always something I need to improve.
“How come it’s easier to make friends as a kid than it is as an adult?” asked several acquaintances of mine.
Friends and cooties
I think the more relevant question is, how does one go about making friends? How about going on friend-dates?
No, no, no. It’s not like going on online dating services like Okcupid and trying to message women in an attempt at being impressive enough to go on a date. And it’s not like Tinder where you determine a friendship by the way they look (swipe right to ignore).
tinder mockOkCupid mock
During the activities you do outside of work, take the time to get to know the people around you. Perhaps ask one of them to coffee, lunch or dinner. If you feel too vulnerable about asking someone to go on a friend-date, take the advice from Kelly Williams Brown, author of “Adulting”.
“Anytime you say to someone, even in a very veiled way, I care about you. Do you care about me? it’s scary.
But almost everyone will be pleased that you took the initiative. And if they’re not delighted by your straightforward friendliness, there you go! That is a bad friend candidate, and it’s good you won’t be wasting any more time.”
— Kelly Williams Brown, “Adulting: How to Become a Grown-up in 468 Easy(ish) Steps”
Be personable and presentable to your new fellow friend. Just like dates, the best way I’ve found to get the ball rolling is to talk about something you’re passionate about. For me, it’s traveling. I go to weekly meet-ups with other like-minded world travelers. We talk about the adventure, the excitement, and the places we’re going to go next.
Traveling globe
To finish off the friend date, remember to follow-up. When I get a follow-up email, phone call, or a physical card from someone else, it really shows that they care. Congratulations on your first successful friend-date!
I had a profound thought to myself this past weekend while watching the new Avengers movie. There were a series of scenes in which the superheroes were shown what they were most afraid of. In the middle of watching this, I had an nasty thought that came back, one that should’ve been settled years ago. It was the thought of living to the fullest and being able to express myself fully, something I struggle with on a consistent basis and it came back to haunt me sitting there in the theater.
After the movie ended, walking down the long corridor of the movie theater, I was lost in thought. I tried to brush it off. I hate confronting this issue in me. My usual reaction is to let it subside and move on with my life. But it followed me over the next few days.
I was listening to the Design Matters podcast where Debbie Millman interviewed Elle Luna. Elle wrote this piece on Medium called “The Crossroads of Should and Must”, which summarizes a portion of the interview when she’s describing the dream she had. In her recurring dream, Elle is standing in front of a white room with a concrete floor and high windows. She decided to go out and look for it in real life. After searching for days or weeks on Craigslist, she found it.
Dusk was falling as I arrived at the white room from my dreams. It was stark, absolute, white, and a symbol of something new, of beginnings. As I looked around, I thought, “What on earth have I done? Why am I here?” And as clear as day, I heard a voice say, “It’s time to paint.”
— Elle Luna, “The Crossroads of Should and Must”
Elle calls this her calling, and a decision she must do. She quit her job and started painting for the first time in ten years. She was able to express herself, or be true to herself, in a way she wasn’t able to do before as a designer.
The story shook me. I know there are some fears I pretend to not be ready to face. Thinking about the fear in the theater, I asked myself the question, “Am I lying to myself? Am I living the way I want to, being true to myself?”
In my career, I haven’t made the best decisions, and I’m not totally committed in the job I’m currently in. The crossroads of should and must are blurred, and I can’t think if I’m working in the industry I’m in because I should do it or I must do it.
In the process of thinking about this, I broke down my worries to some actionable steps. The first is to recognize myself. In the middle of Elle’s article, she asks the reader to make a list of top ten things I’m most afraid of. This is what I came up with in an allotted ten minutes:
I’m afraid…
Of being able to dance in front of strangers in public transportation. One stupid question that I ask myself is, is it illegal to do street performance on a moving train?
Of eavesdropping and joining in on the conversation.
Of starting a conversation with a complete stranger on the train. Especially of the opposite gender. My brain goes into overdrive and analyzes angles of how I would end up being a creeper or realize I may not have good social skills. I don’t think I have bad social skills in other settings.
I don’t have what it takes to take a leap of faith without sliding back into old routines right after. Elle Luna talks about choosing “Must” isn’t a one time decision. It’s a continual decision you have to keep on making daily to yourself.
Of the guy in the head. The one that tells you how much of a piece of shit you are. I used to have severe imposter syndrome, and still beat myself up for making bad choices and decisions.
Of being penniless and broke. That I have no solid financial plan. Of talking financials with others.
Of having no one to talk to and that I’m cooped up in my room or brain too long. I’m doing better at this, now that I rotate between different friends during different times of the week or month.
I will be alone. Like the last one, but in terms of a personal relationship. I felt bad when I abandoned all hope while working late nights because it felt impossible to put myself out there.
I will make the people around me feel bad. I don’t like being the bearer of bad news, and I hate shaking up the pot. I’ve been relatively non-confrontational my whole life, but I’m working on this.
Of dying and having an obituary I wouldn’t want to read.
What are you afraid of? Are there things in your life that are blocking you from doing what you want to do? Take 10 minutes and write your own list.
On top of reading Elle’s article this week, I finished listening to a recent episode of Triangulation with Luria Petrucci, AKA Cali Lewis, who opened up about her past failures and being able to be true to yourself and to the rest of the world. It hit more emotional strings to the same tune of taking the reins of your life and live it to the full extent.
I’ve made my list, and now I can slowly tackle them, one day at a time. And I’m more aware that I have the choice to work on it or not, of asking “should I do it” to taking action and saying “I must do it”.
And that the battle is never won; the crossroads of should and must are always there, continuously testing us. Figuring out how to stay strong and fighting for what you believe in is the harder part. Updates later once I’ve figured that out. There’s work to be done.
Side Note:
Elle Luna wrote a book after her Medium article went viral. I bought her book and am in the middle of devouring its contents. I’ll give a short update later of what I think about it.
The other day, during dinner with my friend Jon, we were discussing what is the most negative thing brought about by technology today. Hands down, I said the use of technology in conditioning our children to form bad habits. Coincidentally, after dinner, we were walking to the car and saw a mother and a child. The child, maybe 5 years old, was whining and crying in public. The mother reached into her bag, pulled out an iPad, and gave it to her child. Immediately, he shut up and was mesmerized by the screen in front of him. I said, “Darn it, I wish that didn’t just happen.”
I’m not going to decree that technology is the problem here. You can see through history about the negativity we assign to technology, like John Philip Sousa talking about “a marked deterioration in American music and musical taste, an interruption in the musical development of the country, and a host of other injuries to music in its artistic manifestations, by virtue – or rather by vice – of the multiplication of the various music-reproducing machines.” He was referring to the gramophone. Every recent generation has something new to distract their attention, from radio to televisions to computers to tablet and phone devices. It’s more important to remember technology is just a tool, and we determine how we use this tool.
In my dinner discussion with Jon, he remarked how kids don’t know how to feel bored anymore. The wonders of using Lego’s or playing with physical objects, or just having absolutely nothing to play with makes the mind wander. Perhaps we are stripping children of this ability by being wired 24/7. Being wired has this loss of sense of self. Taking television as an example, we’re being sponges absorbing what comes at us in a one-way communication channel. And when we think we’re learning, we only grasp the moments most memorable by design. By writers and advertisers who are seeking your attention in this attention economy. Our brains are looking for something to stimulate our brains. We forget being bored forces our brain to find an external stimuli in other places, perhaps in the depths of our creativity or a sense of mindfulness.
Present Mind
Mundane tasks like cooking, showering, or driving can stimulate day dreaming. And the state of day dreaming may be more beneficial than conventional wisdom. From an article from WIRED, the author describes one study in which mind wandering has shown to exhibit executive and default regions working in conjunction with one another. This means the mind wandering state may not be as mindless as we all think it is.
Imagine a scenario where we are waiting for our triple shot expresso to be made at Starbucks. The barista is having complications with the espresso machine and you’re waiting there for ten minutes. And in this ten minutes, you do something profound; you do nothing. With that nothing, the brain wanders, wondering about the tiles on the floor, how many chores you have when you go home. The void of empty is filled by a stream of consciousness. But the moment you grab your phone turn it on, you’re sucked into a different world, one that has intended designs and patterns of habit.
And that’s what we do; we condition ourselves to lose the present mind. We have the decision whether to wait there staring at the barista or reach into your pocket or purse for your phone and divert your attention from the situation to something more productive, like Candy Crush. Hanging out with a friend the other day, we went out for some tapioca drinks, and while waiting for my order, she sat down at a table and whipped out her phone and started to play a game. This annoyed me, because I thought we were two very present people, but at the moment of pure boredom, she resorted to a quick, cheap attention grabber. I’m not against phone games, but there’s a disconnect when you’re hanging out with someone and one or both of your escape to the virtual world instead of sharing what you have in the present. I try my best not to use my phone as I’m hanging out with someone else. I’ll admit I whip out my phone from time to time, but I recognize how that affects the other party.
Boredom in Cooking
In an interview with Jon Favreau, he talks about mundane tasks while training with a chef for researching his movie, “Chef”. He mentions that during the mundane chore of chopping mis en place, he had a disconnect in chefs doing this laborious work when it could be done by the line cooks. But after all of the prep, using the prepped ingredients for cooking made him much more self aware of the process. He had a deeper appreciation for the food that comes out and about the story of the meal rather than be the passive participant.
When I’m cooking, I find myself in an elated state of mind, functioning almost seamlessly, handling multiple tasks with relative ease. Typically, this is in the form of going from chopping vegetables, heating the pan, and cleaning my dishes. I know exactly where I left off from one activity to another, and the brain feels very mindless. But this sparks immense creativity. If I’m missing or don’t have enough of an ingredient, I’ll improvise, figuring out alternatives. I take a holistic view of what I’m cooking and try to find a substitute ingredient to accomplish the same thing, like using lime juice instead of fresh lemon, or paprika instead of cayenne pepper. I get fairly bored following recipes because I was to push myself outside of the box and add or remove ingredients, or try some other form of heating instead of the method provided. It’s cooking sessions like this where I wonder why more people aren’t cooking.
Mindfulness in Jazz
In the 9th grade, I joined the school’s jazz band. It was my first jazz class, and I was failing to grasp the concept of improvisation. My area of expertise was conservatory classical music, and I simply looked at the sheet music as scripture. When I looked at the dashed out measures with a scale key on the top, I was afraid. I didn’t know all of these scales by heart, let alone follow it with no notes. I was dumbfounded and kept to myself, pretending to know what the lines of music meant. The jazz instructor came in, and we played Take Five right off the bat. I was introduced to strange sounds all around me, listening to students improvise sound during the solo section, and I thought it was pure magic. I tried to mimic their sounds after class, but it sounded like rubbish. My band teacher instructed us to listen to the greats. Other students informed me to follow the scales as reference points, use existing bits of the rhythm, and combine a bunch of riffs together. Climbing up and down octaves gives more variety, and don’t worry too much about playing fast.
For some of my off time, I was attempting to learn about music theory and why a combination of notes or in sequence could have a consonance or dissonance sound, i.e. sound pleasing or destructive. I obsessed with figuring out how to improvise with an analytical mind. But reading through snippets of autobiographies of Miles Davis and John Coltrain, it painted a different picture. The analytical mind shuts down and brings about this sense of mindlessness. It become music played through feeling or emotion rather than thinking of what note to press next. The musician will think of things in sounds rather than the notes in letters, i.e. play “A” next.
In the band’s end-of-year performance, I was informed that I would get to improvise. I was nervous as hell during the practices leading up to the performance. It was about a one and a half minutes, attempting to solo during Miles Davis’ “Freddy Freeloader”. I spent time memorizing the F scale, thinking less about the notes and more about the sound. During the performance, you could hear my solo had elements of the main melody with traversals on the blues scale. I failed at utilizing more than one octave, but it didn’t matter. The nervousness subsided midway during the solo and I entered a mindful state. I stopped thinking about psyching myself out and corrected any dissonance I heard. After the solo, a second sense of relief overcame me and I looked at the crowd. I received applause and I probably could’ve cried at that point.
Today, I’ll occasionally listen to “Kind of Blue” for the 50th time, and just become so entranced by Davis’ solos. I often think of what must be going through Davis’ mind as he’s playing the music. And then I’ll listen to one of his acid jazz works, and become overwhelmed by the insanity of the sound. The pick-up in speed, the downbeats, the intricacies of melody that seem to come from randomness, Davis’ improvisation skills sound like no one else in the world. And he does one-take, live in front of an audience. One has to wonder if this was his nirvana.
Take-aways
I feel the toll constant attention takes. I have lower desires to reach out to others, feel awkward trying to talk with people when I do, and create dark places for myself if I’m alone. When I come up for air, letting nothing happen around me, meditate, or find a space to be mindful of my breathing, all of the prior described situations are flipped. I’m eager to talk with others, I feel less awkward in talking, and I create a happy place when I’m alone. Next time you find yourself impulsively rushing for your phone, don’t satisfy the impulse and give boredom a chance. You may find rewarding outcomes.
When Tech TV when bankrupt in 2004, Leo Laporte and the crew of the cable network were out of jobs. Some were offered to work for G4TV, who took over Tech TV’s assets, while others were laid off. The team who worked for this channel had immense creative control over the content of the channel and didn’t try to dumb down for their audience. With Tech TV’s end, Mr. Laporte was a bit lost, confused, and unsure what to do next. Although he picked up a radio gig a few weeks prior, he had a lot more free time. He invited a bunch of his ex-co-workers to a roundtable discussion at a bar where he recorded their conversation. He put up the conversation online for his fans. The fans loved it so much, they wanted to hear more episodes. Mr. Laporte decided to try to make it into a weekly show, eventually called This Week in Tech (or TWiT). Very quickly, the operations cost were starting to cut into Mr. Laporte’s expenses, so he asked for donations. The fans donated money and Mr. Laporte was allowed to pay for staff like editors and web masters. Eventually, TWiT became a business, creating high quality “netcasts” he thought people would listen to. Using the same tactic he had at Tech TV, not allowing the content to be dumbed down for the general masses, the shows had a niche following. For example, there’s Security Now, a netcast tailored for security professionals, cohosted by Steve Gibson.
Today, the TWiT podcast remains one of the most popular on the iTunes store with over 500 episodes. These “netcasts” are all filmed live where you can stream it on their channel, at twit.tv. I started listening, and then viewing, non-stop for years. It got me very interested in the technology scene, and although I don’t listen to that show as much today, I still listen to one of their other shows, Triangulation, a show where the TWiT network brings in someone from technology (or just someone really cool) to interview for an hour.
Looking back at the ending of Tech TV, there was a need to continue doing the work in other forms. Just because the cable channel died doesn’t mean the content had to either. The cable model didn’t fit the bill anyways. TWiT thrived on Tech TV’s fans who still wanted content like the Tech TV shows, and not a dumbed down version on G4 TV’s programming. Mr. Laporte gave the fans what they wanted and were very supportive of his endeavors. And it paid off. Today, TWiT is very profitable, supported by fans and advertisers, and still delivers quality programming. TWiT went from Mr. Laporte’s home office, to a nice cottage, to a large building in downtown Petaluma, California. I should know because I’ve been both to the cottage and “brick house”.
Leo didn’t know that this beginning was going to be a good beginning at all. In fact, he was a bit neutral about it until he saw the fans were receptive to his podcast. In my own ending and beginning story, I had a false start, making choices where clearly I was going to head down the wrong path. After seeing some hazardous signs, I was able to make some better, smart decisions and creating a better beginning.
Last year, after the chaos of going through Dev Bootcamp and subsequent traveling, my life went from 80 mph to a screeching halt. I was finally home a month after my bootcamp graduation and had to start looking for a job. Except, for three weeks, I didn’t do anything. I was burnt out and reverted to lazy behavior, showering less, not exercising, and watching TV. I was supposed to do a bunch of job searching, but I found excuses to do other things to pass the time. After those three weeks, I stopped making excuses and started actively looking for a job. I used the skills I learned to reach out to potential employers, to employees of the companies of interest, and eventually landed my first interviews. I had to accept that this was a new game I was playing, and the familiarity of being somewhere different everyday was gone. In a way, I realized that there’s this transitionary phase between ending and beginning everyone goes through. Mine lasted much longer than it should have, but it is a necessary component in the journey.
This week, being in Chicago, I got to watch another cohort from Dev Bootcamp graduate. All of the fears of job hunting and the confusion of where you stand after graduation came back to me. Except in the 8 months since I graduated, I have a lot more insight into what all of that meant. It meant having a deep realization of that ending, and a contemplation period during that transitionary phase. It meant having my life change once again, but this time, something was slightly different. I knew how to program, albeit not very well, but enough to prototype and hack at making software work as intended.
Today, I work at a small start-up that teaches me so much about programming, soft skills, and business. I’m financially independent and absolutely love having spare time to work on side projects. I wouldn’t have expected to be in this place of my life a year ago, and it shows we aren’t great predictors of our futures. I had a goal though to be at a point like where I am today, and I realize it’s a continuous journey. Even if my job would end tomorrow, it would be a new beginning. And I can shape that beginning however I would like, because I recognize I have the choice to change it.
I’ve been fascinated by cryptography ever since I was a kid. I remember briefly when my parents got a free subscription to the SF Chronicle and skipping straight to the comics and puzzles. One puzzle in particular, the cryptogram puzzles, got me to take my pen out and try to decode the message. It’s a simple monoalphabetic cipher where one letter maps to another letter, but the letter can never map to itself.
The simplest monoalphabetic cipher is called a Caesar Cipher, where you simply shift the alphabet by a certain amount. If you and the key party you are trying to encrypt the message to knows the shift amount, you can easily decode the message. So if we shifted the alphabet by 10 letters, letting “K” represent “A”, we could decode the word “JUMP” as “TEWZ”. The limitation of the Caesar shift is that there are only 26 configurations, so one could easily go through each letter until they figure out what the encoded message says.
A slightly strong encryption is one where each letter maps to another letter in a random order. For example, if you had the word “JEAR BEAR”, it could be substituted as “FIPH DIPH” given the following key map.
Key Map:
F -> J
I -> E
P -> A
H -> R
D -> B
Both parties would have to agree to a certain key map. The biggest flaw of this monoalphabetic cipher is the frequency to which we use the letters. For example, the letter “E” is the most common letter found in writing versus the letter “Q”. The Arabs back in the 9th century were the first to figure this out and developed this practice we know now as frequency analysis. For the Chronicle’s puzzles, you could tell there were going to to be certain repeated words, like single letter words like “a” and “I” are bound to be in the puzzle, so you can fill those out first. Also, “the” and “and” are two most frequently used three-letter words, so you can start filling those out too, and figure out the message by trial and error. Of course, you could just send the text in one long string, like this, “Afellowofficerlosthislifeinthelineofduty”.
Frequency analysis allows us to break down how often each letter is used and map it to a known frequency index, like looking at all english words and breaking down how often each letter is used, and figure out with high accuracy which letters map to which encrypted letter. Frequency analysis gets stronger the longer the message is. If it helps, you can think of the ratios for frequency analysis with Scrabble letter points. The lower the score, the higher the frequency.
In looking for a stronger encryption, polyalphabetic ciphers were created to make sure letters would be encoded with different letters each time. One form, called the Vigenère cipher, utilizes different monoalphabetic ciphers to encode a message. Each letter would map to a different shifted alphabet based on a key, and the key itself would map to different shifted alphabets. Let’s give an example. If we used the word “KING” as a key, and we wanted to decode the message, “A little boy and his fox,” we would first go to the letter “A” and map it to where “A” is in the shifted alphabet where “K”, from the key “KING”, is the first letter of the alphabet. In this case, it is easy. “A” maps to “K”.
The next letter from the text, “L”, would map to the shifted alphabet where “I” is the first letter, where “I” is the next letter in the key, “KING”. In this case, we would encode “L” with “S”.
We continue to encode the next letter with the shifted alphabet starting with “N”, and then the next letter after that with the shifted alphabet starting with “G”, and then we repeat the key and start again with the shifted alphabet starting with “K” for the next letter of the text, and repeat for the entire sequence until the entire message is encoded. In its entirety, the message reads “KTVZDTRHYGNTNPVYPWK”. You will notice that the fourth and fifth letter from the text are the same, “TT”, but in the encoded text, they are different letters, “ZD”. Now each letter does not necessarily map to each letter. For hundreds of years, it appeared that this encryption was impossible to break and was known as “Le Chiffre Indèchiffrable”, French for the indecipherable cipher.
In the mid-1800’s, Charles Babbage was the first person to figure out how to decipher the Vigenère cipher decryption technique without prior knowledge of the key. There had been others who deciphered messages before, but Babbage’s technique ensured repeatability. Babbage never went public with this discovery, and for quite some time, the discovery went to a French codebreaker Friedrich Kasiski, who published a paper on breaking the cipher. What they found was a flaw in the cipher. The flaw in this case is the repeatability of the key. If the shared key is short enough, like “KING”, and if the text is long enough, you’ll start to see repeated patterns. For example, the word “and” could appear in 4 different ways using “KING” as a key. You could look for those exact phrases to piece together where you see repeated instances of the word. By process of elimination, you could look through the text and start to piece together what the key might be. Like in the cryptogram puzzles, you start figuring out what the message of the text. With these and possibly other letters decoded, you can work backwards and figure out what the shifted alphabet was that was used, grab the first letter in that alphabet, and determine what the key could be.
This was a huge blow to people creating encryptions. Suddenly, Le Chiffre Indèchiffrable became vulnerable. Cryptographers up to the early 1920’s were creating encryptions in the variation of the Vigenère cipher. In WWI, the British intercepted German messages and decrypted them with relative “ease”. This was a heavy advantage for the British and Allied forces, and was a major factor in helping them win the war. Come WWII, the Germans had a much more powerful encryption machine that helped power an effort to decrypt its messages.
I watched “The Imitation Game” a few weeks ago, and was fascinated to known how they would depict the Enigma machine, the German encryption machine. The Enigma machine is a mechanized way of encoding and decoding messages utilizing polyalphabetic ciphers. I won’t go over the intricacy of the machine as you could read many articles about it on Wikipedia, watch the film, or read “The Code Book,” where I gathered most of the information about mono- and polyalphabetic ciphers.
The British set up grounds at Bletchley Park dedicated to decoding German messages during WWII. I want to shift focus of this essay to explore the differences between the movie and reality.
First, I really wanted to know what Alan Turing’s role was in creating “Christopher”. In the film, “Christopher” was the codename for the machine Turing built in order to decode Enigma’s messages. But I couldn’t find out if Turing ever called it “Christopher. In reality, the machines were called bombes, machines that would loop through every combination that would short circuit if the right combination was found. Understanding from some decoded messages that there were common words in almost every message, like “weather” in the first message at 6 in the morning, or “hail hitler” at the end of the message, cryptographers would try to find a chain of encrypted letters that would loop back to itself. The German word for “weather”, “witter”, would be mapped to the first 6 letters of the message. With those letters, and perhaps other common German words known to exist in the text, the cryptographers would try to find specific patterns, or instructions, to give the bombe. There was a great amount of human error that could have happened before telling the bombe what to look for in order to short circuit the machine. Multiple bombes were used in order to test all of their theories. 19 were used in its first year of development.
The bombe itself was a Polish creation when Poland was trying to decipher the Enigma machine during the 1930’s. There’s an entire neglected story there that is understandable the film glossed over. The Polish, paranoid of the growing power of Germany, obtained one of these Enigma machines. It was later smuggled to Bletchley Park, mentioned briefly in the movie’s beginning when Commander Denniston shows Turing the Enigma machine for the first time. Also untold is the story of the Polish mathematician Marian Rejewski and his decade of work trying to find weaknesses within Enigma. The Polish, knowing that their research might help the Allies in breaking Enigma, gave the intelligence to the British. Turing built on top of Rejewski’s work when he started building the bombes. The film poorly looks at the past achievements and puts Turing on a pedestal of being the radical of making a machine that could decode the key. In the film, almost everyone he’s working with doesn’t take his idea serious enough and Turing goes out of his way to convince Churchill to put him in charge. It is true the British funded around £100,000 to help build the bombes, but the drama surrounding the shutdown of these machines were not really mentioned in any literature I could find.
The Germans upgraded the number of combinations possible for their Enigma machine later in the war. More bombes were created in order to cut down the time to find the combinations. Plus, Enigma was not the only machine used to encrypt messages. For example, between Hitler and his main generals, they used an even larger encoding device with much more complexity. The film failed to mention Colossus, the machine that tried to decrypt this machine, that built off of the mechanisms in Turing’s bombes. Some proclaim Colossus was the first programmable computer even though it had to be dismantled after the war.
The film disturbed me in how easily it looked for Turing’s machine to decode the key. Knowing what I know now of what Turing’s machines actually did, the whole plot after of trying to determine what was statistically significant in delivering information after it was obtained did not seem to solely rest upon the cryptographers, in my opinion. It was the film’s opportunity to utilize a Machiavellian perspective of warfare, of which we saw very little of.
All that I’ve said though doesn’t mean I didn’t like the film. I actually thought it was an enjoyable movie with questionable drama, like the marriage subplot between Turing and Kiera Knightley’s character. I really liked how the film portrayed Turing’s eventual downfall after the war and the injustice brought to him because he was gay. But at the same time, I write this because I have a love for cryptography, and I needed to scratch this itchy spot of curiosity.
We shouldn’t be using weight as a metric for healthiness. Weight measures primarily subcutaneous fat, visceral fat, water and muscle weight (yes, we’re composed of more things). The weight value can not tell the composition make-up of that person. For example, someone could have a large build, but sound overweight according to their BMI, yet just have most of their weight in muscle. Or, someone could be petite, yet have a lot of visceral fat. There’s no inherent evil in any single factor. You need each of these things to survive, and there are trade-offs to having too little or too much of any single thing.
Working Out
If you start working out for the first time in a long time, you’ll see a net gain in weight because you’ll start gaining muscle before you see an equal loss in fat. That’s why some people get discouraged from working out for the first week because they think it’s not working.
My roommate’s friend was aiming for a target weight to fit her wedding gown and set out a weekly target weight to aim for. She decided to start working out everyday. To her dismay, she gained 3 lbs (or 1.4 kg) after the first week. When she told me about this, I gave her a quick primer about weight. The change in fat loss is much smaller than the change in muscle gain. For her overall health, this was a great with long-term benefits like increased cardiac output (CO). I also told her the biggest changes you can make for immediate effect of weight is change in eating habits.
Looks Naked
I don’t use the weight metric for myself. I believe the underlying desire we want from the weight is the indication that we look good. Because I understand this superficial ideal, I’ve adopted a concept from Darya Pino Rose’s book, “Foodist.” “Do I look good naked?” If the answer is yes, I’ll continue to maintain my lifestyle. If not, I’ll have to make some intervening habits. When we find ourselves in vain about our looks, it’s almost always the subcutaneous, or visible, fat.
Target Weight
With the same explanation of what weight is, target weight is a complete farce. The true answer to the question, “What is my target weight” should really be rephrased as “What is the most impactful thing I can do for my health?” Because weight tells nothing about composition, we’re terrible at guessing the best target weight for being healthiest. The truth is, there is no target weight we know of that is healthiest. Mrs. Rose talks in “Foodist” that she had a target weight to aim for, but when she took her focus away from the scale and onto food, she found out she felt better 20 lbs heavier than her target weight.
Be wary of your individual BMI score. BMI data is great for population statistics, but terrible for an individual. BMI is equal to your height squared divided by weight (h^2 / w). The score is basically meaningless because it scores the large-build, muscular person as overweight weight, or a skinny-fat sedentary person as underweight. Neither are good indications, as an individual, that they are leading healthy lifestyles. And on top of that, doctors and nurses use BMI to rank us with our peers if we should gain or lose weight. My most recent trip to the doctors alarmed me when they told me they used BMI. Even though they told me I’m at prime weight and I shouldn’t lose or gain weight, I was befuddled they would use such an archaic scale.
Obesity
Yes, if you’re morbidly obese crowd, or the high percentile of the population in terms of weight, weight will indicate with higher accuracy the longevity of your life. Sorry.
Other Points of Interest
I’ve mentioned the naked thing, but I know that’s not the best strategy for everyone. Here’s a list of other things to consider:
Mood
Body Fat Percentage
Breathing Rate
Breathing Volume
Resting Heart Rate
It is not an exhaustive list, but it’s a start. Sometime in the near future, I’ll write-up part two about food because that’s the key in weight loss and general fitness.
I read this delightful children’s book called “Lauren Ipsum” by Carlos Bueno and Ytaelena López about a girl named Lauren who journeys through Userland trying to find her way back home. It utilizes Computer Science topics weaved into Lauren’s story. One of the delightful characters she meets is Eponymous Bach, a woman who composes ideas and puts her name on them. “Eponymous” is an actual word that means giving a name to things. For a name to be eponymous, it must use someone’s name behind the thing or idea. The Eponymous Bach character made me think about the power of names.
You can go on Wikipedia and find an article about Eponymous laws. These are laws named after people, like Moore’s law, the observation that the complexity of integrated circuits doubles every 2 years, or my personal favorite, Murphy’s law, which states anything that can go wrong will go wrong. To fall into the Wikipedia trap, you can search for Eponym to find a whole list of other eponymous things.
Names allow us to put into words complex ideas. I’ve been coding on a daily basis for a little over a year now, and I’ve started to recognize design anti-patterns, or the ways not to design a piece of code. For example, when a piece of code becomes too long to do what you thought was a simple task, we call that a “code smell”. Typically, if that occurs, you scrap that piece of code and start over because the resulting code become hard to maintain in the future.
Another anti-pattern, called the “Big Ball of Mud”, is when a software project is strung together with little or no architecture. This results in code that is sloppy, duct-taped, and difficult to maintain. This is common when there are poor business practices, huge developer turnover, and code entropy. A friend who works at a large, public company told me the engineers who initially wrote the code for their product took many shortcuts to meet release dates, which was in conjunction with their IPO. After becoming public, many of these engineers sold their stock and left the company, leaving code that was hard to maintain and close to being useless. The result is a system that may be prone to errors and difficult to scale up and add more features.
Giving names to ideas makes those ideas more comprehensible and cohesive or “sticky”. For example, my roommate uses the horoscope as a heuristic to quickly judge someone’s character. The horoscope provides a quick framework for personality types. It plays off the elements, earth, wind, fire and water, and uses it to describe behavior and traits. For example, Capricorns, who are Earth signs, are more grounded and set in their ways. She will use that to categorize the Capricorns she meets. Of course, we may not really fall into these buckets or groups, and my roommate takes this with a grain of salt, but it’s just a guide to aid with understanding personality. The same goes for the different Myer-Brigg’s types.
Names act as a heuristic, or shortcuts, for our brains. As an example, if we know people with the same name, in my case, I know a few people with the name Michael, Nick, and Chris, I’ll give each one a nickname. And my friends will typically give me a nickname back. In fact, the name of this newsletter is the “Jear-Bear Letters” because some fine folk over the past summer started calling me “Jer-Bear”.
In olden times, names would include titles. Alexander the Great, Pliney the Elder, Joan of Arc. These would help with passing down stories through oral tradition. Saying Alexander doesn’t have the same ring as Alexander the Great. If you’re going to tell someone a story by word of mouth, their more likely to remember it if you put a descriptor title to it. If you’ve read Lord of the Rings, or A Song of Ice and Fire (the book series for the TV Show, Game of Thrones), you will recognize your character immediately given the character’s title.
Sometimes, in fantasy tales, names have a literal power. For example, in “The Name of the Wind”, by Patrick Rothfuss, you can summon the wind by bellowing its name. In the Harry Potter series, Lord Voldemort is the household name everyone fears to the point where not many will utter his name. The words we use to call each other or ideas have a profound effect. When you become a household name, people will stick your name to your face, your brand, and your life’s work. Take Madonna for example. When you bring her up in conversation, we are ignited with thoughts about Material Girl, Evita, or that recent song “4 Minutes” whom she has a duet with Justin Timberlake.
When you can put a name to an acronym, you make it into a mnemonic acronyms in which you can use to your advantage in everyday work. For example, I’ve been designing websites, and I use Robin Williams’ graphic design principles in her book, “The Non-Designer’s Design Book”, known as “CRAP” (Contrast, Repetition, Alignment, and Proximity). When I’m coding, I use the SOLID principles for good practices in object-oriented design.
Next time you start learning something new, learn the concepts by associating them with names. If they don’t have names, give them one. If you don’t have a name, give yourself one.
On International Women’s Day, my former hack-mate from Science Hack Day tweeted out female scientists that are inspiring to her. You can read her full article here. In that spirit, I wanted to talk about meeting someone who inspired me.
Ze Frank
Ze Frank is an Internet sensation primarily known for his Internet show back in 2006 entitled “The Show”. In 2012, he released a new show with the help of Kickstarter backers called “A Show”. It also became a hit for its run during its first year.
If you haven’t watched any of his videos, you should begin with “An Invocation for Beginnings,” his first episode for “A Show”. He talks about the fear of beginning and calls out people to join him in beginning something.
This is an invocation for anyone who hasn’t begun! Who’s stuck in a terrible place between zero and one.
— Ze Frank, “An Invocation for Beginnings”
Or this video on “Crushing Words,” where Ze just talks about words that have had a crushing impact on his life. Ze is able to present his vulnerabilities, creating an atmosphere of authenticity, human emotion, fun and play in his videos. In a lot of ways, these essays echo what his videos convey, a place where we can actually talk about insecurities and vulnerabilities.
The Exhibition & Showcase
In “A Show”, Ze held a bunch of different “missions” where artists and fans would collaborate to create pieces of art, like a jacket made of pages from diary entries submitted by the fans. In 2013, Ze created an art exhibition using the pieces created in the missions. The exhibition was held at The Santa Cruz Museum of Art and History where the public was invited to come to the exhibition and participate in the workshops. At the end of the exhibition, the public could watch Ze and Stefan Bucher present their work in an interactive showcase. Being a fan, I was a bit giddy to finally meet him in person, so I drove down to go see this exhibit.
Nina Simon, the museum’s curator, spent years creating this museum interactive space where each exhibit is a participatory art piece. It was no coincidence Ze chose this museum. Within Ze’s exhibition were different workshops where you can make your own finishing stamp, look at some of the projects made by the artists on his show, and write comforting messages to stuff into a teddy bear, known as the “Comfort Bear.”
Before the showcase began, Ze addressed the crowd who was lined up to go into the auditorium. He asked everyone to disperse and talk to strangers you’ve never met. It was the first in a string of social experiments he asked us to participate in. I walked around the room meeting people of different backgrounds, like students at UC Santa Cruz, NASA Ames employees, and Youtube Stars from the UK. After a few minutes, he told us to gather back together and asked us to make a laughing circle. To create a laughing circle, you have someone would lay down and start laughing. Another person would lay down, rest their head on the first person’s belly, and then commence laughing. This would repeat until a circle is formed. A few people participated in this activity, including myself.
Our superego holds us back from saying things that might be too offensive, too brazen, or too radical. It may stop us from participating in activities that might make us embarrassed. But this activity of resting our heads on someone’s laughing belly tricks our superego from telling us this is an awkward situation because it’s never encountered such action before. As my head was bouncing up and down, my mind stopped rationalizing what was going on. I just laid there laughing at the absurdity that was unfolding. Heads around me in similar bouncing fashion, bobbing up and down laughing.
Other activities followed along the same thread as thing one. Feeling oddly elated, we all sat down in the auditorium. I had this sense of play and joy, as I listened to him talk about the process of creation and how participatory activities brings about conversations. He made me think about, and eventually write about, how to get others to interact with me on an empathetic level. It goes past the level of acquaintance and to a level of real human emotional feelings. We take off this mask and actually show ourselves raw.
The physical realm is full of strange and awkward emotions because we have to deal with each other. The internet masks us with anonymity. So how do we get to the important conversations?
— My journal entry from that day in reflection to the talk
Continuing The Dialogue
After the talk, I lined with with the rest of the fans to meet Ze. Watching his videos is an intimate one-on-one experience. You open your laptop, go to his website, and click play to start watching his latest video. He talks about something to a camera, and you view the final, edited version. And a lot of times, you watch it alone.
Here was a chance to finally bridge that digital experience into the physical world. Except, the exhibition, the silly activities, and his talk made me realize I’m not the only one who has this experience. I get to share it with the fans. We get to continue this conversation, through the medium of video comments, the missions, or this live event. And through this live event, I was finally able to talk to people about the important things, like how to be yourself, how to deal with bad news from the doctor’s office, and how to determine who is a friend versus an acquaintance.
When it was my turn, I thanked him for the participatory experiences of the event. He signed my poster and probably doesn’t remember this brief encounter. And to be honest, I don’t really either. He brought himself to the level of the fans, not as an apotheosis. He was the instigator, the person who started the ball rolling. The fans are there to continue to roll the ball and perhaps crack it open to find something magical inside, like raw emotion, solutions to our everyday problems, or how to cope. Ze was make the event more than just himself. In true spirit to his attitude in his videos, he made this event about the fans.
Ze opened my mind to think about how to live and cope with awkward emotions. They’re of human construct, and the only way to really deal with it is to open a dialogue. It’s not to comment on a video, give our ten cents, and leave it at that. It’s to draw out someone else who shares similar perspective and figure out what makes us human.
My friend, Miss Keegan, is the bravest person I know. She’s my best friend and someone I truly care about, sometimes even more than family. Two years ago, she wrote me a very long letter. It took her months of writing and re-writing to ultimately tell me she was transgender. Deep down, she was asking for acceptance. She was also worried that if she sent this letter, there would be a slim chance that I wasn’t going to accept her for who she is. Despite being risk-averse, she took that leap of faith, risking our friendship. When I received the letter, I took some time to really read it, then called her. I told her I accepted her for who she is and there would be no way in hell I was going to react negatively.
We had been friends since our freshman year of college. We met at this club event right outside of the university our first weekend before classes started. However, it was only brief, and all we did was introduce ourselves with a handshake. The second time I met her, I stumbled into her dorm room drunk while she was trying to have a good time hanging out with her friends from back home. She held no angst towards me, but showed me out of the room. Despite my rude behavior, she was drawn to me and we started hanging out more often. Eventually, she became one of my first true friends in college.
One of the things we wanted to do was travel up the west coast to Canada. In my car, we drove a thousand miles up and down the coast seeing the beautiful and gorgeous Pacific Ocean. But we also had a lot of time on our hands. We each created a playlist that we thought would reflect our lives. That’s where I learned Miss Keegan was into scream-o music once upon a time ago. Eventually, we ran out of music, and we talked for a long time. I felt comfortable enough talking about myself. I told her about an old High School crush I never got over, of parental expectations, of where I thought my life was headed. She drove, listening to my stories, soaking it in. Miss Keegan only talked briefly about her past, and I could tell she was holding something back. Something deep and dark, and I was worried she didn’t trust me. I didn’t press her on it and felt that if she was ready to tell me, she would.
We took a class together in our junior year on LGBT media studies. In that class, we discussed topical LGBT issues and read one or two books a week. Because of high textbook costs, we decided to split the cost of the books. However, one of the books I bought was incorrect. I bought Kate Bernstein’s “Gender Outlaws: The Next Generation” when I was supposed to buy her first book, “Gender Outlaw: On Men, Women and the Rest of Us.” Miss Keegan bought the book off my hands and read it religiously for a week.
I didn’t feel surprised when she wrote to me she was transgender. I received the letter on my birthday the year after I graduated college. In addition to coming out, she also told me for the past year, she was taking hormones without prescription. She talked of depression and of finding herself lost and confused, crying in her room. Reading that reminded me of specific incidents where she would just disappear during social events.
Miss Keegan and I were at a party held by a mutual friend about a half a year before I received the letter. She left the party after feeling dismayed because some of the guests talked about gender binary norms. She had taken a walk without telling anyone, and no one noticed until I was finally ready to leave the party. We had drove together, and since we lived together, I assumed I was also driving her home, but Miss Keegan was no where to be found. Another friend accompanied me as I drove around looking for her. After a half an hour without finding her, we decided to swing around my place hoping she found her way back with someone else. I got back and she wasn’t there. I asked my roommates if they had seen her, but they didn’t know. Before I called the police, she came back, safely. She was dumbfounded by my distress and told me she just needed to take a walk to clear her thoughts. I sighed a huge relief, but was worried by Miss Keegan’s need to clear her thoughts.
Shortly after I received the letter, I called her and told her I was totally supportive of her and willing to help her if she ever needed it. I also asked if this was why she had left the party I mentioned in the previous paragraph. She said it was distressing that nobody understood her perspective and scared that if she brought it up, she would be rejected. She felt like she was in a hopeless place, trapped in a dark room when people make such off-handed comments.
One of the first things I did right after college was write to Miss Keegan letters. Snail mail, not email. It was refreshing. I was able to write these longform essays, much like what you’re reading now. Sometimes she would respond. Sometimes she didn’t. It didn’t matter. I was able to get something off my chest because I knew she could read the things that were hard to talk about. After I received her long coming-out letter, the letters meant even more because she was also willing to talk about the hard things as well. When I received one of her letters, I knew they were precious because there is limited space on paper. You have to be extremely thoughtful of what you’re going to put in that space.
Writing these letters reminds me of that time I was writing letters to Miss Keegan. I’m writing about the hard things to talk about, except now, there are more people reading. I feel very vulnerable, scared I’m going to be judged by every set of eyes that read this. But what really helps is when I get responses back. They’re not like a reply on a Youtube video, they’re replies of empathy. I get really cheery when someone responds back with, “I felt the same way” or “This really touched me.” It makes me feel less alone and lights up that dark room within me. I don’t have an intention to write these letters in hopes they will make me famous, because they will certainly not. I write these because it’s the thing keeping me sane and happiest. I love you Miss Keegan. Thanks for being there.
There’s this story I heard where parents convinced a pee-wee soccer referee not to count points for their kids’ game. This pee-wee soccer game would have no winners or losers and the parents wouldn’t have to worry that their kids would be devastated if they lost. However, what I believe that does is the kid will lose out on essential character building. As Calvin’s dad says in the comic strip, “Calvin and Hobbes”, everything not worth doing is an experience to build character. This trait goes by other words, perseverance and grit, and it’s one of the most important life lessons. Things may not go our way, but we have the choice to continue to push on or fail to recover. The reassuring thing about the pee-wee soccer match was the referee noticed the kids were keeping track of the score in their heads, so at the end of the game, they knew who won and who lost.
Calvin and Hobbes - building character
Trading Spaces
In the film, “Trading Spaces”, Dan Aykroyd’s character is this rich stock broker who has everything going for him — a good career, a smoking hot fiancée, and a large home with his own butler. Being white and privileged, he had never faced much hardship in life. He went to an Ivy League college, has a group of posh friends, and never had to beg. The word “suffer” doesn’t seem to be in his vocabulary.
His counterpart, played by Eddie Murphy, is at the absolute bottom. He’s poor, had to fight his way in the hood, and a scam artist. At the beginning of the movie, he pretends to be a war veteran with no legs panhandling. The difference between these two characters is Eddie Murphy’s character has faced a lot of rejection in his life and had to live with it. Dan Aykroyd’s character didn’t.
As the movie progresses, Dan Aykroyd and Eddie Murphy swap places and Aykroyd finds himself at the bottom. Everything is taken from him — his job, his fiancée, and his home. When he finds out that none of those thing will come back to him, he hits rock bottom.
This film might be the worst case scenario of losing everything, but it provides a wonderful lesson. Despite hardship, we can choose to process through that and work past it. Dan Aykroyd almost that rejection overcome him, nearly meeting his end from a suicide attempt. Throughout this portion of the movie, I was thinking, “pull yourself together. You can get through this.” But I understand his behavior. It’s that resistance we have built up because we can’t process the rejection. In the end, he did pull through and eventually getting even with the people who wronged him.
The Break-up
Take a recent break-up from a close friend as an example for the denial of recognizing rejection. In this break-up, my close friend delivered the blow to her boyfriend for the fourth and final time. A few hours after, the boyfriend reached out to me to meet up with him later that week. I was hesitant at first, but eventually agreed, despite knowing he doesn’t like me. I had been talking to my close friend about her relationship more deeply than he was, and it angered him.
We met up at a local library where he showed up drunk. He was stammering through some of his sentences as he spoke. At first, he tried to ask me what he needed to do to get his life on track. I tried to give him some sort of advice, but he ended up taking over the conversation. He rambled for a good hour about his problems, where he thought the relationship went wrong, and how he planned to win her back. I tried to give him the bad news; he needed to take care of himself first. He was a mess, and despite how much we want to help with someone else’s life, we have to be selfish and take care of ourselves first.
One of the reasons the relationship went sour was the boyfriend was trying to accommodate for his partner by trying to provide her with rich, material goods. But the thing he couldn’t provide her with, the thing that mattered more, was the ability to socialize with her. When she asked him how his day was, he would give a one word answer. When she pressed him for an opinion, he gave her nothing. When they were hanging out, he would rather be on his phone playing games instead of being present with her. When things went south for him, like losing his job and facing family crises, he let that overwhelm his life. He blamed her for a lot of the downturns, even to go as far as saying she was the reason he lost his job. He resorted to cursing at her when she did made a mistake. He couldn’t blame himself for these actions until it was too late, after they were broken up.
After the end of our conversation, I thought about what he said, and I realized he didn’t get it. He was in complete denial and didn’t admit that she was not coming back. During the conversation, he talked about scenarios in which she would get back with him if he won her back. He did try to fathom she would never get back with him, exclaiming, “I’ll be happy as long as she’s happy.” However, that was followed with, “I will never love anyone else except her.” It made me think about my abysmal dating life, and how much rejection I’ve faced over the past few years. My difference is, when someone tells me they don’t want to see me anymore, I respect that and try to live on without them in my life. Of course, there’s a lot of sulking, ice cream, and hours of mindless reality television, but after that phase, I bounced back and put myself back out there.
Before we parted, he asked me if I could be his friend. I said, “it depends.” I place a no tolerance rule in my friend group for people who have to spotlight their baggage. They go into my “acquaintance” bucket. My roommate calls them the “woe is me” people. They’re like a vampire trying to leech you of all your positive energy, and when you’re done talking to them, you feel overwhelmed and can’t do much else. In the past, those friends take my advice, but never give any back. As soon as I bring up my own issues, they’re not willing to help. When I invite them to group events, they tend to bring the whole group down. I quietly ignore their pleas to grab my attention until they stop reaching out. My life is typically a lot quieter and goes back to emotional equilibrium.
Since our meet-up, he’s reached out to me a few times. Each time, he has tried to ask the world of me where he tries to force me to sympathize for his baggage. He’s going into the acquaintance bucket.
“Our job in this lifetime is not to shape ourselves into some ideal we imagine we ought to be, but to find out who we already are and become it.”
Originally from SFGate. Photo: Courtesy / Lauren Colman
Crossing the River Styx
Around 5pm this past Monday, Caltrain hit a car that was stopped on the tracks. Tragically, a female driver who remained in this car during the collision died. This and subsequent trains were stalled for hours as the police and train operators ran through, sadly, a very common procedure. As if that wasn’t enough, a few hours later that night, there was another fatality. Caltrain had hit a pedestrian.
I was rather deterred from writing about these fatalities the last time it happened a month ago. It seemed a bit morbid to write about because of their recency. But because they seem to happen at least once a month, I think it’s time to re-think the way we think about these events.
I wrote an essay earlier last month about my personal journey through anxiety, depression, and suicidal thoughts. I feel like I can relate a little to the mindset of what may be running through the mind of a person who is on the train tracks, crossing the river styx from life to death. While life may be in a cloud of uncertainty for the suicidal person, knowing there is certainty of death from a head-on train collision could be solace. There’s no claim that either of these two incidents were successful suicide attempts, but I’ll still take this as an opportunity to think about suicide prevention.
“In the last five years, there has been an average of 14 fatalities a year on the Caltrain right of way. Of these, 90 percent were caused by suicide.”
In the past, I felt insensitive to these events; conditioned to think this is commonplace. There’s an awful joke that I seem to hear myself saying, “Why couldn’t they do it on off hours when I’m not on the train?”. My brain used to filter these stories into soundbites, forgetting that each one of these people had life-long stories with a tragic ending. It doesn’t help that the media reporting these stories only give us soundbites of the reaction from close friends and family spliced in between the press conference from the Palo Alto Police Department and Caltrain officials. There’s much heart in the souls that were lost. I’m reminded of prison inmates who wear numbers, who have lost their identity to this boundless, intangible symbol.
Perhaps I should construct an identity to this woman and all other fatalities. The gravity and weight would be better felt. It’s a thought exercise to remember if I encounter someone displaying suicidal patterns, I should intervene.
The Proactive Good Samaritan
With mental disorders, depression, and people on the verge of suicide on the minds of most Americans, we forget how to intervene when given the opportunity. And suicide prevention isn’t something you’re supposed to learn and shelf. This is a constant reminder there is more than can be done for those still around. Perhaps you know there’s a person behind a mask ready to give up. You have a voice and the power of presence. I may not know this woman, but I sure know that she’s a reminder that I will act more aware of these situations if they should arise amongst my friends. The experience brings back our awareness and we need it most when we have our guards down. Armor up and become the proactive good samaritan.
National Suicide Prevention Hotline: (800) 273–8255
Caltrain has come out with a response to the recent suicides. You can read it here. I’m going to quote two points that I agree with Caltrain’s proposal for truly making an impact to these tragic events. Thanks to @MarkSimon24 for writing a response I’ve been waiting to read.
Point 4
Engage in a community-wide effort to address underlying mental health issues, suicide prevention and lifting the stigma of seeking help. This is the long solution — it can take decades to change community attitudes about mental health to the point where a troubled individual can openly admit that he or she needs help. And even if, together, we did everything we could and transformed our community, there is no guarantee it will work. Some of the recent cases have involved people who had sought help and had been identified as struggling with mental health issues. To the credit of our community, this mental health/suicide prevention effort is underway and has been for years. There are a number of government-, community-, and school-based organizations throughout San Mateo and Santa Clara counties that are working hard to improve the availability of services and to help guide all of us on how we can work together to reduce the risk and to reach out to one another. That is commendable and we need to consider how we can redouble our efforts, together.
Point 5
Reduce the harmful news media attention to these deaths. There is ample science to establish that giving high profile coverage to these incidents makes the problem worse. There are many professional journalism organizations that actively assert coverage of suicides should be minimal and non-sensational. Every leading suicide-prevention organization issues media guidelines that beg news organizations not to describe the means of the suicides in detail. And yet, as recently as Tuesday’s tragedy, every news story described exactly how the death occurred. The news media has to take some responsibility for the story it is creating, not just covering. This makes some journalists angry. A recent social media assertion along these lines provoked a very angry response from one local news organization. They defend their coverage as newsworthy because of the disruption to the daily commute. Or because the deaths themselves have become newsworthy. But this is something that can be done right now and, evidence suggests, can have a positive impact.
Stephanie Weisner runs Wellness and Recovery Services at StarVista, a San Mateo County nonprofit. Weisner credits Caltrain with sending its employees into the community to participate on boards and committees focused on suicide intervention.
“We have monthly meetings,” Weisner explains, “where we all sit around and brainstorm, and we work closely with other counties, including Santa Clara County.”
Does she want more fencing and security cameras? Yes, she says. But she adds that none of that frees the rest of us from having to pay more attention to the people around us: in school, at work, at home.
Weisner says, “People often give out signs that they’re thinking of really hurting themselves, or taking their lives, and there’s things that we can do — reducing the stigma around getting mental health services, and encouraging people to reach out for that.”
I’m not smart enough.
I know those watching me
With vindictive eyes
Are judging my wits.
I’ll stumble on something I don’t know
Stuck in an inner maelstrom.
Do I try to figure this out,
Or blame my lack of knowing?
I’m not pretty enough.
My mom told me that.
She believed it,
And it hurt when I believed it
I shy away from woman,
Thinking I’m the beast outside.
But then a compliment.
Am I really ugly?
I’m not rich enough.
I couldn’t buy the next must have.
Wishing I owned more
Wondering the price tag of a new life.
Old Joe’s living paycheck by paycheck
And I’ve got more.
Would it be crazy
To give him a helping hand?
I’m not social enough.
I put on an armor against being vulnerable
And I’m left to my own devices,
But I can’t bare to listen to myself.
Then I wonder why no one will talk to me
Initiate a conversation
Counsel me when I need them the most.
I am alone.
I’m not good enough.
I never was good enough.
This voice inside my head
told me I’m not good enough.
I’m afraid everything given to me
Will be taken away in a heartbeat
And I would’ve wished I could’ve appreciated it
When I still had it.
I’m not available enough.
Family and friends wonder
If I’ll ever make it out.
I wonder too.
I can’t bare to make the time
Because there’s always fires around.
There’s always drama
And there’s just no way I can move things around.
I’m not fit enough.
My belly is too big,
I run out of energy too soon,
And the gym is intimidating.
How could I muster
Bringing myself on the treadmill?
Exercise wasn’t made for me
I’m fat because of genetics.
I’m not happy enough.
All the world is suffering,
So I must also suffer,
Because it’s the proper thing to do.
Satisfaction is for losers
Who don’t know the doom that’s coming.
Woe is me,
Why can’t I just be happy?
I’m not enough.
Given my circumstances,
You can see I’m not enough
You can feel I’m not enough.
I’m told I’m wrong.
How can I believe that
When I can’t feel it inside?
Just believe?
I’m enough
I have enough time
To sit and chat with a dear old friend
Reminiscing about the good old days
And talking optimistically about the future.
I created a space
Where people can come in and out of my life
Whom I can be genuine with
And be amiable.
I am happy enough.
I’ve given myself enough time in the day to meditate,
Joke around with the people I work with,
And I don’t get angry over the little things.
I’ve made peace with God.
There’s a spot for spirituality
And for wholeheartedness
And soft-serve.
I’m content enough with my wisdom.
I know there’s so much I will never understand in the world
And I know there will be those who carve a very selective niche
To study those things.
What matters more is the people
You can share your experiences with
And pass down
From one generation to the next.
I’m rich enough.
In fact, I give back most of what I earned.
Because what’s more important than money or things
Are the experiences we have on this Earth.
I am delighted to have the things in my life
That can draw me closer to those I can’t see everyday.
But I don’t hold on to items like a crutch
Because they are only tools.
I’m healthy enough.
A wise man once said
”What the point of being ultra-healthy
When you can’t even enjoy the time you have here?”
There is no excuse to find time for exercise
When you’ve already incorporated it into your life.
Habits are the foundation
To creating a worry-free life.
I’m pretty enough.
I don’t need to look like a million dollars
And then some
Because I can stare at myself naked in the mirror.
I feel great in this skin
And all of the blemishes it has.
All those blemishes have stories
That I get to share.
I’m enough.
I’ve surrounded my life with family and friends,
Who all encourage me in my endeavors
And make my life rich.
Enough is the baseline
Not a static comfortable point.
We have accepted who we are
And are not afraid to change.
I’ve writing down what I’m grateful for
My life, my health, my family and friends,
The abundance, the emotions, the creativity
And a chance to share it all with the world.
“You never know how strong you are, until being strong is your only choice.” >
— Bob Marley
A few years ago, I binged through several episodes of “Inside the Actor’s Studio.” Towards the end of each episode, the host James Lipton asks a lightning round of questions to his guest. I’m always intrigued by the answer the actor or actress gives to the question “What is your least favorite word?” Many actors and actresses have the same answer — “no.” As being the greats and the top performers in their field, my interests were perked. “Could I also stand up to someone telling me, “no?”. The answer is prevalent in our everyday lives. “No.” When faced with adversity, shame, and humility, the greats do not take “no” as an answer.
And yet, years later, I would say “no”. I said “no” to quitting a horrible job. I made a conscious decision every day for two months leading up to my voluntary termination that I wasn’t ready to quit my job. I had put in over a year’s experience at this job, I was burnt out and ready to leave, but I was conflicted. I thought there was some saving grace of staying and working.
On one hand, I got to work with devices that could potentially save someone’s life. And I got to work with fun, yet difficult design challenges. But the payoff felt so minimal because as soon as I finished one project, another one would follow suit. I had no satisfying feeling of having a job well done. I remember after completing a huge project, I went to the break room to take a rest. Management came in to tell me I had another big project due tomorrow. It felt defeating because this was the fourth or fifth time this happened that quarter, and I had the feeling this would never end.
On top of that, the job wasn’t getting easier. I spent each morning pressing the snooze button on my alarm hoping to have just another hour of rest from hell. I rarely made dinner after work because I worked 12+ hours a day. I hated how disorganized the work space was, spending an hour or more sometimes trying to find a tool. Upper management had a passive-aggressive management style, creating a workers who read between the lines on how their work performance was like, but never truly knowing. One of the other engineers was paranoid he would be fired a month before he was axed. Operations had a reactive rather than proactive stance, deciding to go making mistakes today and fixing them tomorrow.
I knew none of this was going to slow down. I let the stress affect my self-worth and self-esteem to the stage where I woke up every morning and thought, “I hate my life.” I would try to shake the thought, and by the time I arrived at work, my line of thinking was, “let’s put on a good attitude, because I don’t want to spill my shitty feelings onto anyone else.” I was emotionally uncomfortable with myself.
Yet still, I thought, “no, it’s not time to quit yet.” We oftentimes belittle ourselves into being our own worst critic. Our superego takes over and becomes a loud speaker. “You’re making a stable income. There’s nothing to worry about here.” I was shouting at me and I couldn’t dodge it. Sometimes, the superego was wildly irrational. “You’re letting your parents down if you leave this job. No one will support you if you leave.” This made is all the harder to overcome that pestering “no”.
Feeling a bit lost and overwhelmed, I reached out to a family friend and an old boss of mine for an opportunity to teach. To my surprise, they offered me a deal to do some substitute teaching. Taking it as a sign, I went home to discuss it with my roommates. After a glass or two of wine, they were convinced that I needed to quit now. I told them about my hesitation and a list of non-reasons why I shouldn’t quit. The job didn’t pay well, it would only be for a few months, and I would have a long commute. But I thought back to the adverse effects of saying “no”. I reflected on all the shitty mornings and thoughts of hatred towards my life that I stopped talking excuses and asked for help. I finally had convinced myself I needed to take action to quit. My roommates helped me craft a resignation letter, and after an hour, I had a pretty good final draft for a resignation letter where the tone didn’t sound like I was going to burn my bridges. And then the moment of truth. I had the resignation email prepped and ready to send. But I hesitated in pressing the “send” button. Everything in my brain tried to reason that this was not the right decision to make. That’s when I decided that I would send the email right before I was going to pass out. That way, I reasoned, I couldn’t think about the worst case devastation.
The next morning, I breathed deeply as I checked my email before going to work. There was no reply from my boss or the head of the company. “Maybe the email didn’t go through,” I thought. When I got into work, my boss grabbed me aside and congratulated me on my career move. I had thoughts all morning that I was going to be reprimanded. It was a huge sigh of relief, and thinking back at it now, I wonder why I had taken so long to take action on the stress that had caused me anxiety and depression for a few months. Upon further reflection I believe I limit myself and my ability, being fearful of opening up and being vulnerable for a difficult conversation I would have to have with my superiors. I think I over-complicated the matter and focused on the wrong consequences which makes me feel trapped and helpless. Out of the helplessness, I felt alone with no one to really turn to.
I learned months later that the voices in my head would never truly go away for me. My therapist explained to me there are a few ways therapy tries to cope with a loud superego. One way is to try to remove it through mental conditioning. Another way, the one I prefer, is to turn down the volume of the superego through mindful practices. When I’m feeling stressed and there’s this loud voice in my head telling me “no” with phrases that make me feel unworthy, shameful, and anxious. At this point, I stop what I’m doing and try to find that mindful state, and imagine I’m looking at myself with a nonjudgmental gaze. I feel the emotion sweep through me and instead of trying to reason with it, I let it pass. I don’t try to suppress the superego; I just let it talk. When I’m done with this exercise, I resume what I am doing without the stressed feeling as before. Everything becomes clearer, like the irrational conclusions the superego was making.
Along with this, I prepped myself with trying to build a solid foundation for my emotions. I didn’t want to say “no” anymore, so I picked up habits that I now use as a defense when I am stressed out. After listening to Brené Brown’s TED talk, I bought her book, “Daring Greatly,” and one of her recorded seminars, “The Power of Vulnerability.” It is from her teachings that I learned about building empathy and exposing my vulnerability to trustworthy people. I found solace in a friend who will always listen to what I’m saying and not judge me for who I am. She never tells me “no,” that I’m not enough. And she expects I do the same, even when she doesn’t tell me that. I don’t try to tell her “no”, because “no” means you’ve made a decision to believe there is no possibility.
When I find myself saying “no” to going to do something new, I stop myself and wonder, is it because I’m afraid of the shortcomings that may occur? That usually changes my “no” response to a “yes”. Last week, I did exactly that. I was saying “no” to going to a house concert, but after realizing I had no fears of going and the resistance was just built up from general work stress, I said “yes” to the RSVP. I had a blast and couldn’t fathom after the experience how I was ever resisting this meet-up. These kind of conversations happen on a weekly basis. Sometimes it’s about hesitation in doing something new at work. Sometimes, it’s working up the courage to ask someone a favor. Nonetheless, I have taken these opportunities to test my emotions because I know they can be a fickle bitch.
This past Friday, I went to a funeral for my dad’s uncle, my great uncle. Still mulling some thoughts about his recent passing, I want to share some insight on the funeral service and celebration of life.
We are still living after we are dead.
The people who gather for the funeral service have some memory or recollection of this person. The person who’s past still lives on in us as long as we continue to remember them, their stories, how they made us feel, and how much we can imprint onto others how they made us feel. I recently learned that my dad was influenced by his uncle on retiring early and really enjoying what life offers us. I didn’t know that before my dad gave a speech in front of congregation. It made me feel differently about my dad.
I’m reminded of “American Gods”, by Neil Gaiman, of the concept of the forgotten god. They disappear from our society when we no longer give the god some importance in our lives, like ceasing the worship to them. But we make the gods stronger by influencing their reach onto others, spreading their words and worship.
Funeral services are well prepared.
As I sat down on the pew, I noticed the nice gesture of having a tissue box in every row. It’s the little small things that make this ceremony go smoothly. It was raining during the service, so the cemetery groundsman informed us a Hearst will drive the coffin to the grave site, relieving the pallbearers of lifting the coffin in the mud. I must have been grieving too much to recognize this during the past few funerals I’ve gone to.
I accept the faith of others, even as an agnostic.
We had a pastor recite a passage in Psalms. It was pretty lengthy, and it had to do with passing from this life to the next. I clasped my hands in prayer, but I wasn’t praying. I was tolerant of the faith of my family even though I don’t care for it myself. I find too many atheists and agnostics have an issue with having religion being shoved in their faces and will try to make their point by not participating in such events. However, I wanted to be there for my family, and it’s a really hard line to cross to shove my personal beliefs onto others.
Priorities are reset.
For our own fears of death, we take this time to realign our priorities. Perhaps we don’t understand what we’re doing in life, dick around, and pretend we have eternity to do anything. Perhaps there’s something nagging we wanted to do, but we feel it’s too late to do it. Perhaps there’s a goal you want to accomplish, but you keep putting it off. The death echoes our fears and tells us we need to take action with these priorities we’ve left to the waist side and we pick them up. Of course, this newfound energy is ephemeral and we forget all over again only to return to this cycle after the next funeral.
Funerals are this funny time. We’re emotionally distraught. We get overwhelmed by the amount of grieving around us. Then we return to a normal life, supposedly, like it didn’t happen and we get back to work. But we have the choice to figure out what to do with this raw, human emotion.
This week, a friend asked me, “Will you find me a good but not crazy or preachy “learn to like yourself more” book please??” I gifted some books and followed up with a lengthy email for why I selected those books. I decided to blog about it and share my recommendations.
A group from the Harvard Business School came out over a decade ago with their seminal work about office relationships and communication called “Difficult Conversations” in which the team tried to understand what it is that makes us avoid having tough conversations with co-workers, family and friends. They turned that study into a book called “Difficult Conversations” on how to initiate these conversations. This book, “Thanks for the Feedback” explores the next step, which is someone has posed a difficult conversation to you, and explains how you should respond. You don’t have to read “Difficult Conversations” to understand this book at all, and it’s practical from the very beginning. I really wish I had read this when I did my senior project and had to manage a group of 5 people.
This book is almost a must for anyone who feels shame, guilt and vulnerability, which is to say, everyone. The book chronicles how to deal with vulnerability and how to expose yourself to being vulnerable. This has been Mrs. Brown’s work for over a decade as she takes her qualitative research and distills it down to some simple principles that can relieve us of anxiety in the future. Her TED Talk is the most viewed talk on the TED website.
A week-by-week manual on how to improve your goals. This book is taken from Dr. McGonigal’s class at Stanford and goes through exercises to build habits. This was a sacrifice over “The Power of Habit”, which also details willpower, but I think this one is more practical and that you can use the moment you start reading. One of the things it taught me was a keystone habit, in which one habit may actually bring about multiple good habits.
You’ve read this guy’s other book, “The Righteous Mind”. Before he wrote that, he wrote this book about what advice the ancients had and how to find a way to live in modern life given those set of principles. From this, I learned the concept of proper balance, between removing oneself away from materialism versus being fully immersed in it. The author really tries to distill the decades of work he has found in old, philosophical texts as he’s a professor of Philosophy.
This book was a struggle to keep on the list, but after thinking about the impact it had on me, I had to keep it on. Susan Cain talks about how one mode of thinking is not great across the entire spectrum of introverts / extroverts. In fact, most of the commonplace attitudes to think about how to collaborate, how to think, how to work are based off of the ideas of extroverts. What may work for you may not work for someone else who’s an introvert. Also, she details that most people lie on a spectrum, and not actual opposite ends. This is where I found out I’m actually an ambivert, someone who lies in the middle of the introvert / extrovert spectrum.
My cousin shared her TED talk, and I ended up buying and reading her book. Dr. Jay is a clinical psychologist at the University of Virginia who counsels students and patients in their 20’s and 30’s. Her hypothesis is the habits and foundations we build in our 20’s will help define and shape who we become for the rest of our life. This was a revelation to me because I was compromising too much of my life and deferring many important matters and questions to an indeterminate future date. In fact, after reading the book, I starting focusing on the things that I am most uncomfortable with, relationships, emotions and mental health, religion and spirituality, and my career. Many of her claims challenge conventional wisdom, like her claim about early cohabitation in a relationship, and how it harms relationships in the long run.
A fairly short book about building relationships in the long run. This was recommended by my roommate and many people on the Internet. Most relationships break down because of communication, specifically each partner does not know how to speak or listen to each other’s love languages. When you learn about each one, you can start to notice your past relationships and see where things started to break down. Dr. Chapman has been in his field for over two decades counseling marriages when he wrote this book, and it’s a culmination of distilling into 5 simple points of how couples speak to each other. Ignore the fact he’s religious because there’s practical value here, and he tries to be fairly secular.
At a school development meeting at my job at the Prep School, this book was highly praised. Dr. Dweck is a researcher at Stanford who studied kids and success, and came up with the concepts of growth mindset and fixed mindset. I took two days to sit down and read this book, and came to thinking differently about my own learning and career. I learned to ask questions and not to put up walls when I find something difficult to do. Most of the claims Dr. Dweck makes is based on her studies she’s run for over two decades.
Here’s an additional list of books that I wanted to send to my friend, but I was over-budget.
Amanda Palmer is a musician, known for her work in the Dresden Dolls as well as her own solo work. She raised over a million dollars on Kickstarter for her latest album, which I’m a backer of, gave this excellent TED talk, and this book is a part memoir, part practical advice on asking for help. The audiobook, which I purchased, also contains songs between chapters.
I choose ‘The Happy Hypothesis’ over this book because this book only focuses on the stoic teachings, and not the entire spectrum of philosophy. However, that said, there’s plenty to learn about controlling emotion and minimalism from the stoics. If meditation doesn’t work and you must reason your way through stress, this book shows you exercises on how to cope.
I’ve followed Mr. Newport’s blog for quite some time and read his other book, “How to Be a High School Superstar”, because I wanted to know if it was good to give my sister a few years back when she asked me what she should do in High School. To me, this is thecareer book. It begins by telling you that the pursuit to do something your passionate about is a myth. In fact, Mr. Newport claims that it’s the job and career that guides you to your passion. You have to build your own career up, and it’s going to have lots of twists and turns before you truly know what you’re going to do. I’ve gifted this to my cousin and she has taken this advice and went back to graduate school because she wants to build up the skill to do more in graphic communication. I didn’t consider this book to give to you because I thought about self-help before career advice, so maybe you should ask me nicely for your birthday next year (but in all seriousness, purchase this book if you can. It really is worth it).
It was a toss-up between this book and the Dr. Meg Jay book. This is a very actionable book for twenty-somethings. It goes through a lot of different aspect of tuning up your life. I’ve only read sections of this, and I’ve found it useful for tips on what friends to keep, how to declutter, and how to maintain work relationships. It’s a rather fun book that was started as a blog.
Kio Stark is a professor at NYU’s ITP program (Interactive Telecommunications Program), a writer, and a graduate student dropout. Before I even heard of ITP, I heard about this project from Kickstarter. I was a week too late to back the project, but I really wanted to be included. I signed up on the mailing list to be told when this book is going to come out. I wasn’t disappointed. This is a book about a series of interviews with accomplished people who did not decide to go to graduate school and let their careers guide them through figuring out what they wanted to do. Mrs. Stark also talks about her own experiences, and then gives a great follow-up companion on how to start learning things on your own that don’t require graduate school. Definitely a good read if you’re thinking about going down the graduate school route.
Side Note: I went to New York last year to check out ITP because I was thinking about applying.
This book is the entry book to practicing meditation without all of the spiritual fluff that’s usually included with most zen meditation practices. Perhaps anything else, this book taught me the importance of awareness and that meditation should be an extension of that awareness, not an escape from reality. Also recommended is “Zen Mind, Beginner’s Mind” by Shunryu Suzuki, which introduces the concept of proper meditation. Here is a great talk (or rather meditation session) he did @Google.
Despite being a book about happiness, this isn’t a self-help book about how to become happy. It’s actually Dr. Gilbert’s research into perception and cognitive biases and how our imagination deceives us. The book is profound with it’s findings, but I didn’t think it has much value in immediate changes. You have to think about it for a while and be aware of how our mind deceives us. Obligatory TED Talk.
I’ll call him the Godfather of modern pop psychology because he work brought about a slew of other psychologists you hear at the top of their field. This book cleared up the concept of loss aversion, anchoring, and our two modes of thinking. I find myself going back to this book again and again to clear up some very core concepts in rational and irrational thinking. In the appendix of the book is Kahneman and his collaborator’s (Amos Tversky) seminal paper on prospect theory that won them the nobel memorial prize in Economics.
This book was a lot shorter than I imagined. It’s about a scientist who studies strokes and finds herself having one early in life (in her mid-30’s). She talks about the journey into her mind as she’s having the stroke and the path to recovery. I watched her TED Talk before reading her book, and I must say I am amazed at how much I didn’t know about strokes, especially at the rates that it’s afflicted people. I could relate to stroke victims because that’s what killed my grandfather a few years ago.
As I mentioned, this was my second choice. I think this book is great in its research on habits and the author’s journey changing one of his habits that resulted in weight loss. But don’t take his weight loss story as motivation to read this book. It’s more about the power good habits can bring to your life and how bad habits are hard to unlearn. However, by the end of the book, Duhigg breaks down habit formation in easy steps and you can follow it too. There’s also this great infographic about the steps online.
Honorable Mentions
You’ll often find Dale Carnegie’s “How to Win Friends and Influence People” on many people’s list of top self-help books. Published in the ’30s, Carnegie tells some simple ways to talk and interact with people. It tells you to be kind and listen to others. To me, it was a bunch of common sense, but at the same time, it’s worth a quick flip through. If you actually read the book, you’ll hear about Carnegie’s fascination with Lincoln and a ton of parables to back what he’s saying.
Also, Stephen Covey’s “7 Habit’s of Highly Effective People” is also rudimentary for common sense. It’s read widely by Cal Poly’s Business 101 course, and I pulled a few things out of that, like the basics of negotiation. Honestly, I don’t remember the fine points of this book, like the actual 7 points, after reading Covey was a Mormon. After I shook off the religious bit, I couldn’t concentrate on what he was saying anymore, which sounds really shallow of me. I had the opposite reaction to Anne Lamott’s book, “Bird By Bird” after reading she was a Christian.
When I was a student at Cal Poly, I met this stranger in a park. She was a tall Russian American with a thick accent and probably in her early to mid-20’s. She was this lively character who was full of life. I initially thought she was part of Cal Poly’s QL+ club’s barbecue meet-up because she was hanging around with some of the club members I recognized (QL+ stands for quality of life plus, which focuses on bettering the lives of veterans , providing engineering solutions. Cal Poly has a dedicated space for this organization and I highly recommend you check it out). It took me over 30 minutes of talking and hanging out with her to realize she wasn’t a student at all. She was a vagabond.
She was on a trip from South America, hitchhiking and drifting about. Her plan for the upcoming winter was to eventually go back home to Portland, Oregon so that she could be with family for the holidays. Her travels led her places all over the world with ambitions to go to Southeast Asia. Her budget was limited, and she would take up odd jobs wherever she went.
As I listened to her stories, I reflected on my own life goals and where I was headed. I tried to dream big, yet I felt encapsulated, pretended the life I wanted was to have a stable job, playing it safe with risks, and only experience vacations by tour bus. But she was this beacon of inspiration of wild and unknown.
And in a way, I had this spirit to travel before. I had just joined Couchsurfing a few months prior, surfing for the first time in the Pacific Northwest. I was in the midst of planning a summer semester studying abroad. I had read the Four Hour Work Week, inspired by Tim’s trip to Argentina. I had just purchased Rolf Pott’s book Vagabonding. I read Chris Guillebeau’s Art of Non-Conformity blog. I felt mentally prepped and was nurturing a mind ready for traveling unconventionally.
I asked her if she was afraid of the dangers that a solo traveler may face when traveling on foreign lands, like being scammed, kidnapped or raped. I remembered she had this cavalier way talking about it, like in a happy-go-lucky charm. She replied that everyone has been genuinely nice and wants to help out. Even the crazy truck driver in Ecuador who may have been suggesting sexual favors. In the end, all of them wanted to help her.
I was conflicted by her words because I have always been taught otherwise. Growing up, my aunt who lived with us used to scare us children into thinking someone was outside the house ready to kidnap us if we walked outside at night unattended. Additionally, I had scared myself by watching “America’s Most Wanted” alone, thinking there was a murderer watching me through the window. Always following that thought would be my paranoia with windows, promptly closing the curtains and hiding as far away from them as possible. And yet, this was the opposite advice, and for once, I stopped to think logically. Eventually, I would come around to realize I should throw away my paranoia.
It got late and everyone had their fill of BBQ, this stranger and I parted ways. She didn’t want to ride home in the darkness after sunset. Plus, she didn’t want to be late helping out with supper at the rehabilitation center where she volunteered. She got on her bike and was gone.
The encounter has stuck with me. I still hear those words in my head like a mantra. “People are genuinely nice.” Those words had planted a seed I was going to bloom.
A few revelations have come to light since this encounter. For example, months after the exchange, I took road trips around the west coast and Canada. I made sure on these trips that I would intentionally get lost. And after a while, I too was not afraid of safety as much. Sure, there are plenty of things you could be worried about, but you can find many of those dangers here in the states (I won’t be revisiting west Philadelphia anytime soon).
People around the world are nice, even here near home. In my most recent trip, road tripping around the U.S., I drove through the mid-west and the southern states and met some of the nicest, most humble and giving people. I got to really enjoy genuine southern hospitality that I have heard so much about. “Please” and “thank you” are phrases that actually have meaning. The experience opened my mind to the diversity of our nation, and it made me realize there’s so much that I haven’t explored.
I give people advice about how to tackle the fears of traveling. When I talk to women who tout it’s too dangerous, I tell them about this person I met and of the misconceptions they have of the world. I challenge them to take a journey and tell me that the people in the world are generally putrid and vile. I understand I’m a man in a mostly matriarchal society with privileges that exceeds women in many parts of the world, but I also understand you don’t let that get in your way if that’s your dream or passion.
Traveling doesn’t have to be just a dream. It can be a world that opens up many surprises around you. On my wall, I have a poster of a comic drawn by Zen Pencil’s artist of a quote from Mark Twain.
Travel is fatal to prejudice, bigotry, and narrow-mindedness, and many of our people need it sorely on these accounts. Broad, wholesome, charitable views of men and things cannot be acquired by vegetating in one little corner of the earth all one’s lifetime.
— Mark Twain
I have thought about trying to find this woman and thank her for being this life changing moment that had helped me realize that I can take the risks of travel. But at the same time, I don’t know if it would be worth the pursuit. I don’t know her full name (I recalled it might have been Natalia a year after the experience), don’t know any of her contact information, and the only connection I could try is a hundred miles away (At the time, she was staying at Sunny Acres in San Luis Obispo. As a trade for volunteering there, she got room and board). Although, this could make for another interesting story.
How living with cats for the past two years turned me from a non-cat person to a baby talking, crazed cat person.
Let’s face it. Cat’s are egotistic, maniacal, cranky, yet lovely animals. Cats were around my parent’s neighborhood. There were packs of strays, the string of outdoor pets who had owners, and the occasional predator. They would amble into the yard scrounging around for food and catnip. My parent’s yard had holes in the fences where cats could slip in and out. I never cared for them; these cats were skiddish and I never put in the time to get to know them.
There was the first cat that I got to live with. Her name was Reyna. She was old, losing her hearing, and yet, would be social around people. She was my roommate’s cat, and had her own old lady personality. At times when she would be home alone, she would yell. At times when she thought she was alone, she would yell. She died a few months ago.
And it’s strange to still hear her shrill voice. She was nineteen, which is old for a kitty. And yes, I’ve resigned myself to call all cats ‘kitties’ for the sole reason that it’s just cute. Also, my roommate shoved that vocabulary in me. I guess there’s some sort of maternal instinct there, like “this is my child. Of course I’ll call her my kitty.”
Reyna curled up on the sofa
There’s the outdoor cat. Her name is Ruby. She was abandoned by her owners over a year ago and was hooked in our backyard because we were growing catnip. My roommate isn’t the kind of person to just let an animal suffer, so our home has become her safe haven. We’ve gone out of our way to feed her every morning, and now she’s conditioned. Whenever I walk out of the door, I hear this incessant meow, although I’m resigned to call it a growl. When I hear it, I hear “Feed me. Feed me. Goddamn it, you must have not heard me. Feed me.”
She’s also painfully needy. She’ll call for my attention. I’ll let her climb up on my lap. I pet her for a bit and she’ll purr. And then dig her nails into my leg. And I’ll yell.
Ruby - replacement cat
Lastly, there’s Reyna’s replacement, Jackson. My roommate got a male cat, which brings its own sets of new challenges. Jackson didn’t get out of the motherly feeding phase when we got him, so he bites everything and everyone. I’ve had to warn my friends that he may bite them, and ultimately, he does. I have a few battle scars on my hand.
But he’s also adorable. I’ll use baby talk around him because he really is a baby, although he’s looking more and more like a grown kitty. They grow up so fast.
Jackson - the sleepy, lazy cat
When I was reading this book last week, Lost Cat: A True Story of Love, Desperation, and GPS Technology, written by Caroline Paul and illustrated by Wendy McNaughton, I could totally relate to how Miss Paul writes about her attachment to her cats. She explains it as though she’s a crazed cat lady. But I also understand what’s going on in the cat lady’s mind, and that insight makes me empathize more with them.
“We are the sum of all people we have ever met; you change the tribe and the tribe changes you.”
― Dirk Wittenborn, Fierce People
I’m turning 25 next week, and I’m going through this phase of my life I’m calling “The Friendship Re-evaluation Phase.” I’m taking the time to think about who my friends are, and who aren’t. This thought exercise made me ask some fundamental questions. What is a friend? What is the concept of un-friending? How do I make the investment in new friends? Over the past few weeks of mulling around and trying to answer these questions, I’ve decided to write about it to bring clarity of what actually matters. I understand friendships matter, but no one really told me why.
Bad Relationships
To really get a grasp a great friendships, I’m going to start by analyzing bad relationships.
I remember in High School, there was this classmate of mine who thought we were friends. He would try to impress me with everything he had while I just wasn’t interested. The cues were all there, but I never forcefully said, “Matt, you can’t be my friend.” But, because my classmate never understood my cues, he continued to pursue me for all four years of my High School experience. I’ll call this the false friendship where the pursuer gives while the other party takes. I took my classmate’s recognition of friendship and I never responded back. Years later, I saw him working as waiter at a restaurant. I didn’t recognize him at first, and he gave me a shout out. Taken by surprised, I treated him with the same respect that I would give anyone else. But that’s where the relationship stayed, as acquaintances. This relationship was never to happen.
Then there are assholes. People who take, and know they are taking, but return little to nothing in return. In fact, if a situation comes up where they are given the option to stab you in the back in order for personal gain, they will gladly do it. TvTropes calls this person a jerkass. But sometimes this person masks this with their words or behaviors. They may seem genuine, but it’s a facade, and you could pay for it later.
My mother is a very gullible person. She has some of the worst friends I’ve ever met. One of most recent friends take advantage of her willingness to follow that she gets scammed into network marketing schemes more often than not. [1] Needless to say, her friends take advantage of her by asking her for favors, coming over for dinner and freeloading, and inviting her to risky activities. In one recent conversation with my mom, she tried to convince me to give her my email password because it was going to make me thousands of dollars. No, I didn’t give her my password, but I had to help my dad change his because he obliged. I have my mom’s friend to thank for that one.
It seems the patterns of bad friendships are major flaws in personalities. For example, one kind of friend we are all aware of is the blamer. The blamer will blame others for their misfortune when in fact that should be pointing that finger right back at themselves. “The world hates me.” “People don’t get me.” “If they just heard my side of the story…” They have some inherent flaw that they can’t fix because they don’t point the finger back at themselves. “Perhaps I hate myself.” “I need others’ affirmation of my self-worth to feel better.” “Maybe I should listen to the other person.”
Last week, I shared a animated video dubbed by a lecture from Brene Brown. She mentions that a sympathizer will try to help someone by beginning with the words, “Well, at least you’re not…” They don’t really help anyone and try to mitigate the situation at hand than to get to the root cause. Because of this trait, it’s hard to really understand if this friend will feel for you or feel with you.
A frenemy is an enemy disguised as a friend. Kelly Williams Brown writes in her book, “Adulting”, about the different types of frenemies.
The Seven Dwarfs of frienemies:
Flaky: Do you two have plans? How about now?
Flirty (to your significant other): This girl needs you to accept the fact that she playfully jostles your boyfriend every few minutes because that’s just who she is! She’s just friendly! Oh my God, it doesn’t even mean anything! You’re not mad, are you?
Boasty: This frienemy says something boastful but phrases it as a complaint about themselves so you’re forced to comfort her, even though both of you know damn well that she isn’t upset about looking too thin.
Crabby: This frienemy can never, ever enjoy a single thing, but instead keeps up a monologue of misery and disdain. Never bring this person to a fun dance party, or a goofy movie, or to meet your new significant other. Spoiler alert: She won’t like them. Because she doesn’t like anything.
Backstabby: This friend loves you soooooooo much! Except when you are between her and something she wants, in which case, fuck you!
Underminey: No, that dress you bought looks … great! So you! It’s awesome that you feel so comfortable with your body!
Doc: This frienemy knows exactly what you’re going through, and has all kinds of advice. It doesn’t matter whether or not you’re actually going through this, because Doc has diagnosed so, so many things wrong with you. She’s only trying to help. She’s just doing this because she cares.
— Kelly Williams Brown, “Adulting: How to Become a Grown-up in 468 Easy(ish) Steps” [2]
Learning how to distinguish the different types hacks your brain into creating a quick heuristic when taking a look at your friends. Does this friend seem to have this type of quality? And a lot of it? Perhaps that have more than one of these traits. It’s really time to start thinking about the quality of this friend. And also, it may be time to evaluate yourself. Do you find yourself in any of these roles? i might complain about flakey people, but I feel super awful when it’s the third time I do it to someone else.
By the way, every type of person I’m mentioning doesn’t just apply to friends. It also applies to relationships. If your partner is a toxic fit, it’s time to really re-evaluate your relationship. Which brings me to a piece of advice that I’ve been having trouble with these past few years.
Don’t wait for others to change.
Contrary to your good intentions, you can’t change someone. You can give them advice and offer them a different attitude on how to deal with problems, but at the end of the day, you’re not going to change them. That’s going to be a personal transformation, and one you’re most likely going to waste your time with. The investment you put into someone that has little to return should have little importance to you. Of course, how you define friendship value is your choice.
For a really close friend of mine, she’s distanced herself and it’s really hard to get a hold of her. Every time I try to reach out to her, she pulls back two steps. And it’s gotten to the point where I have considered ceasing my efforts to reach out and wait for her to respond. It is time to learn that I just can’t wait for her since she’s not willing to make the same investment for me.
Black eyed peas gif
Yes, I have the Black Eyed Peas stuck in my head. So will you.
Unfriend
I’m experimenting with different approaches to end these relationships. One way to deal with ending a relationship is to give them the silent treatment, dodging their phone calls and emails, being that person that doesn’t say anything back when we hang out. Of course, the other person might be confused in why you’ve been so shifty and may not get the message that you don’t want any part of them anymore.
You could politely tell the other party you two aren’t friends anymore, and not engage with them after. In a way, I like this approach because you’re being direct and honest while not burning your bridges. But it doesn’t work for everyone, especially those who don’t take direct advice well.
In Gavin De Becker’s book, “The Gift of Fear,” he talks about a business owner who gets pestered by a man who wants to work for him. After each exchange, the business owner engages with this man, first politely, then aggressively. By the end, these two men had a hostile and toxic relationship. When the business owner finally stopped engaging with the man, their exchanges diminished. The moral of the story is that provoking drama creates drama.
What’s hard about breaking up relationships is the investments you’ve made to it. You feel locked-in to it and can’t exit. But this is also a practice in confidence. Take the time to prepare what you’re going to say before you go with this action of un-friending. If you know the other person well, you can tailor it for them. Don’t make it into some elaborate plan and going extremely out of your way to make it known though. Be tactful.
Good Relationships
Broken up with those bad friends, what are we looking for with new friends? I don’t have many true friends. True friends are friends are people that could save me from a pinch, or can be relied on to help when I’m at my lowest point, or can be reached out to for help because there is an enormous amount of trust in this relationship. They are people who I could call my family. They are people I know I will grow old with, that even if we have a severed communication line for years, when we reunite, it will be like nothing had happened between us.
Good friends have integrity, trust, and companionship. They are able to make tough calls, able to empathize, able to listen, able to meet halfway. There’s a good blend of giving and taking. They don’t have to necessarily have the same personality, but if they help me grow, and vice versa, I know I can benefit from the relationship.
I don’t have time to understand everything. I allow other people to spend their time studying something very narrow and leverage on their knowledge. I invest in people. And it’s not a question of whether they are smart. It’s a question of whether I can spend my time with that person. Will this other person be able to listen to me? Can I take the time to listen to this person? Are they continuously growing? Are they helping me grow? Can I help then grow?
Take Some Time to Invest in People
A recent friend of mine told me over lunch that we don’t have the power to change our current friends. Maybe we don’t necessarily need to un-friend them. What we can is choose who to hang out with. He brought up something that hasn’t occurred to me often enough — you can always make new friends. By scoping out new friends, you increase your chances of finding true friends. Your old friends, the ones that you make plans with but they repeatedly cancel on you, can be displaced by these new friends. And new friends may involve going to a meet-up or event, talking to strangers, and following up to make plans to do something later.
With everything, making new friends or being maintaining good friendships takes practice. I’m taking the time each week to give exclusively to friends. Even if it’s a little bit of time, every amount of time counts. There was a time when I didn’t invest any time with friends. For the last year of my previous job, I isolated myself. I was working evening shifts and I would make the excuse that I couldn’t meet people.
I was convinced that I had to sacrifice friends in order to keep the job I had. I worked my ass off and didn’t see much financial reward. Burnt out most weekends, I didn’t make any effort to reach out to anyone.
I was alone with no one to really talk to. I was miserable. There were no pending texts. Nothing in the inbox. No one was making an effort to reach out to me. It was a dark time, and when I finally quit my previous job, I understood it’s not a flaw in others but a flaw within myself. Since then, I’ve been slowly reaching out again.
It was tough at first. I was scared of sending off emails to people I hadn’t talked to in years. But after the first outreach message, the subsequent emails were easier. Now, I’m not scared to ask strangers for emails and follow-up with them. I might sound bizarre, but try isolating yourself for a year. But it can’t be that bizarre, because as I mentioned in my ‘thankfulness’ essay two months back, I mentioned that most people suck at following up.
“The people you surround yourself with need to lift you up. I’m not just talking professionally, but personally as well. Who fascinates you? Who challenges you? Who makes you excited to get started every day? Treat them well, provide them with value, show them why you’re worth keeping around, and you’ll get tremendous return. Invest in people. It may be the most important business investment of your life.” — Gary Vaynerchuck, The Most Important Thing You Don’t Have on Your Bucket List
The benefits are enormous. Perhaps though, you don’t want to have a huge group of friends. That’s the most important thing about investing in friends — understanding your needs and wants. We are all selfish, but we have to be to some extent because we need to take care of ourselves. One way we take care of ourselves is knowing what we want in relationships with others. Again, Kelly Williams Brown writes in her book “Adulting” the following.
“..Assess honestly your own friendship needs and wants.
Some people have the time, energy, and boundless affection to have thirty-seven really close friends. Some people want two close friends, and fifteen people they can call to go out dancing with on a random Friday. Some people want one really tight-knit group. All of these are 100 percent reasonable social needs.
Our model for someone who does well in friendship is someone with a zillion friends, who is never alone, who can conjure twenty people at a bar with nothing more than a mass text. For some, this is indeed what they want. But it’s okay if that’s not what you want — if you’re a quieter, shyer person who would rather have a small handful of people you’re genuinely close with.”
— Kelly Williams Brown, “Adulting: How to Become a Grown-up in 468 Easy(ish) Steps”
I’m the type of person who wants enough friends around me to tell me I’m a bit crazy. I don’t care for the zillion of friends. What I care about are friends who are there for me. There isn’t much to this world more than living it with good friends.
[2] I can’t help recommending this book if you’re in your twenty-somethings. It has a lot of great advice for young people who are in this transitionary phase of being a college student to being a working adult.
You’ve run yourself into the gutter, broken down like a rusty old pick-up truck. Before, we used to be able to call each other without hesitation, talking about what woes us, what bores us, what excites us. Now, I get this nagging feeling you want to call me and talk about your issues, but you probably find it easier to shut up, go about your day, and live with that feeling until it takes a turn for the worst.
But here’s the thing. We’ve all been there. Years ago, I found myself hiding from my friends and family, laying down still on my bed. And just like so many others, how I ultimately got out was the help of my family and friends. It wasn’t what they said. It was how they acted.
Back in High School, I fell in a deep depression. I wasn’t eating much. Food felt like a odorless substance passing through my esophagus. At the dinner table, my mother inquired if I felt alright. She examined my complexion and followed up with a comment about my weight and how thin and pale I looked. Annoyed that she didn’t comprehend, I got up and left the dinner table. I couldn’t tell her the awful truth that I was painfully depressed. I went to the restroom to wash my face. The water was cold, but I didn’t feel it. I was numb.
I went to my room and looked at a recent gift my dad gave me for my birthday. It was this dual cassette and cd player that could also connect to the radio. I really didn’t want it, but my dad insisted I should have it. I remember laying down on my bed and looking at it. I thought, “here’s an item that no one will remember in years, just like years after I die. It’s an afterthought. No one will care about this hunk of metal. Why did it have to even exist? Why do I have to exist?”
The depression was hard to get out of. The core of the depression lie in a deep-rooted fear of dying. Or rather the thought of not being around anymore. My existential crisis made me contemplate suicide. I wasn’t thinking of an elaborate way of killing myself. I imagined what it felt to be dead. But dead is dead, and I supposed there isn’t anything there — nothing to feel. I tried to think of all of the dead, both famous and infamous, and how they must feel being dead. I thought of my grandfather who had died when I was young. I thought of how it must feel when my parents die. I trapped myself into this line of thinking for nights, perhaps weeks.
And I think I needed a friend to be there. You. You were supposed to be there to help me, get me out of this peril. But you were caught up in a love affair with another boy who complicated everything. And he broke your heart eventually. Instead, I got help from playing tennis every weekend. I got help from other friends who invited me to go do other things. I was pulled from my demise by distracting myself from my cloudy thoughts. And eventually, when you wanted to hang out with your best friend again, pulled me out to go biking. And I stopped thinking about it, and the depression slowly withered into a tiny voice in my head. A voice that still bellows once in a while, but doesn’t bother me as much.
Eventually, therapy helped me open up and realize that voice never goes away, and I have found ways to cope with it. I don’t feel like the vicious circle will return. I’ve changed my mind on how to think about suffering. Victor Frankl wrote in “Mans Search for Meaning” that there needs to be thought of the future in order to survive the perils of today. I have found meaning in work and an endless search for perfection that I’m sure can keep me occupied well into the future.
And now, you’re going through a similar experience, except circumstances are much different. No one can just pull you away from what you’re doing because you’re making ends meet. You’re anxious all of the time, hurting yourself by having ulcer-like pains from the stress. I understand the doctor’s prescribed you medication and you’ve started taking measures to take care of yourself, but I know from experience that’s not enough. Drugs aren’t the ultimate answer, just a momentary calm before you have to wake up and face it all again. You can’t fight this alone; you need the support of others.
Please know you can call, text, or reach out to me anytime. Know that when you contact me, I will not judge or hurt you. I will be there to listen, even if you can’t say a word. Maybe you won’t want to use words. Tears are also appropriate. Again, I won’t judge. I won’t make faces at you, bring up your anxiety, make you feel worthless or pitiful. I won’t give up hope on you. If that means I have to spend more time with you, that’s fine. If that means you can’t give back at this moment in time, that’s fine.
Over this summer at Dev Bootcamp, one of our Engineering Empathy sessions was led by Greg Baugues. He talked about his experience dealing with ADHD and his journey that led him to find out he was also Bipolar. In one of his stories, he told us about his mood cycles. He would go through lengthy periods of highs followed by similar periods of lows. During his low in a different era of his life, he would stop being productive to the point where he would skip work and eventually be fired.
On one particular occasion, his low was so bad, he was scared to leave his house. His co-worker who really cared about him came over to his house. His co-worker didn’t have to, but he went the extra mile to help a fellow friend out. At the time, Greg didn’t lock his doors to his place, so his co-worker arrived at his place and knocked on the door before letting himself in. Greg hid between an area between the bed and the wall and covered himself in blankets, evading his co-worker. And it really hurt Greg, not being to come out to the one guy who went out of his way to help him. I really felt him, both being Greg and being the co-worker.
If you will disappear in the dark abyss for weeks, I will come and try to find you, just like Greg’s co-worker. You don’t have to be alone. You don’t have to be afraid. You don’t have to feel like I’m trying to treat you. I’m your friend and I won’t judge you. You know that time you were so frozen, you hid yourself in the closet? I will be the friend who takes you out.
When I say I want to help you, I mean I want to be where you are. I can be the bear in this video. I won’t blame you for what you’re going through. I will be the one to connect with you and be empathic. Because I’ve been there, and I was hurting too.
Next time we see each other, I’ll give you a huge hug. Hell, here’s a virtual hug.
Virtual Hug
That felt good, right?
I can’t help but recommend these two posts: Depression Part 1, Depression part 2. Allie Brosh of Hyperbole and a Half wrote these two stories about her ongoing struggle with depression. I found myself relating to them, both laughing and crying.
Hyperbole and a Half on Depression
It takes a serious dark tone and tries to vocalize how a depressive person feels. This panel above hit home because I imagined if I tried to tell my mother when I was depressed that I just wanted to be dead, she would bereave and I couldn’t live myself. In an interview with NPR, she opens up about her suicide attempt on the radio, something she didn’t tell in detail to her husband. She breaks down a little, and I feel its gravity and weight. I wept. Hearing that, I could relate with my own experiences, and that really hit deep. Maybe it may hit deep with you.
If you ever feel like ending your life, make it a priority to tell me first, and I will help you out of it. I’m here to listen. I understand that one of the biggest side-effects of severe anxiety and panic attacks is to attempt suicide.I don’t feel like we have enough resources out there to help us through these times, and we all too often forget we have others to talk to. I’m telling you now. Talk to me. I will be as silent as a ninja, listening with attentive ears. Again, I won’t judge you. Only after you have spoken will I speak. Only after you have spoken will I embrace. Only after you have spoken will we both breathe.
I implore you to reach out to me today. Right now if you can. Please, don’t be shy. Pick up the phone and call me. I’ll be here. Waiting.
Sincerely,
Jeremy
If you have a friend who needs some help with anxiety and depression, here are some resources to get you started, taken from the subreddit /r/SWResources.
“Contemplating Suicide: No Way to Understand Unless You’ve Been There’ Blog post at PsychologyToday.com from “Gerri Luce” who’s been both a therapist and patient in suicide intervention.
National Suicide Prevention Lifeline’s “Get Help” page gives information about many ways to get help. US-based resource.
Helping Yourself When You are Feeling Suicidal Practical, comforting tips from SCBS Australia.
“If you are thinking of suicide…” from rethink.org. Coping strategies and options for help. UK-based resource.
“Coping with Suicidal Thoughts” from Simon Fraser University. Downloadable PDF workbook with strategies and exercises.
Worldwide Crisis Centre Directory from the International Association for Suicide Prevention.
Personal Experiences of Contacting Samaritans. The Samaritans are a UK-based telephone crisis counselling service. Stories and video from actual clients.
What Happens Now - American Association of Suicidology. Blog by and about suicide attempt survivors.
Suicide Attempt Survivors - Waking Up Alive Support, stories, and recommended books.
“Ways To Help Yourself When You’re Feeling Suicidal” from mixednuts.net - depression and bipolar information and chat.
Suggested Reading List from save.org, comprehensive list of books on suicide and related topics.
Recovery Strategies from J.D. Schramm at TED.com A practical follow-up to Schramm’s talk, “Break the Silence for Suicide Attempt Survivors”.
“Suicide: Read This First” from metanoia.org. Probably the most famous suicide prevention text on the internet.
Some of my own resources on anxiety and depression:
Tips to Manage Anxiety and Stress from the ADAA
12 Tips for Friends and Family of Those With Anxiety - It’s highly important we understand how to cope as well as help those with anxiety and depression.
If you’re friend is suicidal, please reach out to professionals immediately. (For the US only. For other countries, check this /r/SWResources thread.
A few months ago, I emailed my cohort from Dev Bootcamp about my recent success on landing a job. I wanted to post that letter after fellow DBC grad, @StephanieChou92, posted her success story to her cohort. Also, I have a few updates since this letter that I wanted to add now that I’ve helped a few of my other cohort mates.
Sent on October 25th, 2014 (some edits were made to make it more legible with less inside jokes):
Hi Salamaniacs,
I haven’t heard much job announcing in this thread. I wanted to share my story because it kind of goes through a rough patch, and it may talk to some folks who may be having similar issues right now.
I got an offer to join Reverb Technologies in greater SF area for a UI Developer, i.e. front-end developer, position to start next week. I’m going to take it because of the company culture, the team, and the technology I get to work with. My coding challenge was to make an AngularJS application, something I didn’t learn at DBC, but after two days of tutorials, the challenge was much more approachable. I would advise anyone pursuing front-end development work to play with some Javascript frameworks like Angular, Ember, or Backbone. Message me if you want some ideas for JS frameworks and libraries, or JS projects to play around with. Don’t be afraid to play with other technologies you didn’t learn at DBC.
This said, I have some interviews with other companies next week. I have been advised to still do them and not try to blow them off. Right now, I’m leaning towards doing the interviews because I get a choice in a few months whether I would like to stay with the company or move somewhere else since the position is contract. It’s true what they say: don’t burn your bridges. The developer community is small in any local area, even Silicon Valley.
Let me back up and talk about the journey to this point. I took about three weeks off of the job search to do a road trip back home as well as a detour to South Korea for personal business. I was really wiped out when I got back and I thought I was far behind everyone else in our cohort. I started working on the resume and LinkedIn, although it would be another two and a half weeks until I actually sent my first application out. During that period, I slacked off a bit. This is ill-advised, but the worst got to me. I panicked, allowing perfectionism to get to me for these applications to the point I wanted to delay sending it in. I had a cold email sitting in my inbox for at least two weeks before I sent one thinking this is just a creepy email. Coincidentally, I got a reply within 24 hours, but I didn’t take that opportunity to continue to converse. Here’s my advice for a month ago Jeremy and anyone finding themselves with a bit of lost hope right now, “Do, or do not. There is no try.”
Yoda Founder Quote
In addition to these blunders, I was talking to Jonathan at the time and we were talking about his interviews at Groupon and his subsequent offer. I felt the pressure to succeed soon, but I feel I wasn’t progressing fast enough. My runway also isn’t that long; I had until the end of November to find something because December is often seen as a no-hire month.
It wasn’t all bad though. I participated in my first hackathon at Github HQ, I started a coding club with some of us in the cohort where the goal is to just read code, and I started getting back into shape since I didn’t do much during that month of travel. I send my first application out three weeks ago, send out about three or four cold emails and got replies from two of them, one is to the CTO of the company I’m taking the offer with and the other is a DBC SF alumni. The DBC alum and I had lunch the following week and offered to push through an application for me if I applied to Hipmunk. Also during this time, I checked out DBC SF and Lia introduced me by email with Marie @SF who does what I think is equivalent to Lia’s role. Interestingly enough, Marie helped me today at a hackathon she helped organize at the SETI institute because she found me teammates. It shows that this community is small and you’re bound to run into each other at some point.
After talking on the phone with the CTO of Reverb, he got me in touch with the head of engineering who found a position for me that I talked about in the beginning. It lead to a coding challenge, as mentioned before, and a three and a half hour interview process with six of their engineering staff. The questions varied from technical to behavioral. The technical questions were very direct and included whiteboarding, general questions, and doing a code review with my coding challenge. My advice here is if you don’t know something, don’t be a wise ass and think you know it. I definitely said I don’t know to a few questions. Within four hours after the interview, I got a call with an offer. What I really liked was that I get to work with a mentor, everyone on the team can work together well, the company has re-focused to what’s important and understands the needs of its employees. It is engineering driven and I will get to work on a lot. At the same time, it’s a mainly 9 to 5 job where most people don’t work very late, and rarely weekends, something I actually want because of some previous work blunders at the last company I worked at. Also, it doesn’t really have that bro-grammer culture lots of people associate with start-ups out here.
I did do some networking at a conference in SF, a conference at SAP, and at a meet-up or two. Really, don’t think networking as this laborious thing. As mentioned before, it involves the willingness to learn and have a conversation with other people, not about the hungry dog that won’t stop barking “gimme a job, gimme a job.” It takes a few times to get into the groove of talking with strangers because this skill withers when I don’t do it often enough. If you want to schedule a talk with someone, there’s a new service called Start-up Travels that will let you meet with entrepreneurs in your area. Disclaimer: I haven’t tried the service but will sometime soon. You may need to go outside of your comfort zone; I practiced this by singing loudly in my car en route to one of these events because there are most likely other people in cars or on the street staring at you funny. Let them stare and be proud.
Cheers and happy hunting,
Jeremy
Updates:
My contract position is up soon, and I’m in talks to becoming full-time. I will let you all know as soon I know more.
Start-Up Travels is actually a great service. I’ve used it once back in November when the lovely @YrjaOftedahl from Norway contacted me and we met for coffee. I found out I can use it for my local area as well to find entrepreneurs or others working at start-ups. And the service is from a team in Denmark and is relatively new, so jump on this bandwagon.
I’ve gotten comments from some friends and family that I got this job in a snap. But the truth is, it was painful not getting a paycheck for months. I had to cut back on everything I could a month leading up to getting this job, including getting a loan from a friend. Now that I have this job, I’m slowly paying my debt off.
I thought I would stop meeting people after I got this job, but quite the contrary. I’m scheduled to meet up with more people this month — developers, entrepreneurs, designers, scientists. It helps to also write part-time for myself, which you should all check out.
Coding Club has ended. We had a run of 10 meet-ups in 2014, and I plan on doing something different in 2015. I was unorganized with this hour long session every Sunday, and the successes and failures of the club can be the topic of another blog post.
I get to code every weekday, and I love it. DBC was the starting point. Now it’s up to me to continue my education, and boy do I have a lot to learn.
For every month of 2014, Nerina Pallot has released an EP. Each EP contains five new songs. Nerina is a British musician whose past works include her own releases as well as writing and producing songs for Kylie Minogue and Diana Vickers. I’ve had her new music on repeat and it excites me she took on such a challenge. It’s a huge commitment to release something every month, trying to break free of that creative struggle we all face. We begin to create something, begin crafting, grow bored, and move on to a different project. In her explanation video, she says she has started more albums than finishing them for this reason. Out of my own fears of reaching a plateau stage of my skills and projects, I want to examine where one stalls with creative work, what it means to make a commitment, and what kind of sacrifices and risks there are.
We are nearly there, friends… It’s due in no small part to your encouragement, benign disbelief that it would actually happen and wonderful feedback. You are all always in the back of my mind when I sit down at a piano to write and when I’m wondering whether I’m going slowly mad and if anybody’s listening anyway. You keep reminding me that you are, so please keep willing me on in the home straight. I promise not to let you down.
— Nerina Pallot’s Newsletter, November 9th
Nerina has met her goal every month. I bought at her EPs every month and have been following her progress along the way by listening to her music, checking her twitter page and reading her newsletters. Her hope with the project is it will help her grow as an artist. In her past, she has started a song, works on it, can’t come to call it complete, and gets excited about another song while leaving her current one in limbo. It’s a curse of perfection, and I can relate in my writing when I leave something written for weeks untouched and realize I don’t want to write on this topic anymore. For example, last week’s letter on a year in review started as an excellent idea until I started writing it. I grew to hate it after realizing I’m just copying others’ year in review. I re-wrote it on the day I was to release it and now it’s relatively acceptable, but by far not my favorite letter.
Album cover for Winter Rooms
When you feel like you’ve learned whatever there is to learn from what you’re doing, it’s time to change course and find something new to learn so that you can move forward. You can’t be content with mastery; you have to push yourself to become a student again. ‘Anyone who isn’t embarrassed of who they were last year probably isn’t learning enough,’ writes author Alain de Botton.
— Austin Kleon, from the book “Show Your Work”
Mr. Kleon addresses everything I fear in creative work — reaching the plateau phase. At some point, you realize you aren’t moving forward anymore, and you wonder why the work you’re doing doesn’t make you think. Maybe it’s your job, your relationship, the conversations you have with others. No matter, we don’t grow, and we find ourselves saying fairly arrogant things, like “that’s the why it just is” when we’re asked why we aren’t improving. This is a mental game, and there are strategies to move away from this slump. I talked in the past about being uncomfortable, but how does one push themselves to that state? Nerina forced herself to reach that level by announcing her ‘Year of EPs’ goal.
It’s difficult to do one-up yourself. The fact is we try so hard to make everything better that we forget that it’s the crafting in which we got into this business, not the fame and fortune. I’ve heard time and again if you’re in it for the money, you’re in the wrong line of business. Creative endeavors involve a lot of time and effort for something someone will notice as such little output. But that’s the true magic of creative work, and what happens behind the scenes is just as fascinating as what is the outcome.
NPR did this series called Project Song a while back where the producers would invite a musician to come to a recording studio and spend 48 hours creating a new song following a given theme. In one episode, the producers invited Moby to create a song about a specific picture given to him, and he took his time coming up with the lyrics, composing the harmonies and melodies, and had a singer come in and do the vocals. He mixed everything together and created a song that my friend and I played on repeat for a road trip to Portland, Oregon. I was astounded of the raw commitment to the deadline and sacrifices one makes when making something out of thin air in a short amount of time.
Nerina has more than 48 hours to create her songs but the constraint still makes it hard to keep with the commitment. In the video, she says there isn’t all day to record a hundred takes and choose the best one. Maybe at most, she gets 3 or 4 takes because of the limited time with the studio and access to other musicians. She must prep well beforehand to really get the songs right. And if it doesn’t come to par with what she would like it to be, so be it. At least she finished the song. Out of these sacrifices, she has somehow made music that I really want to hear every month. Sure, not every song has been a hit, but there have been enough where my interests have been perked each time. And fans like myself are what help drive her to create more. Knowing there are loyal fans who will back your endeavors is huge motivation to get the EP done. Knowing there are readers that are appreciative and will give me feedback is a huge motivation for me to write.
Contrast this short burst of creativity to the anal perfectionist style of creativity. An example that comes to mind is the attention to detail Jackie Chan gives to his movies. In his Hong Kong work, Jackie Chan will take hundreds of shots to get his fight scenes perfectly right. He wants the fight scenes to be as real as possible where the audience can see the blows, feel the pain, and still be able to follow the rhythm. In most modern day fight scenes, most shots cut too fat to show the blow, usually to cover up the fact the main actors don’t know how to fight. But modern cinema could get the right shots, but it would just take too much time. In one movie, Jackie took 2,900 takes for a ten minute scene. It eats into his budget, but because he knows what his audience wants, he’ll go the extra mile.
Being the perfectionist and waiting until you get the perfect take is one way of recording music. Nerina has done this before if you’ve listened to her other albums. In one of her video diaries for her album, “The Graduate”, she shows you she can play all of the back-up instruments and can mix them all together into one performance. With over a decade of record producing, she distills her knowledge and forces herself in limiting her options of creating the perfect. Instead, she has to make the best take in one or two studio visits, which pushes her in her discomfort zone and she must exert a lot of time and devotion to the preparation. The big truth behind creative work is it’s actually really boring. If you watch me practice piano, I will often play the same part over and over for a few minutes. By the time I’m about to move on to the next part, you’ll get up and leave. Sure, you can take shortcuts in music making. You can slap together some lyrics, bad vocals, and editing it like crazy with auto tune. Yes, it will sound decent, but not different. It takes the years of deliberate practice and a devotion for crafting the sound you want to hear as soon as you can before it fades away.
Nerina found a different way of approaching music making where the stakes are low enough where failure is alright. But failure isn’t a bad thing. It teaches you what you can’t do and forces you to think in other ways. The audience might not like her most recent EP, and that feedback drives directly back to her next piece of work. Musicians aren’t perfect, and sometimes they don’t get it right every time. Elizabeth Gilbert, author of “Eat, Pray, Love”, gave an excellent TED talk about failing after success. She talks about stalling the difficulty mentally to write more because she saw that others expected her to write another hit. But she knew it was a damn near impossibility to strike lightning twice. But after a change in mindset on how it was never about the success and the fear of irrelevancy is a mental game, she carried on and wrote another book. That book flopped, but it was the failure that allowed her to carry on. Regardless of outcome, Mrs. Gilbert saw that it was never about writing hits but about writing something she wanted to write. Whether or not the book was going to be a wide success is something beyond her control. What she controls is her creative endeavors. Everything else is just icing on the cake. And in the end, the really devoted Elizabeth Gilbert fans really supported her while other people who were on the “Eat, Pray, Love” hype train jumped off the boat. Mrs. Pallot has the same drive. I thought some songs could use a bit of polishing, but I love this imperfection and the feeling that there is room for an artist to improve. I am a super fan, and will support her future endeavors because I just love the work she produces.
On top of her limited time to write, produce and record her EPs, Nerina has been playing live shows. During the home straight, she played 20 live shows all around the UK. One of her EPs, number 11, contains five songs from her live show in Union Chapel back in October. She is no slouch; she’s knows she has to hustle. Her tenacity for delivering goes above and beyond, and that’s the type of artist I want to listen to.
You might be thinking, “now what?” She’s made the goal, but will her creative juices stop flowing and she will go through a slump? Her latest newsletter assures otherwise as there are more surprises in 2015. I was with an experienced runner this New Year’s Day trail running though the mountains. She told me she almost have up running last year after she meet her distance goal of finishing a marathon. She asked herself, “what now?” and took a hiatus from running and subbed it with cycling. She recently rediscovered trail running, and that’s gives a different running high. Like Nerina’s project, it took a different approach to understand why we do what we do.
I’m not worried for Nerina either, because this was her journey of rediscovery. This project has been an absolute inspiration for me because it helps me put what I do in perspective. It’s also a repeated reminder that it’s always possible to commit yourself to a project like this, but you must be aware of the sacrifices.
In closing, you should check out the entire EP collection from this past year. If you want the highlights, you must check out the following songs. I’ve also made a Spotify playlist if that’s your thing.
“The Hold Tight” from “The Hold Tight” EP
“Ain’t Got Anything Left” from “When the Morning Stars Sang Together” EP
I used to do “A Year in Review” back at my old blog. The last one I posted was back in 2011, and it was more of a chore than anything else, re-posting pictures I thought were cool from each month. In a way, I’ve gone away from posting on Tumblr, which is about posting pictures and re-posting other people’s work.
Touting how I’ve changed this year, this is a good time to log a snapshot of where I am today to evaluate myself in the future. Taking a lesson from someone else’s reflection on the past year, as well as another list, I’m going to bullet point what I’ve learned this year.
The Good From 2014:
I quit my job back in March. Haven’t looked back, haven’t been back.
I regained my health and happiness. I started the year with serious depression and was nowhere near fit. I had an unused gym membership for over a year that I was dumping money into. Today, I run three days a week and do yoga two days a week.
I learned the basics of Ruby to pass the entry test for Dev Bootcamp, which I attended this summer. I learned how to program, but more importantly learned how to learn. I wept at the end after parting with some unforgettable new friends.
I got a job as a UI Developer. This job pays more, has fewer hours, and I have an awesome mentor.
I started writing weekly letters, this very series you’re reading in fact!
I’ve continued journaling this year. I’m six books in for a total of 3.75 years of consecutive writing
I drove across the country and back, totaling over 9,000 miles driven. 18 of those states I drove through was my first time there (Utah, Wyoming, Colorado, Nebraska, Iowa, Illinois, Indiana, Ohio, Pennsylvania, Massachusetts, Rhode Island, Connecticut, Delaware, Maryland, Virginia, Tennessee, Arkansas, and New Mexico).
After the road trip, I hopped on a plane to South Korea. It was the first time I had ever been. I stayed for over a week helping a friend recovery from surgery.
I ran a coding club for four months after Dev Bootcamp ended. Plans to continue this are tentative next year.
I attended my first hackathon this year. I had such a great experience, I attended two more.
Top Books I’ve Finished This Year:
Salt Sugar Fat: How the Food Giants Hooked Us - This helped me put a persona to big food companies.
I always knew the amount of salt, sugar and fat were increasing with processed food,
but now I understand the driving force behind that, and the science they use to justify such actions.
Pedagogy of the Oppressed - This is an old book that looks at adult education in different manner, beginning with the premise that we oppress rather than liberate.
Show Your Work - Austin Kleon’s follow-up to his first book, “Steal Like An Artist” about getting feedback and how to handle it for creative work. Quick read.
East of Eden - I hadn’t read this classic before, and after starting a short book club this year, became one of my instant favorite classics. A fictional story that spans decades that resonates the biblical allegory of Cain and Abel.
Kern and Burns - This is a collection of interviews from design entrepreneurs. It opened my eyes to design in the workplace and how companies are shaped from it.
Top Films I’ve Seen This Year:
12 Years a Slave
The Wind Rises
Chef
Boyhood
I want to start a new list for the upcoming year that doesn’t involve resolutions. I have made resolutions in the past, and I have not been very involved in making them happen because circumstances change, or the goal wasn’t specific enough, or I just don’t like the goal anymore. Instead, I’m making a “I don’t give a fuck” list to live by for the next year.
The Fuck-It List of 2015:
Being nice. Throw that out. Be kind and be able to confront others by telling them what’s right, not cater to what they want to hear. But don’t be a dick about it.
Being a liar. Seriously, honest is the best choice.
Spilling the whole can of beans. As a corollary to the above, I to be succinct. Entice others with a small amount of information first. Then see if they’re interested in learning more.
Pleasing everyone, or living up to anyone else’s expectations other than my own. Why should I fantasize about making other people happy when they don’t always have my best interest? I am the sole person responsible for myself, and I should never forget that.
Haters. Period.
Fitting in to a mold. I don’t need a label nor social circle to define me.
Guilt. I have felt this weight long enough, and its time to stop dwelling on this one.
This list was inspired by these two lists, both from the same author. This list item from one of the list rings so true to me:
#14. Falling in Love
If I learned anything in 2013, it’s that love — the overwhelming, this-is-the-one kind, the love that makes you weak in the knees, if not slightly duller in the head — isn’t real. It exists outside of reality, in a world devoid of calories and Kardashians. The fall is fun, for a while. But big love is just that… oversized and oversold. Overstated and filled with impossible expectations. I don’t want to fall into that kind of love again. It lacks substance. I prefer the little loves. My best friend’s daughter running around the kitchen chanting, “It’s all rainbows,” over and over again. The wag of a dog’s tail when you scratch the sweet spot behind her ear. Neglected nuances, subtle sincerity — that’s where love lives. Lost in a pile of unmatched socks, it sits and waits for you, overlooked and underappreciated. Flawed but sturdy; frustrating but frank. A beautiful mess of sadness and hope. Fuck engagement rings and moonlit walks on the beach. Love hurts because that’s the only way to tell that it’s real.
— Chantielle MacFarlane
With the past few weeks of heavy and light downpour here in California, I’ve been hearing repeated conversations. There’s been talk about how the drought is ending, how bad the streets are flooding, how heavy the rain can get, how bad the traffic is and how bad the drivers are during the storm. People demonstrate how out of touch they are with mother nature and how fast they can bring it back into focus. Typically before the storm, we have this feeling that as long as we keep doing what we’re doing, I don’t have to worry about how bad mother nature can turn against us.
As a prime example, the rain has delayed construction of a brick pathway to the house I’m renting. My landlord could not foresee the bad weather. When the rain started, there was little concern it would last. But weeks past, and the halt proved more worrisome. We would like to continue next week but now we understand how unpredictable the weather is and we can’t be certain. We aren’t complaining heavily since it’s something we have absolutely no control over, but we’re all anxious because the construction blocks our driveway, and there’s the unsettling feeling of being incomplete every time I get home from work.
I’ve tried something new this week. I stop myself from fueling the fire to complain about the bad weather and think about the teachings of the Stoics. Seneca once practiced the art of thinking about the worst so he can brace himself if something bad happened. Instead of freezing up, Seneca would be able to face the perils because he’s already primed himself with it. Someone who doesn’t prepare mentally is more prone to be shocked and find themselves blocked. As an example, last week, my friend asked me, “What is there really to do on a rainy day? Nothing!”
As I sit at a cafe, sipping my hot cocoa by the fireplace, I think back to some memories of rainy days. I remember gray skies drooped over Berkeley on any typical week day. It felt morbid and unsettling because you were in transition between sunlight and rain. In elementary school, this weather had no effect for the children playing in the yard during recess. We got used to this slumber weather, and that became the norm. On those rainy days, we had a sigh of relief because it finally felt like the weather wasn’t fooling us with that gray drape. But that limited outdoor play and we would have to stay indoors and play adult supervised games. For the first few times, it would be great playing board games, heads-up 7-up, or some other interactive game. But there wasn’t much variety to the selection of games, so some kids would get bored. And a bored mind tends to produce unsettling behavior, like screaming, whining, or pacing about the room. As kids, we’re expected to have the ability to run amuck and transfer that gulp of energy into physical activity. But when it rains, and there’s nothing else to do, we’ll exhibit the same behavior in closed quarters. We woke up with the expectation on this day to be able to have our outside time, and now the rules are changed on us.
Santa Cruz has this tradition called first rain. Many call it the naked run, and when it rains for the first time during the autumn season, students would rush out and streak. The first instance of first rain began in the fall of 1989, weeks after the Loma Prieta earthquake. Students were afraid to stay in the dorms at Porter College, not to far away from the UC Santa Cruz campus, and slept outside. On some dares, a few students ran around naked, and thus began the tradition. Over the years, the naked run, as it was called, happened spontaneously during the first heavy rain. But people wanted to create structure for the chaos, and meetings were held to discuss the rules of first rain. Something as unpredictable as when the first heavy rainstorm has been transformed into its own spontaneous social event.
I studied abroad in Germany a few years ago for a summer. I hadn’t packed an umbrella or rain gear and was completely helpless to the flash rains that would pour for a few hours at a time. The first time it happened, I got soaked while carrying my camera. Needless to say, the camera broke and I had to purchase a new one. With this new camera, I was able to photograph another incident where it was raining and a group of my friends wanted to take a photo in front of a fountain. We stood there looking very soaked and a group of tourists joined in on our fun. It was laughable at first, but more and more strangers were rushing in to the photo. For the next three minutes, I was confused by the crowd, but also invigorated by the enthusiasm of everyone around me. Suddenly, I forgot where I was, and the rain didn’t matter.
Last picture my camera took
Sometimes, we forget the destructive power of the rain. On a family vacation in Florida, my father drove us on a day trip through Key West. The weather report that day said there would be a storm that night and that we should expect high winds. We limited our time we there and left by mid-afternoon. But the weather report was wrong, and it began storming an hour after we left. We sped through the two-lane highway and my father made some risky decisions passing up drivers with our rented all-wheel drive SUV. The palm trees were blowing fiercely, and I was worried they may fall on the road. Visibility was terribly low, and it felt as if this was it. But my father got us through it, and we made it back in one piece without crashing into a ditch.
This summer, after a long road trip from San Francisco to Chicago, I was ready to meet my roommate at a place I subleased. As I would find out at the apartment building, this rental was a scam. This roommate had their identity stolen and I wired money to the scam artist. Having felt the rug pulled under my feet as I thought about what to do while eating at a Panera Bread, it started raining hard. Someone mentioned to me this rain would last all night. Unprepared, I went across the street to a drug store to purchase an umbrella. I panicked; I had no idea where I was going to sleep and I was going to get severely wet. I didn’t know how to handle these changes, and it felt like my world was crumbling. But a friend of mine came through; I stayed with a friend of a friend to recuperate. When I got there, I took my wet clothes off and stared out of the window to the lake and felt a calming sensation. “It’s not so bad,” I thought. “I’ll figure this out just as I’ve worked other things out.” I found another apartment the next day and was able to make it to my first day at Dev Bootcamp.
A few months later near the end of my Chicago experience, I thought it would be great to go to Hot Dougs before it closed for good. I enlisted a friend to wait in line with me, and all seemed good. There was a two hour wait and it was just blistering hot. About the hour and a half point, the skies turn to a shade of gray. The storm was coming, and it was going to be huge. There was a choice to make: wait it out for another thirty minutes and get soaked, or forfeit and get something else to eat. Choosing to wait, my friend and I were soaked from top to bottom wearing a shirt and shorts. My wallet and phone made it through, but everything else was miserable. We were shivering, my shirt had shrunk, and my socks were mushy. I got into the store taking in the warm, sausage ladened air and thought, “this better be worth it.”
The rain doesn’t have emotions, doesn’t care whether its going to rain hard or lightly. We have no way of bending the rain or nature to our will. And inevitably, the rain passes, and we are left with this faint odor. Scientists call it petrichor; I like to call it hope.
At a former job, I was faced with a dilemma on a project I was leading; I didn’t know what I was doing. I felt like an imposter and didn’t feel I belonged with the other engineers. Psychologists coincidentally call it imposter syndrome, and it affected my work performance. I knew what the end product was supposed to look like, but after many failed starts, I was losing hope I could finish this project. Instead of asking for help, I mocked a plan and tried to go with that. By the end of the week, my boss came up to me to see what kind of progress I was making. I told her everything was going well when really, I had a hard time conceiving a solution. I talked her away by telling her I was working on process A, B, and C, but really I had no idea what I was doing. The excuses I made felt like plausible deniability if it came up in my performance review.
Inevitably, the project fell apart. My inability to ask for help cost the company a business deal and bonus upwards of thousands of dollars. Looking in hindsight, I was afraid and didn’t want to appear inferior to my supervisors or engineering peers. I wanted to blame the company. I wanted to blame the other engineers. But in the end, I could only blame myself; I was unable to expose my ignorance.
At some point, we may lie to ourselves and think we already know everything. In my early twenties, I was very arrogant and had a hard time letting others teach me anything new. When someone took the time to explain something to me, I would only grasp about 10% of it and nodded my head in agreement, pretending to absorb everything they just said like a sponge. When someone asked me if I knew about something I didn’t know, I would say, “Yeah, I know what that is” so I wouldn’t be seen as a fool. But I was a fool. I practiced appearing smart and I missed out of great learning opportunities.
Possibly from old wise tales, common sense, or some other form of “modern thinking,” men are supposed to just know how to do something. If you talk to my dad, he will proudly wear this ignorant-free badge with honor. He hated it when others didn’t know what he was talking about and would yell at you if you spoke up that you had no clue what he was talking about. Growing up, I remember he yelled at me when I couldn’t tie my shoes after showing me for the third or fourth time. An accumulation of those experiences led me to stop asking questions, nod, and affirm I knew things I didn’t know. This behavior spilled over to my interaction with friends and schoolmates. One of my best friend in elementary school recalls back in the first grade asking if I knew what a condom was. Having absolutely no idea, I told her I thought it was an animal. Honestly, I don’t remember saying those words, but my friend won’t forget because she found it to be the most ridiculous thing she had ever heard.
Of course, that’s not to say the feeling of linking shame and ignorance is solely for males. It’s a common feeling amongst everyone, man and women and people not on the binary spectrum of gender. There are those like me who were shamed into thinking ignorance was bad. Then there are those like my father who would get angry if someone exposed their ignorance. But what can we do if we find ourselves in this predicament?
During this past summer at Dev Bootcamp, I practiced exposing my ignorance. Being a beginner in Computer Science, I had to figure out the things I didn’t know, and one of the best ways to do that was to ask stupid questions to experts. We had plenty of teachers who we could approach and ask these stupid questions. Slowly, I built a muscle on asking stupid questions, and I learned better questions can come out of those stupid questions. Once I got over the hump of looking like a fool, I finally felt I had permission to be ignorant. I showed myself I could understand something a lot better with these interactions rather than figuring it out by myself.
As a family therapist I was taught to throw off the notion that I had expert knowledge about other peoples’ lives. To approach people with a “not knowing” stance. This is a hard pill to swallow, whether you’re a newbie therapist or newbie programmer. Your instincts tell you to hide your ignorance, to feign expert knowledge, but this only stunts your growth and inhibits the work you are trying to accomplish. Taking this lesson with me from one career into another has served me well. I’ve actually grown attached to feeling ignorant on a daily basis, it lets me know I’m in the right place. I’m growing.
Dave Hoover, co-founder of Dev Bootcamp
Indeed, we cower from ignorance because it makes us feel inferior and uncomfortable. But let us suppose you try this out. What’s the worse that could happen? Someone else thinks you’re a fool. Or that same person might take the time to teach you something. And if they do, you need to really listen. Once they’re done talking, you need to repeat what you heard to find holes in your comprehension. You may annoy some people along the way, but working off of assumptions of what you heard produces shoddy work.
When I was talking to my dad a few months ago, my dad asked if I knew about this specific type of clamp. Instead of telling him I knew what he was talking about, I said, “I don’t know, can you explain that to me?”. He was frustrated at first, and then in a pissed manner explained it to me. I felt a bit of victory and pride when I said that to him.
Sometimes we are blind to our ignorance. But as Dave Hoover says above, take that “not-knowing” stance and you will find holes in your knowledge. Make that a daily practice. It prepares you to ask for help when you need it the most. Join me on this journey, because chances are, you may also have no clue what you’re doing.
I really miss having a weekly post where I consolidate the week’s Internet findings. This is, perhaps, another way for me to get back into things now that I do a lot more writing.
We’ll start with different British accents, something I really adore and try to emulate. I really like the video because Siobhan Thompson tries to explain the accents with famous people.
This Ask Metafilter Thread has a few gems when one user asks how to get really good at something.
Another year, another DJ Earworm annual mashup. They seem to be coming out earlier and earlier.
10 Hairstyles and make-up in 1 minute from the past century.
When I pick up a new piece of music, I break it down into sizable chunks. What kind of structure does it have and can I break it down into something simple like an ‘ABACA’ pattern? If it does, I would learn that ‘A’ part first. Are there complicated rhythms or strange fingerings? Break it down even further. I only start playing when the piece is in manageable chunks.
Do I feel satisfied I can play this chunk? Yes? Then I would move on to the next chunk. After learning a few chunks, I would combine these chunks and try to merge them together in one take. The take will probably be terrible, so I go back and work on the areas I have the most trouble with. This is the process of jumping in between low and high level of learning something new. I can not play the composition well enough until I have dived deep in this form of practice.
At first glance, I see the composition as a whole and I think I could never play this piece. I’m usually at a high level of discomfort. “The wall is too high to climb,” I think. But when I give a second glance, I start thinking strategy. How could I break it down to manageable components. When I’m through, I’m at a lower level of discomfort and have many small challenges that’s a lot more manageable. The hours of practice don’t matter. You have practiced enough when you feel very comfortable with the piece.
I’ve been told many times in the past to get out of your comfort zone. But when I apply this advice, I wonder, how far out of your comfort zone should you go? I say, go as far as you can before you feel that feeling you want to quit. This is part of a bigger concept called flow, developed by Mihaly Csikszentmihalyi, a professor of psychology at Claremont College.[1] Flow is the state of being fully immersed and involved when one performs at an activity. It’s a balancing point and you will inevitably feel it when you are so involved with the activity, you lose track of the time. I attempt to strike that right balance by taking an educated guess on my complexity threshold. More likely than not, I will estimate incorrectly, and that’s when I will adjust myself.
Here’s a fun example of how you can follow this pattern with a trivial activity. This past Wednesday night, I spent 30 minutes solving logic puzzles online. Once I completed the logic puzzle, the page would redirect and show a summary of my results. This includes graph showing a normal distribution graph of complexity of the puzzle and the time to complete it. There was a star to indicate where you compare to other logic puzzlers. During my first puzzle, it took me over 5 minutes to solve the puzzle. My star was in the right tail end of the percentile on the graph. By the end of the 30 minutes, my star was on the middle, meaning around the 50 percentile, i.e. average. I proved to myself I can get better at solving logic puzzles. If I go back and do more puzzles, I would move up the difficulty to medium, but I know I’m doomed to be on the tail end of the medium puzzles when I first begin.
Another case: this letter. One of my biggest faults as a writer is my inability to edit what I’ve written. After typing my stream of consciousness, I think the first draft must be the best draft. However, the harsh reality is I don’t want to read my own writing because I’m afraid that it’s all shit. Hell, I will admit it now. The first draft I wrote for this letter was a piece of shit. It’s as Anne Lamott says in her book, “Bird by Bird”. “All good writers write [shitty first drafts]. This is how they end up with good second drafts and terrific third drafts.” The second reading through my letter, I started to notice grammatical, sentence structure and diction mistakes. The third read through I noticed the problems of how the letter flowed.
I’ve been writing for myself over three years non-stop. I have a daily deadline to write in my journal, and I haven’t missed a day since March 13th, 2011.[2] It’s all been stream of conscious writing though, so there’s not much afterthought in what I write. In an interview with Current a few years ago, Ira Glass talks about beginners and the phase of crap. When your starting out in a creative profession, nearly everything you make is awful. The distinguishing factor you have going for you is that you know you have good tastes. I’m in that awful phase with my writing. The big difference between when I started writing and today is I’m finally sharing my work and getting feedback on what to improve. By applying the feedback, I can discard what makes a piece a failure and focus on the elements that make great writing. If you really want to learn from mistakes, Jason Fried of Basecamp (formerly 37Signals) writes what failure really teaches us is what not to do while success teaches us what to do. I’m striving to reach a point where my writing is more than just crap, and that it adds meaning and value to my readers.
The feeling of discomfort pairs well with the feeling of flourishing. And the opposite seems to be true; the feeling of comfort pairs well with the feeling of being stagnant. One of the ways to combat the plateau phase is to embrace discomfort. In “Infinite Jest”, David Foster Wallace describes this type of activity for a complacent type playing tennis.
Then [there’s] maybe the worst type, because it can cunningly masquerade as patience and humble frustration. You’ve got the Complacent type, who improves radically until he hits a plateau, and is content with the radical improvement he’s made to get to the plateau, and doesn’t mind staying at the plateau because it’s comfortable and familiar, and he doesn’t worry about getting off it, and pretty soon you find he’s designed a whole game around compensating for the weaknesses and chinks in the armor the given plateau represents in his game, still—his whole game is based on this plateau now.
And little by little, guys he used to beat start beating him, locating the chinks of the plateau, and his rank starts to slide, but he’ll say he doesn’t care, he says he’s in it for the love of the game, and he always smiles but there gets to be something sort of tight and hangdog about his smile, and he always smiles and is real nice to everybody and real good to have around but he keeps staying where he is while other guys hop plateaux, and he gets beat more and more, but he’s content.
— David Foster Wallace, Infinite Jest
Although I am saving the plateau phase for another letter, I wanted to touch on it briefly. David Foster Wallace understands the comfortable feeling and how it can stall their growth. Instead of trying to focus on how to better themselves, they may lose their matches and don’t let failures teach them something. The person has a good attitude about losing and doesn’t pass judgment, but he or she has no vision to desire a better outcome[3] Take it from chess world champion Emmanuel Lasker. “A bad plan is better than no plan at all.”
To conclude, I want to leave you with questions to ponder about. Do you recognize this discomfort in your life? Are you passing non-judgment to the feedback you get? How can you improve your current skills?
Footnotes
[1] His Ted Talk is spectacular. His book is a reinforcement of his ideas with more examples and clarity on the general concepts that flow includes. I wouldn’t recommend it cover to cover, more of a book to skim and find sections to hone in on.
[2] White lie. I have written entries the day after I was supposed to. Also, when I’m traveling overseas, I’ll be too confused by the timezone and may crap out on what day it is exactly.
For the past few years, I have often neglected people close to me in the pursuit of my own endeavors. For example, my family rarely gets to see or hear from me, maybe once a month. It takes the occasional gatherings, such as this past Thanksgiving holiday, to really spend some quality time with them. I know I should make an effort to be around them often, or at least call, but I’ll make up some excuse or forget to do it entirely. I’m not a thoughtless person; I think of it in hindsight, but I am at fault. You don’t even want to hear about how I’ve neglected friends.
This last year, out of practicality, necessity, and taking a really hard look at myself, I made a few changes that has had a tremendous impact. One of these changes was to spend meaningful time with friends, even if its just for an hour. A few years back, there was this segment from The Daily Show about true friendship versus Myspace friends. The professor interviewed made a good point there was not enough time to keep up with 9000 online friends. Knowing there’s a finite amount of time, instead of spending a mindless weekend playing video games or watching the same Youtube clip over again, I chose to cut that out and try to schedule time to spend with those who have touched me in some significant way.
Note: the video may take a minute to load
It wasn’t easy to start. There was an internal struggle undermining my efforts, a resistance if you may. This resistance questioned all of my actions. “Do you think they will even answer you? You’ve neglected them for so long.” That resistance subsided the more people I reached out to when I got replies back. Some other factors were scheduling issues and lack of contact information. But as I slowly trudged along, calling up friends that I cared about, I started to realize this was a possible endeavor, even if the circumstances to meet up are difficult.
I owe a lot of thanks to my friends and family who put up with my silence. When I started talking to my friends about reaching out to people close to them, I was surprised at how many of them said the same thing. “I suck at reaching out to people.” Usually, I would get some follow-up. “How do you do it?” Honestly, I have been struggling with how to answer that question. Not practicing the skill of reaching out for so long, I had to re-learn some things that we all think are common sense. Here’s some tips though.
Work on their schedule. When you make it easier on them, they don’t have to put as much effort. If you want, go the extra step and make it close to them as well. The more you cater to their needs, the more they just can’t say no. Of course, I say this with a bit of precaution. Don’t over-do yourself with a relationship that takes but never gives back.
It’s not all about you. I think the number one thing turn-off is someone’s lack of empathy. The act of listening is as important if not more than the act of talking. When we feel listened to, we feel more appreciated.
I’ve learned that people will forget what you said, people will forget what you did, but people will never forget how you made them feel.
Maya Angelou
Short messages do not constitute a genuine connection. Sherry Turkle, teacher at MIT, remarked at her Ted Talk that all those little tweet-sized messages do not amount to one real conversation. Texting back and forth may be okay for some quick Q&A, but it does not substitute for real conversations and connections. Online dating is nothing but messaging back and forth until that first date. It’s only then when you start to see if there’s real connection.
Don’t forget to thank them. If you really value their time and if you really enjoy hanging out with them, don’t forget to thank them.
Don’t put off following up. After the initial meet-up, be the better person and follow-up. I don’t think I ever had this right growing up. My family never made thank-you letters for gifts they would receive. I would receive thank you letters and I felt like an asshole because it was one-sided, like I was not gratuitous in this exchange. I was the taker in this relationship. Of course, I did say thank you when I received presents, but the letters meant something else. This person took the extra step to really say thank you and somehow, that means more than simply saying thank you. I took that feeling and I started my annual Christmas Card tradition two years ago, and I haven’t looked back.
Last week, I attended TedxSanJoseStateUniversity and was really moved by Chi-Wen Chang’s talk. He was inspirational because for all of his short-comings, he was able to still add value to other’s lives, as a father, teacher, and phenomenal speaker (he sang at the end of his talk and it was very endearing). He said for over a decade, he would call up and sing happy birthday to people he kept in touch with. My god, the effort. Taking that advice in and seeing what I’m doing, I know I can do more, and I strive to try to also add value to the people I care about. Saying thanks is one of the first steps, and keeping in touch are the next steps.
Chi-Wen Chang Tedx Talk
Chi-Wen Chang, shown above at the Tedx event at San Jose State University.
Don’t be so hung up on the past. At this present moment, do you find yourself asking if you should’ve done something else, or could’ve been making yourself more productive, or you would’ve done that nagging task if you just reminded yourself at the time? Please stop thinking. Don’t over-stress yourself on the banalities of those tiny decisions because they don’t make a difference. Instead, close your eyes and think of something blank. Our past mistakes aren’t something that can be over-written, edited with a few clicks on your profile page. They already happened, and you can’t reverse time and fix those mistakes. What you can do is think of what you can do now and then do it. There’s nothing better than knowing you can make a decision now that will impact the future.
Of course, some might call me impossible. Let me give you a scenario. You’re driving to work and there’s something you’ve forgotten to do before you left. You think, “Damn, I should’ve done that before I left.” Stop, breathe, and listen to your body. Are you tense? Are neurons firing off giving you a fight or flight experience? That may be indication you are stressing yourself for no good reason. The fact is, you have no control of those actions anymore. They have already happened and you can’t do anything about it. What can you do about it now? Could you call your significant other to deal with that task? Do you have to wait and do it after work? Alternatives pop up, reasonable ones with some level of action you can take right now. If you have followed this process successfully, you may have saved minutes of your time worrying with a proper solution.
This process can be learned today. However, let me give you a caveat and say it may take some practice, but I believe if you can follow a methodology, you can feel better about yourself at the end of the day. Stress accumulates to something when gone unnoticed. I find friends who go through similar situations all of the time, and it is a signal to tell them to stop worrying; life will continue.
At my last coding club, I was asked by one of the members that I should write about my experience on going to hackathons. It peaked my interests that there are those out there who have never been to one, so here’s some of my limited experience attending them. I joined my first hackathon two months ago and haven’t really thought hard about what is it that I love about them. They’re fun! You get to work with other people, sometimes people you don’t know. You will get to bond with teammates and work on something that interests you all. You get to work with people of different working styles. You get to hack away at something exciting, and perhaps new. The winners aren’t the ones to gain something from the hackathons. It’s also a great networking event.
But let’s go back a moment and ask, what are hackathons? They are events where an individual or team will compete against others to develop a solution to some problem in a short amount of time, whether its what can we do with this new API to what can you hack that is science related? I have participated in three hackathons and will be attending more in the near future. There aren’t necessarily prizes at the end, but someone is a winner.
You can find them through looking them up online (Google your local area and hackathons). If you don’t have one in your area, that might be an opportunity to start one in your area! Living in Silicon Valley, they are ubiquitous. If you do find one, contact the administrators of the event and tell them about yourself and your interest in participating. They are more than helpful to get you started, especially if you don’t have any teammates. If you know others who are going, or if there’s an open forum for the event, talk to others and see if you can join a group. It’s not impolite to contact organizers or participants. In fact, it should be required you do so before you go to the hackathon so you can know more about the event!
I’ve only been to three, so I consider myself a newbie. Also, I’m a relatively new developer, so I always feel inadequate going to these events. But here’s the thing. Everyone wants to learn, and most know the participants are on different levels, so participants and organizers will try and accommodate you. I felt very privileged my first hackathon was at Science Hack Day in San Francisco because the organizers were the best. I walked around aimlessly trying to find a project to join and I asked one of the volunteer staff there to help me, so we walked around and helped me break the ice with groups of people working on projects. I learned that I wanted to be a part of every project, but in the end chose to help out on a groundwater project. Although I didn’t use any of my developer skills, I was able to help out with my limited electronics experience.
SETI Institute
SETI Institute
The latest hackathon I went to was at the SETI Institute in Mountain View and we got to play around with asteroid data. I met some amazing astrophysicist who graciously explained to me what near-earth asteroids are, why it’s difficult to simulate all of them to tell us when the next biggest asteroid will hit us, and why the public should be more aware of space and help fund our future. Hackathons are better than conferences, in my opinion, because you’re an active participant rather than a passive listener. It’s something I don’t get with TED Talks; you watch them, you feel enlightened, but you forget about it easily. With hackathons, it’s less talking and more working because you’re getting ready for a live demo at the end.
Science Hack Day 2014 at Github
Science Hack Day SF 2014 @ Github HQ
Possibly the fun part is walking around and looking at solutions to problems you may have never considered, and it may be an opener to work with those people in the future. I absolutely love the Science Hack Day demos because they were interactive or had some cool component. And I love Science and love learning about things I typically never get to encounter at work. If anything, I’ve made friends at these events, and I’ll continue to go to them.
Yes, coffee does solve everything. Even uncomfortable anxiety
Note: I originally intended to release this back in September, but I put it off until now. The advice is not outdated, but events in this story are.
Instead of pounding in the ever-so cliche phrase, “be comfortable with being uncomfortable,” it’s better to describe my most recent experience with this. Three months ago, I was packing up for a road trip from San Francisco to Chicago. As in previous trips, it dawns on me how much of my life can be packed into a luggage bag. I was to spend a week driving, stay in Chicago for 9 weeks, road trip it back to San Francisco Bay Area, and fly to Korea for another week. As my car was packed, I realized I was really uncomfortable leaving everything I had built up at home; friends and family that I wouldn’t see for a long time. But I told myself to “suck it up cupcake” and go on this adventure.
I drove solo through the mid-west, and it could have been incredibly boring, but it wasn’t with my countless hours of podcasts and audiobooks. When I got to Chicago, I found out I was scammed an apartment. I spend a night panicking, being thrown out of my comfort zone and feeling very unsafe. There’s a difference between being out of your comfort zone while being in a safe place versus an unsafe place.
There are four places you can usually be as your doing some activity:
Safe & Comfort Square
A quick diagram I created to explore this point.
As I was road tripping across the west, I had all of the signs tell me I was going to have no apartment or living situation when I got to Chicago. I was putting myself in an unsafe place, but I was still comfortable. However, after realizing this, I quickly moved to an uncomfortable zone and felt very unsafe. When I settled the matter the following week and found a different place to live, I was finally in a comfortable zone and felt very safe.
Dev Bootcamp, the reason I went to Chicago in the first place, tries to push you in the uncomfortable zone while making it a safe environment. I felt very safe around my cohort peers because I was able to expose my ignorance and sound like a curious kid again. At the same time, I was pushing myself away from the things I already knew, or sticking with being in a comfortable spot. At the same time, I wasn’t over-whelming myself with the amount I was learning, described as the unsafe zone and being uncomfortable. This is commonly drawn as three concentric circles.
I borrowed this picture from Seth Sandler’s blog post which shows where the learning zone is. I love this description because I use it in all other activities non-work related as well, like learning how to improve my communication skills. Given your environment, figure out how to find the sweet learning zone. It’s different for every person, so you’re going to have to experiment. Remember to enjoy this process, because if you find it useful, you’ll want to apply it everywhere too.
The Levenshtein Distance problem, also known as the edit distance problem, is to find the lowest cost path to turn one string to another string. It is commonly used in spell checking, Google search results for ‘did you mean…’, and DNA sequencing (Bioinformatics).
An easy example is if you misspelled “word” for “wird”, there would need to be one replacement to get from “wird” to “word” (change the letter “i” to “o”). There is one algorithm that answers this problem efficiently, as we now of right now. This algorithm compares one letter of the first string to all of the characters to the other strings and gives it a ranking or a score. There are three ways you can modify a character, by inserting another character, deleting, or replacing that character. Each of these modifications cost one value.
Typically, you will see this as a matrix, as shown above. The first row and first column show the length of the strings. The rest of the matrix is filled out following that you do a nested for loop, taking one letter at a time for the first string and go through the rest of the letters in the second string. Here’s a quick look with Ruby:
(1..second.length).each do |i| (1..first.length).each do |j| # Do your logic here endend
We traverse this matrix starting at [1][1] (one square diagonal of the top left square), and move to our right until we get to the end of the matrix. Then we continue to the next row and go back to 1 (matrix [2][1]). We place a conditional in our code. If the letters we are comparing are the same, then there is no cost penalty and we take the same value as the diagonal on the square’s top left. However, if it is different, we take the minimum cost to each of our modification choices.
Insertion: When we insert a letter in our first string, that shifts our word column, so we take the same value as to the square to its top, plus 1 for an additional modification cost.
Deletion: Same as insertion, but we take the value of the square to its left
Replace: We take the value of the upper left to the square and add 1 to it.
The result is at the bottom right corner, which will tell you the minimum cost of changing one string to another. If the score threshold is low enough, Google will ask you, “did you mean…” if the search ran through the algorithm and could match a more common search term.
A side note
My coding club looked at this algorithm with no prior knowledge of this problem and tried to understand it. Now that I’ve taken the time to review this, I have a much deeper understanding of this now.
Resources
Levenshtein distance implementation in different programming languages
MIT course on Algorithms: Levenshtein distance problem explained with dynamic programming
I’ve reached the end of my DBC experience and am currently going through career week right now. I’m glad, and yet sad, my nine week experience here in Chicago DBC is over.
It’s still a bit too early to see the outcome of this program on me, which may take months, and even past my first job. But here are some takeaways I learned about myself while doing this program.
I really enjoy leading a team
There’s always lots to learn on the “soft skills”
Taking feedback isn’t easy work, but that doesn’t mean you should ignore it. Embrace it and act rationally.
It’s perfectly fine to cry in a room of adults, even if you’re the only one doing it.
As adults, we forget all too often that we really try hard to hide embarrassment in front of others. Stop worrying about that. If they talk about you, what’s the worst that could happen?
I’m by far not the first person to blog about my experiences at DBC, and I can not do it justice in one blog posts. As I learn more about myself and what has really been the most telling things that I should have been working on all along, I’ll share it.
Hi! This is week 2 of my harrowing escape to bootcamp at Dev Bootcamp (DBC). It’s around this time where my cohort and I are finding our standing after mock assessments. The hardest part is to really catch up to the material because so much is thrown at you everyday. However, that’s also a blessing in disguise because this is training my brain for more difficult challenges ahead. Because of the enormity of work over the past two weeks, I’ll cut it short here. Hope everyone’s had a happy fourth of July.
After a tiring day, I can find humor with that man giving a hand to the bird while Cinnamon Toast Crunch sprinkles from above
This week completes my first week at Dev Bootcamp. It’s been a whirlwind of emotions, from the very beginning on Monday morning to my very frustrated work solo yesterday. Here are some takeaways that I had.
Pair programming is a lot better in person than remotely
When you’re frustrated with what you’re doing while your pair gets it, you have yourself a teacher
Vice versa also works because you become the teacher when you get it and your pair doesn’t
Remember to pseudocode: too much effort was wasted not planning how the code will look like because you can waste time with an approach in your head that actually won’t work
The energy at the place is just exhilarating. Literally, I think I’ve hugged more people in this past week than in any other time frame of my life. At the end of the engineering empathy sessions and sharing what’s going on in your life in a comfort circle has brought me to confront my emotions.
That frustration will pass, even though that inner voice mother fucker can’t shut up when you’re in it
The science behind cramming takes a look at how memory works. I’ve talked long and hard about this topic before, but I never really made this explanation easy. I still will probably fail, but not as hard, as explaining how we learn.
Memory
You can break down the process of sensory input and memory in this linear fashion: sensory input -> sensory memory -> short-term memory -> long-term memory. The image below describes in verbs what’s going on. The last box, retrieval, talks about how we bring back up a memory.
With encoding, we’re looking at the things that we’ve decided to turn into a memory. This has a high importance because this will determine if we retain information or not. If we don’t encode it correctly, we will screw our efforts in learning something. This encoding method is constrained by working memory, which is 7 +/- 2 chunks. This means in our attention span, we’re only going to be juggling only this many chunks at a time. We can think of our attention span as RAM. Chunks here does not mean 7 characters and can take many forms that we can manipulate. For example, one chunk can be a phone number, it can be a word or a phrase, it can be a pneumonic.
With working memory as our constraint, we consider this a drawback from learning faster. This means we’re not going to process more information without properly going through the rest of the memory process beforehand. However, methodology is important here about how to space each session of this working memory. For example, each chunk of information can be mixed and combined with each other using association and serial position effects. Association with existing knowledge in your long term memory could save you time in remembering something, which is important when learning concepts and ideas, especially something that begins abstract. For example, remembering someone’s name is difficult because you haven’t placed it further that your sensory memory. A name is difficult to recall after the first meeting because it’s an abstract construct in our mind. If you try to associate it with another friend who has the same name, it will be easier since that name is already encoded in your mind. You don’t have to necessarily associate it with another person either; it can be an inanimate object or a koan. Serial position effects will allow you to group things in the order you received the information. For example, you’ll have a better time remember the items of a list in the first and last positions than the middle. If the list items are closely related to each other in the beginning and the end, you’ll have an easier time associating these words and merging chunks together. There’s other effects you can try to pull with lists as well, like the Von Restorff Effect in which you place a unique signifier in the middle of the list, like a curse word or something that doesn’t sound right.
There’s a time constraint with encoding, which is about a minute, before you forget this information. That’s why proper spacing in terms of attention span and new information is critical. The best methods out there for this is the Anki method, which uses this data of how often we’ll forget something and make you recall it afterwards. This is best for things you can put on flash cards because you can recall them anytime after using a timer. Many applications are built around this method. My personal favorite is Memrise on Android that really helps with language learning vocabulary. Other ways of approaching the time constraint is utilizing breaks, which is why coding marathons are not as effective as someone taking breaks in between coding sessions because of fatigue and attention span. What really utilizes this well is the Pomodoro Technique, which introduces breaks in your sessions of work properly.
Not everything is a flash card though. Sometimes the abstract needs remembering, and flip side answers in flash cards just won’t do. This is when you take different approaches, like R-mode first followed by a switch to L-mode activity. I mention R-mode here, but this does not mean right brain. If you split the brain in two different processes, there’s L-mode and R-mode and has been given other names by other scientists in different fields. For example, Daniel Kahneman thinks these as system 1 and system 2. I won’t go in heavy discussion about this because there’s a letter I wrote over a year ago explaining this in full detail. Now that we have that down, this activity that you do pairing each process with an activity is important. One activity is something I’m currently doing with you, which is recalling all of this information and trying to teach it to you. Other ways include doing the operations if your learning something that involves motor skills (e.g. just climbing before you get climbing lessons from an instructor), using metaphors to describe what you learned (really neat way of pairing two things that don’t seem to mesh well, pair programming, and a general exposure to a foreign language spoken to you in a dark room (see Lozanov Seance).
The conditions in which we learn is also critical. Your well-being can influence the efficiency on how you learn. This is heavily tied with the amount of rest you receive each night (duration and the number of REM cycles are really important here) and physical and emotional fatigue.
Then we arrive at storage. Our brain is not an efficient storage system, so we’ll issue lags in memory for certain things we think are easy to recall, like birthdates, names, that title of the song you heard earlier. Your R-mode side of your brain will run this tasks with your unconscious riffling through each thing until it finds what it’s looking for. This is the effect experienced when your in the shower and you finally figured out the name of that song you heard.
One way memory athletes have approached this issue is by the Method of Loci, also known as memory palaces. This is where you take a familiar room or space in your mind and fill it with things to remember by using unique signifying objects. This technique is really powerful and can help you remember a deck of cards (which is correlated with counting cards in a casino) and in general skill acquisition operations. You have to go back a step and re-encode your memories, but having this visual memory palace could remain as one chunk and you’ll be able to recall things a lot easier in a class (using the programming analogy here).
Lastly is retrieval. I’ve talked extensively about skill acquisition, heuristics, and snap judgments before. As aforementioned, there are two ways of approaching retrieval, which is the slow process and fast process. The fast process are heuristics, or snap judgments. The slow process takes longer and you start to stretch your mind looking for more credible answers. Fast processes are stimulated by the external inputs, which can lead to some nasty outcomes (Read: Blink by Malcolm Gladwell). What’s important here is that if you slow down that reactive side of thinking, you’ll be able to think more clearly about certain decision points in the learning curve a lot better. And yes, go back to the letter about learning curves if you want to hear me talk more about that as well.
So to the question at the beginning, how much can you cram in one day? This depends on your method of cramming. For myself, I’m working on taking breaks and using other methods to properly encode it in my brain.
From studying philosophy last year, I thought this may actually be important, since it helps create a foundation of who I am and what I do. I previously thought that philosophy majors were different, and belonged to the Starbucks barista clan who may eventually become academics, or something. I couldn’t imagine there would be some practical work in this field; I thought philosophers historically would stand around in a long robe pondering questions. This image, for example, doesn’t help me visualize what they do besides loft around and think.
The School of Athens by Raphael
The School of Athens by Raphael, Courtesy of Wikicomons
This is “The School of Athens” fresco somewhere in Rome (or Vatican City). If you look at the center two people, you already know who they are. On the left is Plato, and the right is Aristotle. Because they just look like street bums having a discussion in their robes, I just assume they’re “philosophizing.” This doesn’t paint a good picture of what philosophy is to me.
It wasn’t until I started to look into this BBC series by Alain de Botton called “Philosophy: A Guide to Happiness.” If you want to check it out, the whole series is on youtube, and this link will direct you to episode one. I thought of this as philosophy that’s practical because we can relate these concepts back in our lives and realize it’s all just a game of self-help over the last two millennium. Well, that’s an over-simplification, as well as my explanation of why I’m so interested in philosophy, but these simpler wordage will have to suffice.
Now you must be wondering why I took an interest in this after I took a philosophy class at Cal Poly. Well, that’s because the teacher was dry and I thought Socrates was crazy after reading the Republic (oh come on, philosopher kings?). As well as you know, I dove deep in this realm for two weeks and came to a much better understanding of myself. After finishing this BBC series, as well as doing a “Great Courses” course on the history of philosophy, I figured I’d take the best parts of what I’ve learned and integrate it into my own philosophy I can follow. It’s scattered, like when Conner (Chad) came up with his own religion during our Freshman year.
I’ll keep it short: The way I want to answer my own question is by asking myself “How do I want to live?” or “What is required for me to have a good life? I abide my my own rules, which is just stolen or “well-adapted” from our great thinkers. I value in my own personal philosophy the following things: critical thought, kindness and care to others, respect, finding meaningful purpose in what I do, as well as what I say, keeping myself balanced, and to expand my knowledge. These elements should allow me to answer some of those prickly problems addressed by many philosophers: knowledge, conduct and governance. In the end, it’s about what is a good life, and many philosophers had so many ways of answering this. And I think from what I said before, and to continue doing those things in the future, I have, and will continue to have, a good life.
Every so often, I read too many books in a short amount of time. I thought it would be beneficial for folks to hear me out and see what they think of the books I’ve read.
The Cuckoo’s Calling, by Robert Galbraith
This is the latest novel by J.K. Rowling under the pseudonym Robert Galbraith. This is a fiction crime novel set in modern day London following private detective Comoran Strike. The novel is about the murder of a young, rich model who dies in the middle of a winter night. At first, the press went head over heels that it was a suicide, but the private detective is brought to the case when the brother of the murder victim wants it re-investigated because he thinks it is a murder. This is supposed to be the first book in a series, and unlike Rowling’s Harry Potter series, is a lot more adult. There’s crime, violence, sex, and a whole lot more cussing than you’ll hear from one of the students at Hogwarts. There’s also themes of how the rich operate and enjoy their lives, and Rowling really shows how they are disgusting in their own right. Worth an airplane read, though it’s nothing groundbreaking. The book kept me in my seat, making me think who the killer was.
The Willpower Instinct by Kelly McGonigal
This is my self-help book of the quarter. It’s about how our willpower works and it’s a practical guide in changing habits and really utilizing willpower without being drained. It’s highly interesting and brings on a ten-week plan. It’s been used by the book’s author, Kelly McGonigal, and the class she teaches undergrads and others at Stanford. I’m going to review it later and see if I can actually change one of my habits through this program. I’ve tried some of her suggestions before, but now I know more of the science behind it. If you want a primer to this, I recommend her talk @Google.
Foodist: Using Real Food and Real Science to Lose Weight Without Dieting by Darya Pino Rose
I don’t need to diet. But I do enjoy reading about a good, healthy living style. Some deviations from other diet books is that this book doesn’t actually talk about which diet to take. Instead, it uses science to back itself up that we should all have a good food foundation because diets tend to be shortcoming success, but relapse rates are quite high. Instead, this book raves about eating healthy from the beginning of your food adventure through more vegetables and try to gain the habit of cooking for yourself or making better food choices. You’ve probably seen me reading this book before, but now I’ve actually finished the darn thing. I didn’t learn too much except the author calls this new diet, which isn’t a diet, healthstyle. I think I like this neologism.
Kitchen Confidential by Anthony Bourdain
If you enjoy eating at restaurants, don’t read this book before you eat at one. It may make you feel bad. But this book is really important to my understanding of the fame around Anthony Bourdain, particularly why he’s so goddamn famous. The Food Network loved this book so much, they gave Bourdain his own show called “No Reservations” where he went around the word to eat at various locations. The reason he’s so famous now is that he gets the lifestyle everyone wants; he gets paid to eat and critique. Here’s the thing though, this book is before that era and describes his upbringing, his hardships in the restaurant gig, and he’s eventual success in that domain. It describes someone in their craft and love for their job and how they grow into that role, which was not innate but from shear brute force over years of being on the line. There’s another book I highly recommend called “Life, on the Line” by Grant Achatz who describes his time being a line cook as well. There’s this common thread where you work your ass off being in the position that you get to as head chef, and it’s horrifically difficult. But I want to adopt this drive and try and figure out how that can apply to my life. If it wasn’t for this period in my life, I probably wouldn’t be as fascinated at this. But I love someone who has their craft down and can still learn something, as when Bourdain describes his first time eating in Tokyo by the end of this book. A film I highly recommend about food craft is “Jiro Dream of Sushi.”
The Wonderful Wizard of Oz by L. Frank Baum
I’m surprised this book is over 100 years old. I’ll be honest. I had no reason to read this children’s novel except that Audible has it for quite a cheap, low price. And it was narrated by Anne Hathaway, actress of “The Princess Diaries,” “The Devil Wears Prada,” and “Brokeback Mountain.” It’s interesting to notice the little differences from the film, even though I don’t think I ever saw the film all the way to the end. Also, I don’t think I actually read the book before, but know the story pretty much by heart. It’s still a delightful read and it’s incredibly short, but long for a child. This actually brings up whether I should actually read Wicked about the Wicked witch of the west that is killed pretty early in this book. This also may be the first mention of munchkins. I may read “The Hobbit” next because Audible has daily deals. Or else I’ll just finished the fucking bible first. When I do finish the bible, I’ll definitely give you the low down and we can snap at all of those fundamentalists.
I’m finally on a new platform and have full control of my content on
Squarespace. Shortly, I’m going to register a new domain for this website and
have this be my new home. Those who have migrated from my Tumblr need not worry
because I will still update that with photos and random short-form items that I
see not fit for this blog. The reason for the switch is that I want to be able
to express thoughts, show weird experiments I’m doing, and keep a journal-like
blog where I can add pictures, links, videos with ease and not worry that I can
only add one of those per post via Tumblr. Also, I’m not concise enough to be
tweeting every post either. And I’ve tried Wordpress before and ran a
semi-popular podcasting reviewing website in the past, and though I did like
their system, I feel Squarespace is more robust and can actually do a lot more.
In the coming weeks, look out for updates. I’m going to start tweeting more
about this too to promote my website and my work. I’m also taking up photography
again to really showcase myself. So comment and tell me if I leave out anything,
like a “like” button on Facebook (which I’m not adding yet, but not completely
morally against), or a “pin it” button.
I leave you this quote on the shape of things to come.
“They may not remember what you said, but they’ll certainly remember how you made them feel.”
It’s a fine time to be young. Often we tell ourselves that the youth are wasting
their time doing nothing of use like playing video games or lounging around
watching Netflix. But that’s simply not the truth. The youth community is
thriving. They grow out of the product of their role models, adults. And when
you ask some parents what kind of cool things their children are doing, the best
answers come out when children find their own hobbies. What I have here are
strategies to help ease the youth into doing their own thing. It’s more of a
template of what you could do rather than what you should do. It’s a choose-
your-own adventure type advice that goes anywhere your interests lie.
I’m starting to ready Clay Shirky’s book, “Cognitive Surplus,” which delves into
how it’s not technology we should blame for our social problems, but rather how
we interact with and use the technology. During prohibition, it wasn’t the
alcohol that was the big issue, but rather our interaction with it. We, as
adults, take on the lazy youth issue as a problem with technology, such as the
Internet and television, that their mere presence is bad. But, from what we
have gathered before, that isn’t true at all.
And kids have it awesome these days. I wanted to pursue more things as an
adolescence. I self-taught myself a few things, but I lacked some guidance on
how to really go about learning something new. It would have helped to have an
adult talk to me about how they learned to do something, or at least how they
attempted to do something. Growing up, my dad knew all these things about home
and car repair, and I wanted to take that knowledge from him without asking how
to do any of those things. Of course, I did sit around and watch him at work,
but it wasn’t the same without his input. And as a result, I never knew why you
use certain joints for wood, what the carburetor does, and how to drive stick
(though in truth, my dad doesn’t want to be anywhere near a manual shift car
because he loves automatics, so there is no point in asking him).
My sister, reaching the peak of her teenage years asked me to share some of my
knowledge of how to go about doing things. I wrote a lengthy essay-formed
response to her explaining how I would go about doing projects. The point of
projects is you have to enjoy it and you don’t care where it leads. If those
requirements aren’t met, it probably wasn’t worth doing the project in the first
place. This idea of projects isn’t new to me, and it’s familiar with those who
have read Cal Newport’s book, “How To Be A High School Superstar.”
Here’s an excerpt of what I sent my sister.
Apprenticeships used to be the way of learning the essential skills of how to
be a master at any field. You’d be passed down to a mentor who can show you
these skills, for example blacksmithing, and how the art and craft of creating
a tool involves precision and hand-eye coordination. There’s the foundation
steps to creating any tool that is taught by these mentors before one
understands how any tool can be manufactured.
How does it apply to you? Well, first off, it’s the foundation steps in learning
anything. You start to realize your potential in learning a topic of your
choice, and if you fall out of interest with it, it doesn’t mean the end all be
all because hundreds if not thousands have also been though the struggle where
only a few make it. When searching to acquire skills to make you more
presentable for college recruiters, you must understand how hard it is to grasp
something as hard as whatever you want to attain. Also, college is a way to
further pursuits you have rather than to blindly follow what other are doing
because it’s the ‘hot’ thing to do. Really focus on what you like and know
there’s an uphill battle wherever that takes you.”
The email was directed towards her struggles to stand out from the crowd.
There’s an issue with getting into college as a teenager today, but that’s a
completely different topic that I may dwell on in the future.
Thanks for reading my rant. If you have any counter arguments, or any supportive
evidence, please comment below.
At first, I was a bit hesitant about this website because when I try to learn music theory by myself, there’s a lot of unnecessary for most practical musicians.
Their book of music theory for pop music is a great primer for many beginners and intermediate musicians.
It’s fairly easy to understand the ‘rules’ of how chord progressions work, in relation to pop music.
The downfall is the amount of content, for example it doesn’t go through 7th chords.
For under $15 in the iTunes, it isn’t enough for me, but it gives a lot of examples if you’re “pop-literate” because the examples are playable within the book (from my iPad).
I must say that the cool interface for hook theory’s music editor is actually quite intuitive after reading the quite tutorial.
It uses a relative scale, so creating accidentals or other notes other than the 7 (plus octaves above and below) aren’t possible for the melody.
But what’s cool is that you can create separate harmony and melody with their divided play area and export your final song into a midi file.
For being in Beta, it’s worth a check out.
They also have over 1,300 songs archived in this format, though most of the songs aren’t the complete songs, just so you are aware.
Instead of doing a book review this week, I thought of doing something different. I’ve watched way too many films over the last few years and have started writing down every movie I’ve watched since January 2010. Here’s a quick review that’s five words long for each movie I’ve watched back during the month of April 2012.
Most of my life has been driven on the idea that I’m right all of the time and that people who prove me wrong are just ignorant of my own view on why I’m right.
I can name endless positions on how I thought I was doing the right thing by being on one side of an issue and sticking with that stance.
One case was when I was a kid, and I accused my sister of stealing from me because she was caught red-handed on many accounts prior.
This time, she really wasn’t at fault, but because I convinced myself that her prior actions justify that she did it again didn’t do me so good when I tried to convince my parents she stole from me again.
My sister had concrete proof that I was wrong, and I should give up with the accusations because I lost this object on my own accord.
Being as stubborn as I was, I decided to find proof that my sister was wrong, so I snuck in her room and looked all over the place for this object.
I can’t say I was satisfied at all when I came up empty-handed.
Over a year ago, I watched a TED Talk by Kathyrn Schulz who talked about being wrong, and the psychological effects behind why we all convince ourselves we must be right.
She has written a book on the subject as well as an accompanying blog.
I became enthralled by this concept, and started actively noticing when this occurs and what I can do to change my behavior.
Firstly, I do what I’ve always done before, which is listen to others talk, especially my peers.
Patience is definitely a virtue, and in this case, I let my peers tell me what I’ve been saying or doing wrong with evidence (since I’m also a huge proponent of critical thought) and not interrupting.
Then I take that advice and really look into what I’ve done and see the mistake.
I take a note when I can of these mistakes (I write in a journal every day, so personal life note-taking has been a side hobby of mine).
I read this book by Daniel Kahneman called “Thinking, Fast and Slow” which delved into this topic even further.
The Ted Talk he gave about memory and experience gives you a primer for what I’m talking about.
Basically, many concepts in his book reaffirms why I do such things, as lie to myself that I’m right on a topic or a behavior.
My faster thinking side (not actually literal) takes over the thought process of that “right action” and goes with it instead of questioning it.
This makes perfect sense to me as I know there’s something lazy about questioning myself on these terms.
For that reason, I’ve been stopping myself with specific actions and asking myself why I must think the way I do when the opportunity comes to show how “right” I am.
I hope I’ve given you all some insight on the way I deconstruct my own personal dilemma about thinking.
I know it’s difficult to admit to yourself that you can be wrong, but we are all human beings, and I’m sure we can recognize when we make these mistakes and move on, and not ponder about why you must be right.
*I’m starting some on-again, off-again writing posts on my blog because I feel I want to express something.
They may vary in length, and the topics will be very random.
I really don’t care if anyone really likes them, I write for myself and it really helps me parse out my thought process.
Every year, I share my resolutions in order to help me keep myself on track. Sometimes, goals just aren’t refined enough to do, and sometimes goals are just too hard to do. Here they are, and let’s see which ones I’ve failed.
[Success] Spend at least one month using no credit cards or debit cards to pay for purchases, excluding online purchases. ATM withdrawals are fine.
Thanks to being in Munich where cash is the only type of transaction that I can only have, that helped.
[Failed] Keep track of every expense for a month, and can use Mint.com or Quicken, or other financial tracking program if desired.
This is still a good idea. I should still do it.
[Failed] List of books - Get it organized and make a queue of what to read next
What the bleep was I thinking with this one…
[Failed] Paleo diet for at least 30 consecutive days
I started reading into the paleo diet. It sounds great, but I don’t think I’m having that much gastro-inflammation with the current diet I have now.
[Quasi-success] Website redesigning + Create personal Website
Blog got redesigned. Personal website = not.
[Failed] $8.00 or less meals
What can I say. I was travelling and got guilty.
[Failed] At least 40 new books read
I almost did it. I got to 37 books. Lesson learned.
[Failed] Produce a webshow with at least six “pilot” episodes
I’m still going to do it. It has a premise now. I finished my other book, so I’ll start script writing soon.
[Failed] No High Fructose Corn Syrup for 2011
Before you know it, you are dipping french fries in ketchup, or use ketchup in some other ways. Gosh, restaurants do not use organic ketchup.
[Failed] Pass my EIT exam
I’m signed up for the next test in April. I missed the deadline in August.
[Failed] Cook at least one new recipe every week (Or an accumulation of over 50 new recipes), with documentation
I didn’t document them, but I did cook many different recipes. Probably not 50 new ones though.
I realized after a few years of this blog that I really made no formal introduction of myself, and for that, I give you a blog post dedicated to who I am.
Hello, my name is Jeremy Wong, and here are a list of things that I do:
I’m a college student by occupation right now. The future is looking in all directions though, especially in the direction of a Master’s or Ph.D.
Born and raised in California. Actually, still living in California in the lovely and sunny Central Coast.
Ran a daily show that really was not that great looking back: The Daily Jerm
Podcast Reviewer, now defunct. Got tons of traffic though, and still get annoying requests to review podcasts
Here are some upcoming projects I will be working on:
The Bible: RPG, a game that circles around the biblical story from Genesis to Revelations, and doesn’t skip a beat on every account of rape and pillaging (and will play out as a parody to the Good Book).
Writing a short webseries about the Happiest Place on Earth, and how it might not actually be that happy (hoping for dishing out six episodes of well produced laughter).
Welcome to Neuschwanstein Castle. This was Day 2 of my travels, and I had read my tour brochure at the last minute. I had meant to do another tour, but I saw a group of people that were going to Neuschwanstein Castle, and I decided, fuck it. I’m going.
Neuschwanstein Castle from a distance
So I take the regional train near the Alps on the German-Swiss border. Then I travel by bus to the bottom of the castle, and the castle is within view, shown in the first picture.
the gateinside the gate
Then, I climb up to the Castle, and I see a magnificent view of the lake, as well as the gate (first two pictures) And then, you can see the castle from many meters away from marienbrüke, or Mary’s Bridge, seen from the third picture.
view from the bridgethe bridge
On my way down, taking an alternate path, I saw these stones stacked that means something about balance. Also, it started raining as I got to the bottom of that mountain, so I immediately got shade, and the after picture was spectacular, shown in the last picture.
It’s been over three weeks since the last post, and now I can finally share some interesting photos of my first day of Munich (of many days I’ve been here). This is mainly of the city center region, Marienplatz, and surrounding area. A few hours after landing from Chicago to Munich, I immediately checked into the hostel, which would not have my room until after 4
pm. So what do you do in a foreign country with no sense of direction, and somewhat no purpose (I started summer school in four days, so I had time to fuck around)? You go on a tour, because I’m a tourist!
The Church Build by the Devil
So I get to the meeting place on my tour (which was Mary’s column, shown above), and I was off. I met some interesting travelers from all over the world, and saw some interesting architecture that was mainly rebuilt after the war because Munich wanted to keep some of its old buildings to have that rustic look. My tour guide, Adam, was from Australia and had a few cheezy, yet funny jokes to keep us entertained. Also, being a sponge of historical information, I just soaked everything he said. There was the church that built by the devil, the Opera House, Viktualienmarkt, the Hofbrauhaus (oldest beer hall in Munich), and much more. Also, we passed by a Michael Jackson tribute, which was almost a little bit too creepy.
The Opera House
All in all, I get a beer from the hostel, an Augustiner Hell, and drink it while I shower. Incidentally, the weather was really sunny all day up until nightfall, in which I hear lightning, followed by heavy rain. I pass out before 10
pm.
So check out my next post as I talk about Neuschwanstein!
The Michael Jackson TributeThe HofbrauhausThe Pole from Viktualienmarkt
At the dawn of the world, I take out my shovel
And dig and dig and dig,
Like the early pioneers would do
finding resources that the earth lain
And I continued throughout the entire day
finding my own resources in order to live through the night.
Oh how awful the night has become
With the crawlers and creepers infested over the twilight land
But alas, day is not their time
and I must collect as much as I can
Except for shoal
Unbearable, unspeakable shoal
Oh, why has the creators invent such a useless resource
Neither coal nor sand
It can not be crafted for other purposes
Your so close to being obsidian
I can’t even bear to carry one around
But that’s where I was wrong
I had not noticed said shoal
upon my inventory or belt
And there appeared only my sword, my axe, and tree bark
But twas the nightfall
Shoal was present, and I did the most respectable thing
I threw it out hastily
And it wobbled up and down
spinning around
Dancing upon the pixelated ground floor
Why have you forsaken me, ole shoal
“Out and away with you, I’ll tear you apart!”
My anger said
And I took the shoal with me to the depths of the mines
Where lava was to be found
And that’s not all I intended
I’ll find all of the shoal in the world
And burn them too!
That way I’ll never have to see one again
But it wasn’t easy;
the shoal had disappeared
The anger has flustered me to no ends that I made a huge mistake
I was in the wrong home
Well not even a home but an open cave
Open for the dark lurkers intending to do me harm
And I rushed out into the dark despair
Running as fast as I could to Hideout D
So I took off, trying to avoid as many enemies
But in no time, I was surrounded
And I had a dull blade and no back-up supplies
So I did the most logical thing
And I dug as fast as I could
The shovel took me as far down as another cave
And I once escaped my enemies
But now I was in another enemy territory
With only one light to illuminate my space
And I heard groaning in the seemingly still space
”A creeper,” I thought
The noise grew louder and louder
And I just stood there. Afraid.
As the acrid sound touched my ear drum
I felt fear, and other tingling sensations
How was I so powerless
Not being able to defend myself
It was unbearable; but I didn’t want to surrender
I saw the creeper and I leapt away as it noticed me
It charged toward me and then
And then, and then, the end?
Shoal came from the hole I dug earlier
And landed on the creeper
Exploding on impact.
Shoal split into a thousand pieces
And it disappeared
Before my very own eyes
Thank you shoal
For saving my many lives
I take back everything I said in the past about you
I take back all the times I left you hovering in those caves
Shoal, I liked our time together
And you have a purpose
Morning came, and I escaped the cave
Going back to HQ for resources
Carrying with me a bag of shoal
For safe keeping.
Last year I was wrong for the most part, especially the Apple announcement of the iPad. But I got one or two right, like increased android sales. w00t!
Well, here goes nothing yet again.
Another devastation of a EU country on the brink of economic collapse that gets a bailout
Groupon does not get acquired
iPad 2 (Or other name) will outsell more than iPad (4.19 million worldwide, from an article written on November 2nd)
3D televisions will not make it big
Superbowl commercials will not create another viral hit (Old Spice last year)
Last year was overwhelming. This year, I’m going to break it down with goals and projects, since they seem to have separate intentions. I’ll describe the projects, and I’ll leave goals as one-liners.
Goals:
Spend at least one month using no credit cards or debit cards to pay for purchases, excluding online purchases. ATM withdrawals are fine.
Keep track of every expense for a month, and can use Mint.com or Quicken, or other financial tracking program if desired.
List of books - Get it organized and make a queue of what to read next
Paleo diet for at least 30 consecutive days
Website redesigning + Create personal Website
$8.00 or less meals
At least 40 new books read
Produce a webshow with at least six “pilot” episodes
No High Fructose Corn Syrup for 2011
Pass my EIT exam
Cook at least one new recipe every week (Or an accumulation of over 50 new recipes), with documentation
Projects:
Codename ‘Open Books’
This idea manifested itself into a manifesto I’m going to write once I gather enough research to implement the idea. It basically tries to create a new platform for authors to get published and get compensated for, as well as allow creative commons, or some other form of copyright, though I doubt it will be copyright, for others to remix, redistribute, reorganize literature in the future.
An Anthology of Different Music Genres
The way we classify music for a few decades now is by musical genre.
However, the internet is increasingly diversifying and scatter the number of genres, increasing exponentially.
But every musical genre and fusion has some sort of origin, so my goal is to encompass Hip-Hop (ongoing from November and December of 2010), as well as Classical, Folk, Metal, Rock, and Electronic (I know full well this does not cover even a whole chunk of music out there).
I’ll update everyone how I’m going about this sooner than you think.
Hopefully I’ll expand the projects list, but for now, here is my rough draft.
I’ll try and come back to this list every so often and see how far I’ve come along.
Thanks for reading the blog during 2010, and there will be more for 2011.
As you may know, every year I’ve been releasing a yearly goal list. Last year, I went too far and tried to reach a whooping goal of 22 goals. Some of them were a mistake. Some of them were just a reminder of what I should keep in mind. I’m going to go over each one and tell you which ones failed and which ones actually succeeded.
Retain some other English accent
Yup, failed this one. But I have a good reference point if I actually want to do this one. I was watching Rocketboom, and they interviewedAmy Stoller, which motivates me to get a coach or deconstruct dialects by myself.
Take an Art or Photography class
Strange this one goes on my list with no explanation. I’ve taken an art class before, so this shouldn’t really be a goal. I think the take-away goal here is that I should learn more of art or photography techniques. Failed this one, if we talk only about this year.
Participate in a Marathon and train for it
To be quite honest, I don’t think running is for me. However, I’ve been running a few times a week, though it’s the holidays, and it’s too cold outside. The treadmill is kind of my worst enemy. Maybe next year. Failed.
52-Week Book Project.
One book a week. I only recently rediscovered a passion for reading this summer, and I’ve been going at two books a month or so. This one is surely to catch up with me next year. Failed.
Finish a collection of short stories
It’s changed to being a novel now, which I’m currently working on. Failed.
Make a 365 Photo-Blog.
I’ve started with Day 1 on this blog already. I should have the blog up by next Monday. The goal is to post a picture a day.
Okay, this one needs no explanation. Failed.
Watch and take notes on every Ted Talks
Too many. I have a copy of each one, I just have to stop being lazy. Failed.
Watch 1 Movie a Week
I’ve never seen before that’s been recommended to me.
I’ll start this on the first complete week of 2010.
I would’ve never guessed this one I succeeded in. As of this writing, I’ve watched one more than I actually needed to, though I think it’s a misrepresentation because I forgot to record two whole months of movies, so I tried my best to recall which movies I watched in March and April.
Finish an Art piece and sell it.
Nope, failed.
Write a song, possibly a whole EP, record it, and play it live.
Again, failed.
Keep a dream journal and experiment with lucid dreaming
I have been doing this, funny enough. It’s been almost two months now since the first entry in my journal.
Participate in NaNoWriMo
I’ve replaced this goal with the short stories one and changed the time to the last three weeks of December due to time constraints. Failed.
Continue blogging here
I have to admit that I haven’t been as active on my blog, but I’m still updating. Yea, success.
Study history of pop music
done best by listening to 2 or 3 albums a week
Well, it’s a win-lose situation. I’ve broadened my spectrum of listening to the history of hip-hop and metal so far. Albums, no. Pop music, I think I get enough of it as it is. Failed.
Tweet everyday with a new vocab word (Probably for artwiculate)
Again, no need for an explanation. I’ll try some other form of this in the future. Thanks to this goal, I have been put in a strange twitter list. Failed.
Write a screenplay for a short film or web-series
Ha, I think I actually remember writing this, then regretting it. Failed.
Write a proposal to pitch to VCs (or other people) of a live broadcast studio at low costs on the internet
Well, I’ve learned a lot about VCs this summer. Funny that, but this idea has completely morphed into a new idea with plans in the future. I hope to tell more as the idea manifests itself. For now, it’s a failed project.
Reach goal of 100 podcast reviews (I’m around about 60 now)
The blog is defunct, and people still chyme in to write me requests. It is still up in the air whether or not this will ever happen. Failed.
Read David Allen’s Getting Things Done and implement it in my daily routine
It took me forever to reach this one, but somehow I got to it in October.
Master a different language
Not just yet. I’m going to be working with German for a study abroad trip next year. I’m going to try my best to deconstruct and attain some fluency or at least conversational level German. Failed.
Make a home-brewed electronic device
Overlooked this one. I think it’s time to reconsider this one next year. Failed.
Pass my GWR
Yup, passed this one. I forgot this was even a goal.
Final verdict:
Success = 5 (22.7% Success rate)
Failed = 17 (77.3% Failure rate)
Goals that have changed = 5 (Same as successes)
Goals I no longer hold interest in = 6
I guess this year has taught me there’s not enough days to do everything I want. Plus, with reading more, I’ve discovered something in myself; I need to diversify myself and gain some sort of creative engine again. This new idea of mine really comes from this blog post I read from Elizabeth King. It’s going to be a theme for next year, as I wrap up this blog post.
Happy holidays, and keep checking for holiday updates.
I’ve deactivated my Facebook Account indefinitely. If someone wants to be a Facebook friend of mine, I’ll gladly be, if you tell me beforehand so I can reactivate it. Deactivation is a quick cheat that doesn’t apparently work well though. I’ve recently made a new splash page using about.me. I attached my deactivated Facebook account and still, my status updates still were up there, albeit I never really update it.
A little background first. I was on Facebook with the privacy settings jacked up to being as private as possible. Over the past two years, I’ve been lenient about a few things, but after the whole scare earlier this year when Facebook made more information private, or at least new accounts were being put as public profiles, I’ve became more untrusting of Facebook.
Don’t get me wrong, this isn’t the straw that broke the camel’s back. This is more of a safety measure of mine. I don’t believe too much in the fact that if you’ve done nothing wrong, you’ve got nothing to hide. It’s that I still have some dignity in my life, and if I want to own my life, I must claim it, not how Facebook can sell it.
Also: I might as well use Tumblr also as a writing journal or some sort from now on. I’ve been posting random things lately, and it’s just not fulfilling as a writer.
Lenny, who was shaking as much as a coffee addict, slowly stepped towards his father’s voice into a room much like one in which prisoners are interrogated. Each step created a small creaking sound that was magically amplified to increase the suspense. Lenny stopped in front of his dad in a mournful position, bowing his head down, not in any deference to his father, but for the shame and dishonor he had. His dad shut the door, leaving me alone to wonder. What am I going to do? I asked myself silently. A few moments later, I heard whipping and whacking noises as well as violent screams coming from the other side of the door. One could describe this event as a fatal beating, but I can tell you it was far worse. This was the ass whopping moment of the century.
Lenny’s cries and shrieks stopped after his father yelled his final contentious words.
“Now Lenny, if I ever, and I mean ever, catch you stealing again, then you will never see the light of day,” the voice of a barbarous, yet didactic parent said.
Lenny left the room and went straight to the restroom to ease his pain. I knew that my turn was coming. Dwaine approached me and began to speak in a softer, gentler voice that cooed like a bird.
“I know that Lenny is manipulative and allows people to fall for his mistakes. I am not going to tell your parents, Jeremy. I know you would never do this if you had never met Lenny. You’re a good kid, and Lenny has to pay for his crimes,” Dwaine said.
My life had taken an unexpected turn. I was dumbfounded; my mind couldn’t wrap around Dwaine’s words. I was terribly confused at what Dwaine was saying. His reasoning, just as Lenny’s was, in a way, garbled. A part of me accepted his logic as truth and allowed the situation to be as if nothing had happened, but like a back itch, this did not feel right at all.
I spent another night over and I woke up to the sound of wood chopping. Lenny was outside, busy with his axe, working his muscles. I rushed outside to see what was going on.
“What are you doing Lenny? Did your dad ask you to chop wood?” I asked.
“No, I’m chopping wood for the winter,” He responded in monotone.
I sat down and watched Lenny struggle at each piece of wood. Lenny was not that great at lying. I knew Lenny to be very disobedient to his parents, but it all seemed like Lenny grew submissive upon his parent’s orders. My mouth was wired shut, so I was reticent and didn’t even try to talk to Lenny.
His dad came outside with a robe and slippers a while later.
“Lenny, what are you doing outside? You’re grounded remember?” Dwaine said with a thunderous voice.
“You told me to chop wood, remember?” Lenny yelled.
“Well, it’s cold outside. You better go inside where I can see you.” Dwaine was purposely being despotic to gain back control over Lenny.
“I don’t care what you’re saying now, dad. I’m staying outside,” Lenny replied.
I walked inside in an attempt to stop myself from getting into some useless commotion. Both Lenny and Dwaine were idiots because neither could convince the other that their path of choice was right –both stubborn in their beliefs on the true values of life itself. I knew that Dwaine would keep his word by denying my part on the matter of what happened at Fry’s. There was nothing to worry about, nothing to fear anymore. And I moved forward, just as life moves on. Lenny continued to yell at his father, even louder as the wind picked up.
Back in the house, I went into the restroom and gazed at myself in the mirror. The reflection looked peaceful, yet the face couldn’t stop its head from shaking. I spit into the sink and then washed my mouth. I splashed water in my face and then wiped it off with a towel. I looked up again and stared at myself. There was nothing in my reflection and I couldn’t stop but feel neutral. Simply neutral. Nothing had happened and nothing ever changed. Sure, I learned a lesson, but I no longer have any opposition for what I did. It never occurred to me ever again.
Lenny assured me the case was not armed and it would be a breeze because there were no guards at the front entrance. I, again, told him the alarm would go off. My mind ran the scenario countless times. The one scenario that seemed to be the most plausible in my mind, at that time, was that the door alarm would read a specific barcode on the case with small, invisible lasers, and, since the CD was not purchased, it would trigger the alarm mechanism. I looked into my jacket and examined the bulge that the case made. I can’t do this, I thought. I took a few steps towards the door, like a dead man walking.
The door alarm would determine my fate and I was not ready to face it. Lenny pushed me a few more steps forward. I was terrified. The experience was ten times scarier than the first time stealing in Costco because the risks of getting caught were higher. I became agoraphobic once again; the voices around me came back. I began to think that the public was aware of my actions. I stepped beside the two pillars and waited to hear the alarm go off.
No alarm sounded. Everything was absolutely fine. I walked outside to the parking lot and caught my breath. I was so relieved, so much that my devilish side erupted. The sky was dark and the parking lot lights had dimmed a crimson red glow. The anxiety and fear was suddenly alleviated like taking a piss in winter snow. I put the game under Lenny’s parents’ car in plain sight so that I could find it when we all left.
I went back to the store and met back up with Lenny in the stereo section of the store.
“Where did you put the game?” he asked me, slightly raising his voice.
“I put it under the car,” I told him.
“You did what?! You have to show me specifically where!” he said exasperated.
We both ran outside and I showed him specifically where I placed it, except the game was gone. There was no one walking around. I swore to myself I had placed the game under the car.
“Holy shit! Where’s the game?” He whispered angrily at me as he situated his hands around my neck to choke me.
“I don’t know,” I gasped. He let go of my neck and looked around, only to see his father, Dwaine, appear out of thin air.
“Lenny!” Dwaine bellowed. He had the game in his hand and held it up. “Did you steal this game?”
My mind ran through countless explanations for how Dwaine had found out. We hadn’t noticed that his father had left the store. Since I was in a hurry, I did not leave the game completely sightless from the pedestrian view; it wasn’t impossible for Dwaine to find the game.
Lenny froze up. “N-n-n-no,” He chirped. “I mean sorta.”
“What do you mean?” Dwaine demanded.
“Well, Jeremy stole the game, but I-I-I-I…” He trailed off. Dwaine looked at me, staring at me with a pair of satanic eyes.
“Did Lenny ask you to do this?” He asked in a moderate tone.
“Yes, he told me to-”
Dwaine interrupted, “That’s all I needed to know.”
I was caught. I had failed in stealing, failed in achieving the perfect crime. I was fearful of the future because I was scared of the consequences. I was embarrassed at myself for allowing this brief interlude of stealing.
It wasn’t the same type of embarrassment as the kind I felt when I actually took a crap during my cousin’s kindergarten class, or when my mother bragged about how much longer I was breast fed milk than the other mothers, or even when my pants were pulled down during lunch in my middle school lunch room, exposing the groin area for a few seconds. It was the type of embarrassment that made my body unresponsive and sluggish. My eyes looked down on the floor and I was frightened to look up at Dwaine.
The car ride home was slow – it was as if the executioner pointed a gun right at my head, and he (or she) didn’t pull the trigger only to add suspense. The eternal feeling of being caught swept over me like inundated houses overflowing with water from a tsunami. My chest was heavy and I took short breaths. I sat with my head down and I didn’t move an inch until we arrived at the complex; the place I thought would be the end of my freedom and a beginning of a life in juvie.
Dwaine told both of us to go to Lenny’s room. We both acquiesced and crept towards the room looking down at the rug. Judgment was approaching and I had no trial by jury. I had no one to defend my case. Lenny told me not to worry and to go to sleep, but it wasn’t that simple. I laid silently as Dwaine came over to Lenny’s room.
There is the door, I thought. There are only 15 more steps and then I don’t have to worry about anyone trying to stop me. I saw the exit with two ladies checking receipts from purchasing customers. I walked right past the ladies with relief because they paid no attention neither to me nor Lenny. I am finally safe, I thought, this is truly a phenomenon.
But I wasn’t safe. I wasn’t safe from myself because I had just let someone’s illegal actions engulf me as an accomplice. I had just allowed Lenny to steal a game cartridge in front of me, but because I had aided him, there was no backing down now. I couldn’t tell anyone else. I didn’t want to get in trouble and I especially didn’t want others to think differently about me if they knew that I was a petty thief.
Lenny told me it was over. It was far from over. My brain was at war with my conscience, trying to spread an emergency code to the rest of my body. My mind kept telling itself over and over again, never again, Jeremy. Never again. The guilt sunk deep into me; it felt so wrong. But another thought sprang into my head, can I forgive myself for what I just did, can I possibly justify this course of action? It was Costco after all; it shouldn’t have been such a big deal.
“Man, that was really easy.” Lenny said. “Now since I did it, it’s only fair that you do it too.”
Oh crap. He just said the line. The line that drags me into the world I never sought to bring myself to. In church, pastors and followers would always say how I was such a good kid and how I had never forsaken God. I couldn’t stand the thought of myself if I stole, because it would ruin my image, or what I thought was my personal image.
Lenny drags me into Costco again accompanied by a stranger so that we could get in. I can’t reiterate enough how much Costco’s security sucks. We get to the gaming section again. This time, it was my turn. Lenny took the role of the lookout and I trembled with sweaty hands. I attempted to open the box, but I simply couldn’t open it.
“I can’t get it open,” I said. I had a hard time using the screw driver to my advantage.
“Try twisting the plastic,” he said.
I twisted the box’s case, and it magically opened just enough. I grabbed the game and gave it to Lenny so that he could put it into his pocket. We strode off to the door once again, this time, feeling that I had blood stains on my hands. Again, we made it to the front door and for a second time, we got outside. I thought we escaped unharmed, but the same whispering thoughts came back to haunt me.
“We’re safe and sound,” Lenny said. I don’t know what came over me in that moment. I had an adrenaline rush; my heart pumped blood faster than normal. There was a feeling inside, like my libido, that was full of thrill and excitement, yet my head couldn’t stop throbbing. My thoughts kept echoing how cool stealing was. I sat in the car, solemn, as Lenny played the games we stole on the portable device he brought.
Stealing became a temporary obsession. I was like a filthy British teenager trying to find the most insane, hardcore porn there is on the $9.99 per episode porno sites, or like how a little first grader is nostalgic during his or her stay in band camp. All of the sudden, we were doing another round of stealing on the same day, this time trying to see how many games would fit in Lenny’s pockets within an hour. By the end of many rounds, we shoplifted all the games that amused us with any slight curiosity. Listen to me Jeremy. It’s me, your conscience. You’re doing the wrong thing! Don’t let Lenny take advantage of you! Do something!
“You’re not bored now, are you?” Lenny said. I didn’t reply. The car ride home was in a humble atmosphere as I feared the next thing I would say would jeopardize the whole operation. “I can’t wait to try all of these games when we get home,” I murmured. The guilt tore my heart as every time it pumped. My head waltzed towards destruction.
We arrived at Lenny’s house and left all of our loot in his parents’ car. That night lasted only for a mere second – I went to bed before I knew it. During my slumber, I had awful dreams that came from the after effects of stealing. My body perspired while I tossed and turned in the blankets. Lenny, who was sleeping a few feet away from me, snored. I kept waking up from nightmares and walking around Lenny’s house. The house was too silent; the air was too pristine. I found myself constantly going to the restroom and staring at myself in the mirror as I splashed water onto my face. It might have been quiet, but my demons were hollering, trying to break free.
The next night, we went to Fry’s. Unlike Costco, Fry’s was a more dangerous place with surveillance cameras and door alarms. The place specialized in electronics where Lenny would have loved to take everything. I looked around for guards and then at the cameras and printers and thought how to steal them from the store. I shook my head in attempt to wipe away those terrible thoughts.
“Come over here, Jeremy. Wouldn’t it be cool to steal this new game right here?” I looked over. It was a brand new RPG game for the PC that had come out the previous month.
“No, Lenny, I can’t do this,” I whispered.
“Sure you can,” he said. “Remember what you did yesterday?”
“Well, that was Costco. Besides, how do I know that the alarm won’t go off when I go through?” I said.
“There’s only one way to find out,” he said with a chuckle. I predicted that Lenny was going to use peer pressure on me again and I was right on the money. We went on and on; I argued the ethics of stealing and the consequences of getting caught while he argued that it was for the interest of our entertainment.
“Ok, then why don’t you do it?” I asked.
“Because I did it last time,” he said. I gave up in persuading Lenny. I had poor argumentative skills and could not stop myself from doing this heinous act. My superego and ego gave up; the little shoulder angel was defeated by the little shoulder devil.
Minutes into our covert operation, I managed to tear off the wrapping and taping that concealed the CD in the box with my fingernails as Lenny watched guard. The CD inside the box was, however, inside a hermetic case. Lenny was skeptical about bringing the case, but he said it was a necessity because it contained the serial number and activation code to play the game. I stated that the case may contain a security precautionary device that would trip the door alarm. I was frightened by the very thought of getting caught at the entrance that goose bumps had risen.
I wrote a chapter of my life a while back and I wanted to start posting it on this tumblelog. So without further ado, here it is.
Theft
Thou shall not steal. It’s one of the Ten Commandments I have broken. I had tried in the past to atone for these sinful actions, but every time I sought redemption, I fell into an abyss of guilt; I was haunted by my actions in stealing when I was a pre-teenaged boy.
It was one summer day, when the sun imposed heat all over Palo Alto and the newscasters didn’t blame climate change as the primary cause for such an occurrence. A heat wave had struck most of the San Jose Area, which was the third consecutive time it had happened during my stay at Lenny’s place. Lenny and I were bored out of our minds and couldn’t think of anything to do. Of the two of us, I was always the creative one, but on this particular day, my mind lacked creativity; it was just too hot outside to play, too hot to stay inside, and too hot to wear clothes. Out of this boredom, Lenny thought it might have been a good idea to go with him and his parents to Costco because he wanted to show me something “awesome.” I agreed to his proposition and we both got in his parents’ new car.
Anyone who’s ever been to Costco knows the entire security system is built on membership card recognition upon entrance. What a bullshit system. There were no security cameras and no armed guards. Lenny found this security flaw and used it to his advantage. He brought me to the gaming section of the store, which was then just a pile of game cartridges in some worn down boxes.
“It’s hella easy to steal these games. All you need is a mini-screw driver, and I brought one,” he told me. I looked at the screw driver with widened eyes.
“You did this before?” I asked, even though the question had an obvious answer. It was the first time I heard of his illicit actions in his past and I could not digest that fact.
“Hell yea. They’re not even locked up. The only thing to worry about is a security chip in the actual box, so just take out the cartridge. Can you watch for anybody coming while I take this game out of the box?” Lenny asked as he started ripping the box.
I couldn’t believe it. I couldn’t wrap my mind around the developing situation that either he was really stealing or that I was an accomplice by default. My hands were shaking so much and so much had happened too fast. I tried to stop and think about what my parents told me about stealing to convince myself what I was doing was wrong, but my fear was too stupendous that I could not focus on my thoughts.
“Good thing I brought a large jacket,” he chuckled. It wasn’t the perfect time for me to listen to his humor and laugh alongside him. He hid the game in his right inner pocket. “I gotta ask my parents for the car keys. If they say anything to you, just say that you don’t wanna be inside anymore and that you also need to go in the car.”
“Wait a minute. I don’t get it,” I whispered. “What if we get caught? I don’t want to get in trouble.” I was worried that someone was going to stop us; a guard would just come up to us and say, “You have the right to remain silent, little boy.” I couldn’t think properly and every nerve in my body tried to hold me back from stealing as much as possible.
“Don’t worry. Remember, I’ve done this before. No one’s watching us,” he told me. He wanted to reassure that I was on his side because the worst thing for a stealing duo is betrayal.
We reached his parents and they obliged to Lenny’s proposal in a snap.
“You look pretty sweaty there, Jeremy. Are you alright?” Lenny’s mother asked. I was shaking with fear and terror.
“Y-y-yea. I’m alright,” I stammered. His mother looked at me very closely, scrutinizing my eyes, but she walked off seconds later because she found a great deal on toilet paper.
Lenny shoved me in the direction of the door. After passing a massive crowd of people, I stared at each and every one of them as if they knew what I was doing. My paranoia really irritated me. I started hearing voices in my head, voices that were foreign and that weren’t like the usual thoughts I had. Each person that passed me brought on a new thought in my head with a new voice I never heard before. “I’m going to catch you.” “Thief.” “Robber.” “I’m going to tell.” I was getting really freaked out. My friend didn’t try to comfort me. He just kept on walking passed every one else calmly as if he knew that everything was going to work out.