diff --git a/.buildinfo b/.buildinfo new file mode 100644 index 00000000..08f4a48e --- /dev/null +++ b/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: 4731952c25e598ca22ba195ddf201f9d +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/.doctrees/2020-year-in-review.doctree b/.doctrees/2020-year-in-review.doctree new file mode 100644 index 00000000..4102c808 Binary files /dev/null and b/.doctrees/2020-year-in-review.doctree differ diff --git a/.doctrees/2023-recap.doctree b/.doctrees/2023-recap.doctree new file mode 100644 index 00000000..2525b0da Binary files /dev/null and b/.doctrees/2023-recap.doctree differ diff --git a/.doctrees/2024-recap.doctree b/.doctrees/2024-recap.doctree new file mode 100644 index 00000000..e0f42141 Binary files /dev/null and b/.doctrees/2024-recap.doctree differ diff --git a/.doctrees/about-me.doctree b/.doctrees/about-me.doctree new file mode 100644 index 00000000..0c43baef Binary files /dev/null and b/.doctrees/about-me.doctree differ diff --git a/.doctrees/building-a-taco-johns-scraper.doctree b/.doctrees/building-a-taco-johns-scraper.doctree new file mode 100644 index 00000000..529dec0f Binary files /dev/null and b/.doctrees/building-a-taco-johns-scraper.doctree differ diff --git a/.doctrees/djangocon-us-2019-recap.doctree b/.doctrees/djangocon-us-2019-recap.doctree new file mode 100644 index 00000000..3ce642e7 Binary files /dev/null and b/.doctrees/djangocon-us-2019-recap.doctree differ diff --git a/.doctrees/djangocon-us-2023-recap.doctree b/.doctrees/djangocon-us-2023-recap.doctree new file mode 100644 index 00000000..4925c545 Binary files /dev/null and b/.doctrees/djangocon-us-2023-recap.doctree differ diff --git a/.doctrees/djangocon-us-2023-topics-inspiration-list.doctree b/.doctrees/djangocon-us-2023-topics-inspiration-list.doctree new file mode 100644 index 00000000..c687e4bc Binary files /dev/null and b/.doctrees/djangocon-us-2023-topics-inspiration-list.doctree differ diff --git a/.doctrees/djangocon-us-2024-recap.doctree b/.doctrees/djangocon-us-2024-recap.doctree new file mode 100644 index 00000000..18995d71 Binary files /dev/null and b/.doctrees/djangocon-us-2024-recap.doctree differ diff --git a/.doctrees/djangocon-us-2024-topics-inspiration-list.doctree b/.doctrees/djangocon-us-2024-topics-inspiration-list.doctree new file mode 100644 index 00000000..46fc1193 Binary files /dev/null and b/.doctrees/djangocon-us-2024-topics-inspiration-list.doctree differ diff --git a/.doctrees/environment.pickle b/.doctrees/environment.pickle new file mode 100644 index 00000000..dc4efa8f Binary files /dev/null and b/.doctrees/environment.pickle differ diff --git a/.doctrees/favorite-conference-snapshots.doctree b/.doctrees/favorite-conference-snapshots.doctree new file mode 100644 index 00000000..2ac54c0e Binary files /dev/null and b/.doctrees/favorite-conference-snapshots.doctree differ diff --git a/.doctrees/hacktoberfest-prs-2020.doctree b/.doctrees/hacktoberfest-prs-2020.doctree new file mode 100644 index 00000000..5c411aaa Binary files /dev/null and b/.doctrees/hacktoberfest-prs-2020.doctree differ diff --git a/.doctrees/index.doctree b/.doctrees/index.doctree new file mode 100644 index 00000000..70c5f91a Binary files /dev/null and b/.doctrees/index.doctree differ diff --git a/.doctrees/los-angeles-2023.doctree b/.doctrees/los-angeles-2023.doctree new file mode 100644 index 00000000..bd310898 Binary files /dev/null and b/.doctrees/los-angeles-2023.doctree differ diff --git a/.doctrees/pinax-release-tutorial.doctree b/.doctrees/pinax-release-tutorial.doctree new file mode 100644 index 00000000..01a0087c Binary files /dev/null and b/.doctrees/pinax-release-tutorial.doctree differ diff --git a/.doctrees/pycon-us-2019-recap.doctree b/.doctrees/pycon-us-2019-recap.doctree new file mode 100644 index 00000000..79368c58 Binary files /dev/null and b/.doctrees/pycon-us-2019-recap.doctree differ diff --git a/.doctrees/pycon-us-2024-recap.doctree b/.doctrees/pycon-us-2024-recap.doctree new file mode 100644 index 00000000..44f7c405 Binary files /dev/null and b/.doctrees/pycon-us-2024-recap.doctree differ diff --git a/.doctrees/pygotham-2019-recap.doctree b/.doctrees/pygotham-2019-recap.doctree new file mode 100644 index 00000000..2e854409 Binary files /dev/null and b/.doctrees/pygotham-2019-recap.doctree differ diff --git a/.doctrees/reflections-on-stanford-code-in-place.doctree b/.doctrees/reflections-on-stanford-code-in-place.doctree new file mode 100644 index 00000000..b9fa0129 Binary files /dev/null and b/.doctrees/reflections-on-stanford-code-in-place.doctree differ diff --git a/.doctrees/speaker-board-and-organizer-photos.doctree b/.doctrees/speaker-board-and-organizer-photos.doctree new file mode 100644 index 00000000..115ccc9c Binary files /dev/null and b/.doctrees/speaker-board-and-organizer-photos.doctree differ diff --git a/.doctrees/the-most-important-python-content-of-2024.doctree b/.doctrees/the-most-important-python-content-of-2024.doctree new file mode 100644 index 00000000..5ed16be7 Binary files /dev/null and b/.doctrees/the-most-important-python-content-of-2024.doctree differ diff --git a/.doctrees/til-100-days-of-code-version.doctree b/.doctrees/til-100-days-of-code-version.doctree new file mode 100644 index 00000000..d7801d3c Binary files /dev/null and b/.doctrees/til-100-days-of-code-version.doctree differ diff --git a/.doctrees/what-i-am-paying-attention-to-in-2024.doctree b/.doctrees/what-i-am-paying-attention-to-in-2024.doctree new file mode 100644 index 00000000..6acf95db Binary files /dev/null and b/.doctrees/what-i-am-paying-attention-to-in-2024.doctree differ diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 00000000..e69de29b diff --git a/2020-year-in-review.html b/2020-year-in-review.html new file mode 100644 index 00000000..f6a356e8 --- /dev/null +++ b/2020-year-in-review.html @@ -0,0 +1,291 @@ + + + + + + + + 2020 Year in Review — Portfolio 0.1 documentation + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

2020 Year in Review

+

Thank you to Dawn Wages for inspiring me to do a Year in Review blog post!

+
+

TL;DR

+

This year could have been better for me, but it also could have been much worse.

+

My highlights for the year have been:

+
    +
  • Attending PyCascades 2020 in February

  • +
  • Taking part in Stanford Code in Place in April and subsequently participating in 100 Days of Code

  • +
  • Completing an important Pinax release in July that was a personal and professional milestone

  • +
  • Resuming public speaking in September

  • +
  • Working on an amazing Wharton Business School project, Simpl game simulation framework, for the last couple of months.

  • +
+

Although it has been a difficult year, I’ve achieved some knowledge and skill “step changes” that I think have added some invaluable experience to my resume. This has helped me to cope. I can’t control everything, but I can control my attitude and actions. I will give a recap of these step changes at the end of my blog post. :)

+
+
+

PyCascades 2020

+

In early February, I attended PyCascades 2020 for the first time, in Portland, Oregon. At the time, there was just a handful of Covid cases in the region. For me, PyCascades will forever be a dream-like memory of normalcy and naïveté before Covid hit.

+

The atmosphere at PyCascades 2020 was amazing. It was held at Revolution Hall, a former high school on the east side of Portland that was renovated into an event space.

+

+The entrance to Revolution Hall

+

The talks were as great as you’d expect and I enjoyed the “hallway track” too. I saw many “old” friends there and made plenty of new ones. Notably, I met a number of “famous” Python folks, too. :)

+

A few memorable moments:

+ +

One of the highlights of the conference was eating dinner with Guido van Rossum, the original author of Python, and friends at Grassa, a “handcrafted pasta” restaurant. Guido told us some stories from the early days of Python. It was quite an evening.

+

+Dinner with Guido (he’s the one waving!)… what fun; photo credit: Jonan Scheffler, used with permission

+

While I was in Portland, I also enjoyed Cuban food at Cubo, Lebanese and Mediterranean food at Nicholas Restaurant, and Mexican food at La Morenita food truck. All of the food was super delicious and I’d love to go back and eat it again! :)

+

+Ropita at Cubo: shredded beef brisket stewed with tomato, vegetables and traditional Cuban spices, served with white rice, black beans, mango, avocado, maduros and tostone

+

+Chicken Kabob Lunch Bowl at Nicholas Restaurant: chicken breast marinated in olive oil, garlic, yogurt, paprika, and lemon, served with tzatziki and toum, saffron jasmine rice, and cabbage garbanzo salad; not pictured: yummy hummus and warm pita bread

+

+Morenita Burrito at La Morenita Food Truck: steak, chile relleno, beans, cheese, lettuce, pico de gallo, and guacamole in a flour tortilla

+

I enjoyed a birdseye view of Portland while riding the Portland Aerial Tram and visited the picturesque Portland Japanese Garden.

+

+The view from the Portland Aerial Tram upper platform

+

+Me at the Portland Japanese Garden… a kind stranger saw me taking photos and offered to take mine

+

+The iconic Moon Bridge at the Portland Japanese Garden… breathtaking

+

+The iconic Heavenly Falls at the Portland Japanese Garden… wow!

+

From the moment I arrived in Portland, it came across as a relaxed city full of very nice people. For instance, I was pleasantly taken aback one morning, while walking down the sidewalk, when a stranger kindly said “good morning” to me. That’s something I might expect in small town Kansas, not in a city as big as Portland. I loved the food truck culture. And the city itself was quirky and beautiful. It’s a potentially triggering subject, but I feel it would be remiss to not acknowledge that a KKK rally took place in the downtown during one of the conference days. During the trip, as I learned more about Oregon’s history of racism, I found it to be very disturbing and a reminder of the complexities in our past and, unfortunately, present.

+

I’ve enjoyed having the opportunity to attend a few online conferences and meetups, especially ones I wouldn’t normally be able to attend, but nothing takes the place of an in-person event full of interesting people in a city that you’d love to get to know better.

+
+
+

Stanford Code in Place and 100 Days of Code

+

In late March, while I was looking through my Twitter news feed, I came across a tweet about a one-time Python programming course called Stanford Code in Place.

+

Mehran Sahami and Chris Piech teach Stanford’s introductory Python course CS106A. Because of shelter-in-place, they decided to open the course to the public. They would teach the traditional CS106A version and public Code in Place version simultaneously.

+

I applied and was chosen to participate. Although I was much more familiar with Python than some of the other participants, I used it as an opportunity to reinforce concepts and kickstart making some new fun and practical apps from scratch. Although my “section” had a dedicated leader, I was also able to provide some informal mentoring to other members of the group.

+

I won’t write much about my Stanford Code in Place experience here, because you can read about it in my Reflections on Stanford Code in Place blog post. It was a fun and unique experience and I think I got a lot out of it, including making Simba Friends Twitter Bot.

+

After Stanford Code in Place ended, I decided to keep the momentum of making apps going by participating in 100 Days of Code. The highlight has been completing several small projects and writing about the process I went through and what I learned.

+

A few of my favorite 100 Days of Code project blog posts from this year:

+ +
+
+

Pinax Release

+

In July, I oversaw the completion of an important Pinax release. It was a huge milestone for me, personally and professionally. Not only did I initiate the release, but I managed the end-to-end process. I created the release plan, oversaw the work of others, updated 10 apps myself, merged all of the PRs, and tagged and published the packages. I really took the bull by the horns and learned a lot in the process, I’m happy to say. :)

+

It was no small task, though. Many of the original Pinax authors were Django core devs and it shows. Pinax is a large and complex library of open-source, professional quality, interdependent Django projects and apps, including sophisticated testing, packaging, and continuous integration configurations. The Pinax GitHub organization alone has around 80 repos.

+

One of my goals for this release was to make it easier for people to get started contributing to Pinax. I began by creating a detailed Pinax 20.XX Release Plan that put into writing for the first time, the Pinax “way of doing things.” I was thrilled that contributors were able to use this documentation to complete a large portion of the work, with occasional support from me.

+

Notably, in this release, support was dropped for Python 2.7, and support was added for Python 3.6+ and Django 3.0.

+

A number of people contributed to the release in many different and important ways, but I couldn’t have finished the release without the generous contribution of Mfon Eti-mfon.

+

As a first time contributor, Mfon provided expertise in dropping Python 2 support, dropped and added support for Python and Django versions in 14 apps, including Django User Accounts, and created a script to automate the addition of contributors to the AUTHORS files. He also reviewed all of the code changes with me, to ensure that the best choices were made. I’m so grateful for the contributions that he made to the Pinax release and I’m thrilled that he was recently elected to the Django Software Foundation Board.

+
+

Release Highlights

+

Contributors, issues, and PRs since the previous release:

+
    +
  • Dozens of contributors opened issues, submitted PRs, and provided support

  • +
  • Over 160 issues were closed

  • +
  • Over 100 PRs were merged

  • +
  • Over 30 PRs were closed

  • +
+

Release overview:

+
    +
  • Around 28 Pinax apps were included

  • +
  • Support was dropped for Django 1.11, 2.0, and 2.1, and Python 2,7, 3.4, and 3.5

  • +
  • Support was added for Django 2.2 and 3.0, and Python 3.6, 3.7, and 3.8

  • +
  • Version testing, continuous integration, and packaging configurations were updated

  • +
+

Documentation and discoverability:

+
    +
  • The Pinax release and maintainer processes were extensively documented for the first time

  • +
  • The number of files in repos was reduced and configurations standardized across repos in order to make repos more approachable and more easily documented

  • +
  • Community documents were created or revised if out-of-date, and moved to central locations

  • +
+

Community:

+
    +
  • A new Community Plan created a strategy to make it easier for users and contributors to get started

  • +
  • A new “Important Links” section at the top of each README.md will help people find what they need

  • +
+
+
+
+

Public Speaking

+

In 2017, I became an open source maintainer for the first time, then created a talk about what I’d learned about using Git and GitHub for collaboration and code review. I gave the talk at DjangoCon US 2017 (my first ever conference and talk!), PyLadies Remote, and at a DevICT Hacktoberfest meetup.

+

+Me on stage giving my talk at DjangoCon US 2017, my first ever conference and talk

+

In September, a PyLadies Southwest Florida organizer came across the talk and asked me to give the talk virtually to an audience that would consist of members of PyLadies Southwest Florida, PyLadies Miami, SWFL Coders, SWFL Data, and FGCU SEC Meetup.

+

I was delighted to be asked to do it.

+

I had the choice to give the talk a week and a half later, or a month or more in the future. After some thought, I decided to give the talk in a week and a half. I knew that the talk would not be “better” in a month or more. Putting the talk off would just give me the opportunity to prolong any fear I might have of giving my first virtual talk to an audience of this size. Doing this kind of thing isn’t easy, but it’s satisfying to face my fear head on.

+

With Hacktoberfest beginning only a few days later, the timing of my talk could not have been better. I spent some time updating the talk to incorporate some things I had learned since 2017. You can see a copy of the slides and script in the talk repo.

+

I was extremely happy with how the talk went. The audience was fairly large for a local meetup… around 50 people had signed up to attend.

+

My presentation lasted for around 45 minutes, followed by questions. I was really at ease and it went very well. There were a lot of positive comments and they would like for me to return sometime.

+

At that time, I also got some good news about a talk proposal I had submitted to the PyCon US 2020 Maintainers Summit, which was cancelled. My talk proposal, entitled “Bringing Pinax Back to Life”, had been accepted and was thought to be “excellent.” Perhaps I will have the opportunity to give that talk in the future, which I would absolutely love to do. :)

+
+
+

The Wharton School and Simpl

+

For the last couple of months, I’ve been working on a project for The Wharton School at the University of Pennsylvania.

+

I’m a Technical Writer and Advisor for an open-source game simulation framework known as Simpl.

+

Built using Python, Django, and React, and hosted on GitHub, Simpl has the potential to democratize game simulation access everywhere.

+

It’s a pretty amazing initiative and I’m thrilled to be taking part.

+

I’m excited to watch the future of it unfold in classrooms and beyond.

+
+
+

Step Changes Recap

+

Like I said at the beginning of this post, during this difficult year, I’ve achieved some knowledge and skill “step changes” that I think have added some invaluable experience to my resume. This is a work in progress. :)

+

My step changes have fallen under a few different categories:

+
    +
  • Doing things that seem scary (and they often turn out to be not that scary, actually)

  • +
  • Combining skills that I’m already good at with skills that are more difficult for me, to reach new heights

  • +
  • Completing projects, then writing about what I learned or achieved

  • +
  • Learning from the experts around me and producing higher quality work as a result

  • +
  • Doing a better job of recording information for my portfolio, resume, and doing career-related research

  • +
+

My major step changes this year:

+
    +
  • Gaining technical writing and product/market experience while working for Wharton School’s Simpl game simulation project

  • +
  • Initiated and oversaw an important Pinax release, managing the end-to-end process for the first time

  • +
  • Kickstarted by Stanford Code in Place, spent more time making fun and useful apps and teaching others how to do it

  • +
  • Wrote a number of blog posts about my projects, conferences I attended, and other learning experiences

  • +
  • Gave a virtual talk to a fairly sizeable meetup audience and had another talk accepted

  • +
  • Had several experts review my resume and am revising it accordingly

  • +
  • Did pay rate research and sought pay rate advice from experts

  • +
  • Used my people skills more, including reaching out to my connections for help more often

  • +
+
+
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/2023-recap.html b/2023-recap.html new file mode 100644 index 00000000..7011bfeb --- /dev/null +++ b/2023-recap.html @@ -0,0 +1,293 @@ + + + + + + + + 2023 Recap — Portfolio 0.1 documentation + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

2023 Recap

+
+

Daily Work

+

Throughout the year, I led/co-led the completion of a variety of substantial code features at JPMorgan Chase. I had the opportunity to lead team meetings such as Sprint Retro and Sprint Review and Demo. I gave code deep dives and demos to team members and managers.

+

I was an onsite liaison to Gaia Gemfire Team.

+

I went further in my understanding of multitenancy and orchestration.

+

This knowledge and experience led to some wonderful, impromptu conversations at DjangoCon US with former Canonical employee, now new Django Fellow Natalia Bidart and a group of Red Hat employees I had the good fortune to sit with at lunch.

+
+
+

Quality, Standards, Inner source

+

Throughout the year, I documented Python/Django standards and code quality tools.

+

I shared my open source experience. I documented best-in-class open source and inner source governance resources and methods.

+

I mentored an apprentice in doing so.

+

In November, a co-worker and I co-presented about Advent of Code and increased the number of participants within our department.

+

+Advent of Code Presentation

+
+
+

New Certifications

+

Continuous learning is important to me. This year, I earned three new certifications.

+

In May, I obtained an AWS Cloud Practitioner Certification. This certification has enabled me to better “speak” the common language of AWS.

+

In July, I obtained CockroachDB Introduction to Distributed SQL and CockroachDB and Practical First Steps with CockroachDB certifications. I really enjoyed CockroachDB University. The lessons were succint, yet very well communicated how CockroachDB works and what sets it apart from Postgres.

+
+
+

Tangential Learning

+

I learned the term “tangential learning” from my colleague and friend Neetu Jain who also happens to be the DFW Women in Product Chapter Lead/Chair.

+

Throughout the year, I attended JPMorgan Chase Product Ignite and DFW Women in Product events. The content was outstanding, and I thoroughly enjoyed the focus on user.

+

During the second quarter, I took part in a five-part security competition and finished close to the top 10%.

+

+Secure Code swag

+
+
+

PS Connect

+

In July, I obtained sponsorship from a JPMorgan Chase Managing Director to start a monthly departmental meetup in Plano that became known as PS Connect. I have had the opportunity to work with tech leads across teams to execute a highly successful launch and continue to grow it into a fun, sustainable, and value adding event.

+

I was invited to give a DjangoCon US Recap presentation at our PS Connect Christmas Party December 6. It was a great opportunity to do some public speaking and get to know my department colleagues better.

+


+Christmas Party presentation

+


+Christmas Party presentation

+

I am looking forward to seeing the new connections yet to come.

+
+
+

Diversity and Inclusion

+

During the second quarter, I completed a JPMorgan Chase Women on the Move (WoTM) Career Development Program. This outstanding program featured high impact modules on subjects such as fixed versus growth mindset, skill inventory, and an outstanding negotiation workshop led by Kathryn Valentine of Worthmore Strategies.

+

Throughout the year, I had the opportunity to attend a number of powerful, internal WoTM and Take It Forward (TIF) events.

+

In June, I took part in the JPMorgan Chase Innovation Week Global Hackathon with a project in the DE&I category. My teammates’ backgrounds ranged from product to user experience and design. We participated in the finals. Although we did not win, it was a great experience, and I made some new friends.

+

+My wonderful hackathon Team… so talented and passionate!

+

+Beautiful Take It Forward (TIF) Cup

+
+
+

DEFNA

+

I served another year as a DEFNA Board Member. I challenged myself to do more “heavy lifting.”

+

During the first quarter, I helped oversee the DjangoCon US website design by publishing our CfP, working to secure a web design contractor, and taking part in website design meetings.

+

In May, I created a DjangoCon US Talk Topics Inspiration List that was widely shared among leaders in the Django community and undoubtedly contributed to the number of DjangoCon US talk proposals increasing from 158 the year before to 185.

+

The list kickstarted a conversation that led to a talk by new Django Fellow Natalia Bidart: “Inside Out: My Journey of Understanding Inclusion.”

+

I went further in my understanding of our location/venue considerations, budget, and contract negotiations.

+

I also identified an outstanding board candidate who later joined.

+
+
+

DjangoCon US

+

In October, I attended DjangoCon US and made the most of the experience.

+

In addition to being there as a DEFNA Board member, as an attendee, I made many new connections (including Python Software Foundation (PSF) Executive Director Deb Nicholson and Django Fellow Natalia Bidart), acquired new knowledge, and supported diversity and inclusion.

+

See my DjangoCon US Recap for more info.

+ +
+
+

Django News Newsletter

+

Django News Newsletter is a fabulous newsletter published every Friday and filled with all of the most important Django news. I was honored to be included twice this year, first in May for my DjangoCon US Talk Topics Inspiration List and second in November for my DjangoCon US Recap.

+
+
+

Stanford Code in Place Article

+

In April, Stanford Engineering featured me an article “Stanford Engineering offers free online introductory programming course”. I talked about my experience learning and teaching Python programming language as a Stanford Code in Place student in 2020 and section leader in 2021. It was an honor to be selected to take part from among thousands of participants.

+

For more about my experience, check out my student recap “Reflections on Stanford Code in Place” or my section leader recap slides.

+
+
+

Harvest Moon

+

On September 29 at 7:14 am, I happened to be walking down the campus main street, which I don’t normally do. I looked up and saw the harvest moon. I snapped this stunning photo.

+

+Harvest Moon

+
+
+

Travel, Food, and Fun

+

Throughout the year, I enjoyed what Plano had to offer. Thank you to my Plano friends for some great times! See a few pics at the end of this post.

+

In December, I took the Los Angeles trip that I’ve been dreaming of taking for years. I’d had this trip planned twice before and cancelled, once due to wild fires, and once due to the pandemic. It was the last major US city on my bucket list. With Santa Monica as my “home base,” I spent 9 days seeing the city. I plan to do a separate write-up of the trip soon. Stay tuned!

+

+Me on the Friends set during Warner Brothers Studio Tour

+
+
+

Looking Ahead

+

I look forward to taking on increasingly more leadership on my team.

+

I look forward to empowering engineers, including me, to produce higher quality code, be more productive, and engage with the wider community.

+

A co-worker has invited me to teach beginner/intermediate Django to our colleagues at JPMorgan Chase. I hope to finish the curriculum in early 2024 and teach multiple sessions throughout the year. This is in addition to an offer to teach Python.

+

I plan to attend PyTexas in Austin in April. It’s a stone’s throw from Plano and a conference I have wanted to attend for quite a few years. The conference will have a stellar kickoff with keynotes by Carol Willing and Lynn Root!

+

I have yet to determine which other conference(s) I will attend, if any. Other conferences on my radar: PyCon US, DjangoCon US, DjangoCon Europe, PyCon Africa, PyGotham.

+

I hope to visit Europe. It’s next on my bucket list. :)

+
+
+

Plano Fun

+

+Brasão Brazilian Steakhouse

+

+Brasão Brazilian Steakhouse… many tasty meats brought to your table and sliced for you

+

+Brasão Brazilian Steakhouse… authentic Brazilian side dishes

+

+Brasão Brazilian Steakhouse… forget about the meat, the grilled pineapple is to die for!

+

+Rodeo Goat… Burger Battle

+

+Rodeo Goat… yummy!

+ +

+Mexican Sugar

+

+Mexican Sugar… brunch! Yummy pork chop breakfast, including chips and their distinctive tasting salsa and pour over coffee

+ +

+Dock Local fish and chips… highly rated seafood counter in Legacy Town Hall

+

+Main Street Bakery in Legacy Shops… lots of beautiful and tasty treats!

+ +

+Bamboo House

+

+Bamboo House Peking Duck… not my favorite food, but an interesting experience

+

+Fowling (football bowling… more difficult than it looks!)

+
+
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/2024-recap.html b/2024-recap.html new file mode 100644 index 00000000..e86d89a2 --- /dev/null +++ b/2024-recap.html @@ -0,0 +1,502 @@ + + + + + + + + 2024 Recap — Portfolio 0.1 documentation + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

2024 Recap

+

Disclaimer: the content of this post is a reflection of my life and career journey and not specific to my work at JPMorganChase.

+

You can read my 2023 Recap here.

+
+

This Year’s Theme

+

While writing this recap, I found myself thinking the words, “I finally got organized and” a number of times. I felt a sense of cumulative momentum this year that came from building on prior knowledge and experience.

+
+
+

Work

+

I continued as a Python/Django software engineer doing task orchestration and distributed systems engineering.

+
+
+

January

+
+

Los Angeles 2023 Trip Recap

+

The dream Los Angeles trip that I took in early December 2023 turned into a dream recap filled with my favorite stories, photos, and videos.

+

My most-viewed Los Angeles videos:

+ +
+
+

Kinesis Advantage360

+

In 2020, I bought a Kinesis Freestyle Pro split keyboard. Although the keyboard itself was fairly traditional, I loved the 20’’ separation cord and tenting. The unique Kinesis Advantage2 keyboard had long piqued my curiosity as well. When Kinesis came out with the Advantage360 split version with tenting, I finally pulled the trigger.

+

This keyboard is the most comfortable that I have ever used. The contoured shape shortens reach and the thumb presses heavily-used keys, instead of the pinky.

+

Having said that, the layout is similar, but not exactly the same as a regular QWERTY, and I do not recommend using it if you have to “hunt and peck.” Also, like the Freestyle Pro, it is one-size fits all, and slightly larger for a woman’s smaller hands.

+

+Kinesis Advantage360

+
+
+

DjangoCon US 2023 Recap

+ +

I published a DjangoCon US Recap in October 2023. It was featured in Django News Newsletter. I learned in January that the recap had been Django News Newsletter’s top article for months.

+
+
+
+

February

+
+

Board Games for My Nieces

+

I want to start doing random, fun things for my nieces. I decided to buy them some board games.

+

Games purchased:

+
    +
  • Guess Who?

  • +
  • Candy Land

  • +
  • Scrabble

  • +
  • Clue

  • +
+

I had countless hours of fun playing these when I was a kid.

+

We FaceTimed while they opened the box. They immediately began playing and loved them.

+ +
+
+
+

March

+
+

DjangoCon US Talk Topics Inspiration List

+

Every year, fellow DEFNA Board Member Jeff Triplett publishes a list of talk topics he’d like to learn more about at DjangoCon US. He also encourages other DEFNA Board Members to publish their own.

+

Last year, I finally got organized and created a Talk Topics Inspiration List for DjangoCon US 2023. This year, I created a Talk Topics List for DjangoCon US 2024.

+

Our talk submission stats since I began publishing my list:

+
    +
  • 2022: 152

  • +
  • 2023: 189

  • +
  • 2024: 194

  • +
+

Given the popularity of my articles among the Python/Django community, I’m confident that my list played a major role in the increase in submissions. I am really proud of that!

+

My list was featured in Django News Newsletter, along with Jeff’s list and DjangoCon US Program Chair Drew Winstel’s list.

+
+
+

DjangoCon US Website Design

+

As a DEFNA Board Member, I help oversee DjangoCon US, including the website design. I am also an avid photographer.

+

During DjangoCon US 2023, I walked around downtown Durham and took some photos of the quirky artwork there. During the always-fun website design iteration process, I shared these photos with the website team.

+

+Snapshots I took in downtown Durham

+

I am super excited that my photos helped inspire this year’s theme. The website design makes me smile, and I hope it makes you smile too!

+

+A shoutout from our amazing designer Joni Trythall of YupGup!

+
+
+

Conference Snapshots

+

After years of collecting conference snapshots, I got organized and created a page of my Favorite Conference Snapshots and the stories behind them, as well as a page of Speaker, Board, and Organizer Photos.

+
+
+

Family Tragedy

+

On April 15, 2022, my Aunt Judy died of pancreatic cancer. On March 29 of this year, my Uncle Edward passed away too. He had been suffering from probable Lyme-disease induced dementia and took a fall, but ultimately, he died of a broken heart.

+

A part of me never believed this day could happen, and I wished it never would. Uncle Edward and Aunt Judy were truly larger than life.

+

+My aunt and uncle in better times

+

His life was not so easy after Aunt Judy died. He missed his Judy. He died peacefully, and I am comforted by the fact that he had a smile on his face.

+

You can learn more about him in his obituary or the replay of his funeral.

+

He was one-of-a-kind. He was a brilliant engineer and businessman and the best brother my mother could have ever asked for.

+

My mom put her heart into providing the funeral music. He would have absolutely loved it.

+

My uncle was an avid hunter. My cousin Andrea Markel Hastings organized one last duck call for him at the cemetery by a few of his fellow hunting buddies.

+

There’s something in my eye.

+

+Beautiful sympathy flowers from DEFNA… in a strange coincidence, my cousin pointed out that the roses were one of my uncle’s favorite colors

+
+
+
+

April

+
+

Lemurs at Tanganyka Wildlife Park

+

Because our DjangoCon US host city Durham, North Carolina has the largest population of lemurs outside of Madagascar, we featured a “friendly” lemur on our website last year.

+

+A “friendly” lemur with a smile on its face

+

After years of hearing about Tanganyika Wildlife Park in Goddard, Kansas, mom and I decided to go. I had no idea until I got there that you can feed lemurs. They were so soft and gentle. I loved spending time with these real-life, friendly lemurs!

+

+Mom, me, and the lemurs!

+

+Me feeding a lemur a craisin out of my palm! It’s holding my hand.

+
+
+

JPMorganChase Eclipse Watch Party

+

On my way back to Plano after my uncle’s funeral, I got stuck in eclipse travel. I arrived back in Plano in time for the eclipse, but hadn’t had time to plan. Fortunately, JPMorganChase had me covered. Eclipse glasses were handed out around campus, and we convened outside for a watch party. It’s hard to put into words what it was like to watch the eclipse with what must have been thousands of co-workers.

+

Here is a little taste of the fun. This was a small portion of the crowd. Clouds intermittently covered the sun, but parted in time for the totality. The crowd cheered and Total Eclipse of the Heart played in the background. Super fun!

+
+
+

PyTexas 2024

+

PyTexas 2024 took place in Austin, Texas from April 19-21.

+

PyTexas has been on my bucketlist for years, and I finally went.

+ +

I met Jason Koo at DjangoCon US 2022 in San Diego where he generously helped as an organizer. It was great to see him again, and I look forward to learning more about Neo4j Graph Database! On the bright, sunny, second day of PyTexas, he invited me to be in this photo.

+

+Nick, Dan, Jason, Josh, me, Carol

+

It was a pleasure to get a snapshot next to my incredible friend Carol Willing. She had given an amazing keynote that morning. It is a must watch! I was also standing next to Josh Cannon who read the very clever Oh the (Methods) You Can (Make) book by Dunder Seuss.

+

All of the videos are available on the PyTexas Youtube channel.

+
+
+
+

May

+
+

Gym

+

Last year, I’d never been in a gym before and was afraid to go. My friend DeAnna Troutman Anaya talked me into getting started.

+

A few years ago, she found out that she was on her way to having debilitating illness. She was able to avoid it by getting fit. She regularly lifts weights and has an impressive physique. She is redefining what it means to be a grandmother.

+

When I started using an elliptical, I limited myself to ~70 steps per minute. Otherwise, I would get winded. Now, I am regularly up to 120+ steps per minute, and when life gets busy for a short time, and I don’t exercise regularly, I am able to get back to my top performance within just a few sessions. I would love to know the science behind it.

+

+One day too many

+

I returned to the gym regularly on May 2nd and added light weight lifting. In combination with aerobic activity, I’ve read that weight lifting has a number of benefits as we age: bone density, muscle mass, coordination and balance, general health.

+

By June 1st, I’d already had a personal best on the elliptical and broke that record many times over throughout the year.

+

+ +

+Gym rat :)

+

A chef friend Sheldon also encouraged me to get a personal trainer, which I have not done (yet). It has been life-changing for him in his life and work.

+
+
+

DjangoCon US Featured Post

+

I was featured on DjangoCon US social media accounts, along with current Django Fellow Natalia Bidart and former and current DEFNA Board Members Drew Winstel, Tim Schilling, and Koji Idressa.

+

+
+
+

PyCon US 2024

+

PyCon US 2024 took place from May 15-23 in Pittsburgh, Pennsylvania.

+

Thank you to Bernat Gabor for encouraging me to go! It was extremely worth it.

+

After the conference, I did some “heavy lifting” from conference connections made. A few examples:

+
    +
  • Based on a conversation with Black Python Devs Founder K. Jay Miller, I liased with DEFNA to further the interests of Black Python Devs at DjangoCon US 2024

  • +
  • Based on a conversation with PyTexas Chair Mason Egger, I made PyTexas sponsorship pitches to interested parties

  • +
  • Based on a conversation with Quansight Labs Co-director Tania Allard, I attempted to rekindle a prospective open source process within my network

  • +
+
+
+
+

June

+
+

PyCon US 2024 Recap

+

I wrote a deep dive of my PyCon US 2024 experience.

+

As my recap reflects, as far as talks go, I was particularly interested in major new developments around free-threading, per GIL subinterpreters, and JIT compilation.

+

Not long after I posted my PyCon US 2024 Recap on social media, I got a rave review from Kenneth Reitz, PSF Fellow and author of Requests Python package (#5 for PyPI downloads, over 10,500,00 downloads/day, depended on by over 2,900,000 repos).

+

Unbeknownst to me, Neil Stoker, Senior Director of Ratings AI at Fitch Ratings, had submitted the recap to Hacker News.

+

He tweeted to me that it was trending there. It had reached #2!

+

+#2 on Hacker News… so close to #1. Beaten out by Tim Bray’s sofa parable, lol

+

+#2 for nearly an hour

+

+On the “front page” for about 12 hours

+

It eventually reached 186 points and 91 comments

+

While the recaps I have written of smaller Python/Django conferences have been widely shared in their own right, I believe that the universal appeal of PyCon US drove the massive popularity of this post.

+

The new Python Release Manager Hugo van Kemenade whom I had the pleasure of meeting at the conference included my recap as the must read recap in his conference recap roundup.

+

Validation of my work among the world’s leading Python practitioners and global community means a lot to me.

+

It was also featured in Django News Newsletter and pip Trends Newsletter.

+

+Thank you to the incredible Lacey for this sweet kudo! Can’t wait to see you. :)

+ +
+
+

DFW Pythoneers

+

After months of good intentions, I finally committed to attending DFW Pythoneers meetup. It was a great time! I got to see Kevin Horn for the third time in two months and Broadus Jones for the second time in two months. :)

+

I really enjoyed Jim Vogel’s talk about Pydantic, MongoDB, Beanie, and FastAPI.

+
+
+

Summer Fun for My Nieces

+

In keeping with my plan to do more random, fun things for my nieces, I asked my sister what I could buy them for summer.

+

Based on her suggestion, I bought them:

+
    +
  • Four X-Shot fast-fill water blasters

  • +
  • 24 reusable, magnetic, fast-fill water balloons

  • +
+
+
+

Innovation Week Global Hackathon

+

It was an amazing Innovation Week at JPMorganChase. I attended presentations Monday, Tuesday, and Wednesday, then finished the week off by participating in the Global Hackathon for the second year in a row.

+

My first project fell through. Feeling disheartened, Wednesday night, I looked through the projects again and saw a new one that was highly relevant to my work in the Databases Department. I reached out to the team and joined. It felt meant to be. My team was inspiring! I learned a lot and made some new friends.

+

+Here I am with my Plano-based hackathon teammates.

+
+
+
+

July

+
+

Wellness Screening

+

Throughout July, August, and September, I took advantage of JPMorganChase employee health and finance benefits.

+

JPMorganChase has an employee wellness program. Employees can complete wellness activities to earn money for their MRA (Medical Reimbursement Account) and lower their medical payroll costs. One of the activities is a wellness screening. During the screening, your blood pressure and body mass index (BMI) are calculated, and a fingerstick is used to calculate your blood sugar, cholesterol and triglycerides.

+

I had my first wellness screening in November, 2023. I found out that both my good cholesterol and bad cholesterol were high.

+

I made a few changes in my diet. By my second wellness screening in early July, my bad cholesterol had gone down 22 points.

+
+
+
+

August

+
+

Financial Advisor

+

Using employee financial services benefits, I began working with a JPMorganChase personal advisor and private banker.

+

What I learned from them has helped me understand the larger picture better, create a longterm financial strategy across all of my assets, and better leverage employee benefits.

+

I also conveniently paid off my student loans.

+

+
+
+
+

September

+
+

Preventative Care

+

Continuing with my wellness activities, I completed a full physical, mammogram, colon cancer screening, and got up-to-date with my vaccinations.

+
+
+

DjangoCon US

+ +
+
+
+

October

+
+
+

November

+ +
+
+

December

+
+
+

Parting Thoughts

+

Thank you to each and everyone one of you, and there are many, who made my year special.

+

+

These are the “good old days.” Live your best life.

+

+Me at PyCon US

+
+
+

Favorite Snapshots Throughout The Year

+ +
+

JPMorganChase Plano Chinese Lunar New Year Celebration

+

+Parade

+

+Cultural attire

+ + +
+
+

Tanganyka Wildlife Park

+

+Mom turning the tables on me at Tanganyka

+ +
+
+

Clouds

+

+Clouds in Legacy

+
+
+

McClaren Sports Cars

+

McLaren Financial Services had an event at JPMC and brought in two McLaren cars. That is me standing with ~$750k worth of car.

+

+A “lower-end” Artura

+

+Me with the Artura

+

+A 750S, the equivalent of an F1 car

+
+
+

Yoshi Shabu Shabu

+

+Japanese hotpot with tonkotsu, pork belly, ramen, and goma sesame peanut, citrus ponzu, and roasted garlic teriyaki sauces

+

+Mango sake

+
+
+

T Swirl Japanese Crepe

+

+Strawberry banana crepe: sliced strawberries, sliced bananas, custard cream, whipped yogurt, chocolate pearls, crushed pistachios

+ +
+
+

Luci’s Bakery

+

+Venezuelan chicken empanada, rice, black beans, fried plantains

+
+
+

Pic with Julie

+

+Me and my wonderful co-worker Julie

+
+
+

Darna Mediterranean Eatery

+ +

+Saffron chicken kebab and mocktail mojito with strawberry flavor

+
+
+

Employee Appreciation Week

+

+Me with Dallas Mavs and Frisco RoughRiders mascots at the Employeer Appreciation Week street party

+

+Me lounging in a floating Chase logo… 3D street art by Jan Riggins

+

+Me overtaking a longhorn

+

+Me sitting next to a life-size thank you memo

+
+
+
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/_images/1.jpg b/_images/1.jpg new file mode 100644 index 00000000..6909b7ea Binary files /dev/null and b/_images/1.jpg differ diff --git a/_images/10.jpg b/_images/10.jpg new file mode 100644 index 00000000..dd8de225 Binary files /dev/null and b/_images/10.jpg differ diff --git a/_images/11.jpg b/_images/11.jpg new file mode 100644 index 00000000..70d5d936 Binary files /dev/null and b/_images/11.jpg differ diff --git a/_images/12.jpg b/_images/12.jpg new file mode 100644 index 00000000..e67e8d31 Binary files /dev/null and b/_images/12.jpg differ diff --git a/_images/13.jpg b/_images/13.jpg new file mode 100644 index 00000000..effa9e0d Binary files /dev/null and b/_images/13.jpg differ diff --git a/_images/14.jpg b/_images/14.jpg new file mode 100644 index 00000000..9af552c6 Binary files /dev/null and b/_images/14.jpg differ diff --git a/_images/15.jpg b/_images/15.jpg new file mode 100644 index 00000000..d24b7b0d Binary files /dev/null and b/_images/15.jpg differ diff --git a/_images/16.jpg b/_images/16.jpg new file mode 100644 index 00000000..32cc43e0 Binary files /dev/null and b/_images/16.jpg differ diff --git a/_images/17.jpg b/_images/17.jpg new file mode 100644 index 00000000..90ba5683 Binary files /dev/null and b/_images/17.jpg differ diff --git a/_images/18.jpg b/_images/18.jpg new file mode 100644 index 00000000..64b0e070 Binary files /dev/null and b/_images/18.jpg differ diff --git a/_images/19.jpg b/_images/19.jpg new file mode 100644 index 00000000..3670b0d7 Binary files /dev/null and b/_images/19.jpg differ diff --git a/_images/2.jpg b/_images/2.jpg new file mode 100644 index 00000000..7bfd435b Binary files /dev/null and b/_images/2.jpg differ diff --git a/_images/20.jpg b/_images/20.jpg new file mode 100644 index 00000000..f2798d60 Binary files /dev/null and b/_images/20.jpg differ diff --git a/_images/21.jpg b/_images/21.jpg new file mode 100644 index 00000000..4f257e81 Binary files /dev/null and b/_images/21.jpg differ diff --git a/_images/21c-museum-hotel-bank-vault-entry.jpg b/_images/21c-museum-hotel-bank-vault-entry.jpg new file mode 100644 index 00000000..27f50987 Binary files /dev/null and b/_images/21c-museum-hotel-bank-vault-entry.jpg differ diff --git a/_images/21c-museum-hotel-bank-vault-first-room.jpg b/_images/21c-museum-hotel-bank-vault-first-room.jpg new file mode 100644 index 00000000..7f0b9b61 Binary files /dev/null and b/_images/21c-museum-hotel-bank-vault-first-room.jpg differ diff --git a/_images/21c-museum-hotel-bank-vault-inner-room.jpg b/_images/21c-museum-hotel-bank-vault-inner-room.jpg new file mode 100644 index 00000000..e8300cc9 Binary files /dev/null and b/_images/21c-museum-hotel-bank-vault-inner-room.jpg differ diff --git a/_images/21c-museum-hotel-bathroom.jpg b/_images/21c-museum-hotel-bathroom.jpg new file mode 100644 index 00000000..b0aa26e7 Binary files /dev/null and b/_images/21c-museum-hotel-bathroom.jpg differ diff --git a/_images/21c-museum-hotel-dessert.jpg b/_images/21c-museum-hotel-dessert.jpg new file mode 100644 index 00000000..6c9cc4b1 Binary files /dev/null and b/_images/21c-museum-hotel-dessert.jpg differ diff --git a/_images/21c-museum-hotel-oysters.jpg b/_images/21c-museum-hotel-oysters.jpg new file mode 100644 index 00000000..15054795 Binary files /dev/null and b/_images/21c-museum-hotel-oysters.jpg differ diff --git a/_images/21c-museum-hotel-scallops.jpg b/_images/21c-museum-hotel-scallops.jpg new file mode 100644 index 00000000..f692971c Binary files /dev/null and b/_images/21c-museum-hotel-scallops.jpg differ diff --git a/_images/21c-museum-hotel-trout-dip.jpg b/_images/21c-museum-hotel-trout-dip.jpg new file mode 100644 index 00000000..6b04d01b Binary files /dev/null and b/_images/21c-museum-hotel-trout-dip.jpg differ diff --git a/_images/22.jpg b/_images/22.jpg new file mode 100644 index 00000000..5d58f1aa Binary files /dev/null and b/_images/22.jpg differ diff --git a/_images/23.jpg b/_images/23.jpg new file mode 100644 index 00000000..de949368 Binary files /dev/null and b/_images/23.jpg differ diff --git a/_images/24.jpg b/_images/24.jpg new file mode 100644 index 00000000..0ef31b5e Binary files /dev/null and b/_images/24.jpg differ diff --git a/_images/25.jpg b/_images/25.jpg new file mode 100644 index 00000000..39330bc8 Binary files /dev/null and b/_images/25.jpg differ diff --git a/_images/3.jpg b/_images/3.jpg new file mode 100644 index 00000000..694510d4 Binary files /dev/null and b/_images/3.jpg differ diff --git a/_images/4.jpg b/_images/4.jpg new file mode 100644 index 00000000..e3d41d34 Binary files /dev/null and b/_images/4.jpg differ diff --git a/_images/5.jpg b/_images/5.jpg new file mode 100644 index 00000000..b8cdd3c9 Binary files /dev/null and b/_images/5.jpg differ diff --git a/_images/6.jpg b/_images/6.jpg new file mode 100644 index 00000000..31717be6 Binary files /dev/null and b/_images/6.jpg differ diff --git a/_images/7.jpg b/_images/7.jpg new file mode 100644 index 00000000..5947094a Binary files /dev/null and b/_images/7.jpg differ diff --git a/_images/8.jpg b/_images/8.jpg new file mode 100644 index 00000000..11fd229f Binary files /dev/null and b/_images/8.jpg differ diff --git a/_images/9.jpg b/_images/9.jpg new file mode 100644 index 00000000..f588648d Binary files /dev/null and b/_images/9.jpg differ diff --git a/_images/academy-museum-alien.jpg b/_images/academy-museum-alien.jpg new file mode 100644 index 00000000..c06033de Binary files /dev/null and b/_images/academy-museum-alien.jpg differ diff --git a/_images/academy-museum-godfather-office.jpg b/_images/academy-museum-godfather-office.jpg new file mode 100644 index 00000000..e6fb5226 Binary files /dev/null and b/_images/academy-museum-godfather-office.jpg differ diff --git a/_images/academy-museum-horse-head.jpg b/_images/academy-museum-horse-head.jpg new file mode 100644 index 00000000..5bc5a33f Binary files /dev/null and b/_images/academy-museum-horse-head.jpg differ diff --git a/_images/academy-museum-statue-room.jpg b/_images/academy-museum-statue-room.jpg new file mode 100644 index 00000000..a674b8ee Binary files /dev/null and b/_images/academy-museum-statue-room.jpg differ diff --git a/_images/academy-museum-terminator.jpg b/_images/academy-museum-terminator.jpg new file mode 100644 index 00000000..96c0595f Binary files /dev/null and b/_images/academy-museum-terminator.jpg differ diff --git a/_images/academy-museum-the-dark-crystal-skeksis.jpg b/_images/academy-museum-the-dark-crystal-skeksis.jpg new file mode 100644 index 00000000..b0478756 Binary files /dev/null and b/_images/academy-museum-the-dark-crystal-skeksis.jpg differ diff --git a/_images/advantage-360.jpg b/_images/advantage-360.jpg new file mode 100644 index 00000000..acf82630 Binary files /dev/null and b/_images/advantage-360.jpg differ diff --git a/_images/alfred-hitchcock-star.jpg b/_images/alfred-hitchcock-star.jpg new file mode 100644 index 00000000..d6337852 Binary files /dev/null and b/_images/alfred-hitchcock-star.jpg differ diff --git a/_images/allegheny-river-bridge.jpg b/_images/allegheny-river-bridge.jpg new file mode 100644 index 00000000..f697a3e7 Binary files /dev/null and b/_images/allegheny-river-bridge.jpg differ diff --git a/_images/amber-brown.jpg b/_images/amber-brown.jpg new file mode 100644 index 00000000..dcb2269f Binary files /dev/null and b/_images/amber-brown.jpg differ diff --git a/_images/andy-bulldoggy-app-architecture.png b/_images/andy-bulldoggy-app-architecture.png new file mode 100644 index 00000000..07afc868 Binary files /dev/null and b/_images/andy-bulldoggy-app-architecture.png differ diff --git a/_images/andy-modern-testing-goals.png b/_images/andy-modern-testing-goals.png new file mode 100644 index 00000000..dd5250ac Binary files /dev/null and b/_images/andy-modern-testing-goals.png differ diff --git a/_images/andy-test-modern-web-apps.png b/_images/andy-test-modern-web-apps.png new file mode 100644 index 00000000..e381dee7 Binary files /dev/null and b/_images/andy-test-modern-web-apps.png differ diff --git a/_images/andy-test-pyramid-scheme.png b/_images/andy-test-pyramid-scheme.png new file mode 100644 index 00000000..44a4bbff Binary files /dev/null and b/_images/andy-test-pyramid-scheme.png differ diff --git a/_images/andy-testing-challenges.png b/_images/andy-testing-challenges.png new file mode 100644 index 00000000..ecd07189 Binary files /dev/null and b/_images/andy-testing-challenges.png differ diff --git a/_images/andy-tools-for-black-box-testing.png b/_images/andy-tools-for-black-box-testing.png new file mode 100644 index 00000000..12ef381a Binary files /dev/null and b/_images/andy-tools-for-black-box-testing.png differ diff --git a/_images/andy-warhol-museum.jpg b/_images/andy-warhol-museum.jpg new file mode 100644 index 00000000..c32e3e2a Binary files /dev/null and b/_images/andy-warhol-museum.jpg differ diff --git a/_images/andy-web-test-automation-tool-comparison.png b/_images/andy-web-test-automation-tool-comparison.png new file mode 100644 index 00000000..32481b54 Binary files /dev/null and b/_images/andy-web-test-automation-tool-comparison.png differ diff --git a/_images/andy.jpg b/_images/andy.jpg new file mode 100644 index 00000000..94e3251b Binary files /dev/null and b/_images/andy.jpg differ diff --git a/_images/another-high-level.png b/_images/another-high-level.png new file mode 100644 index 00000000..e89ad312 Binary files /dev/null and b/_images/another-high-level.png differ diff --git a/_images/anthony-gil-removal-steps.png b/_images/anthony-gil-removal-steps.png new file mode 100644 index 00000000..02c1d726 Binary files /dev/null and b/_images/anthony-gil-removal-steps.png differ diff --git a/_images/anthony-parallel-execution-in-python.png b/_images/anthony-parallel-execution-in-python.png new file mode 100644 index 00000000..7ce782cc Binary files /dev/null and b/_images/anthony-parallel-execution-in-python.png differ diff --git a/_images/anthony-speed-differences.png b/_images/anthony-speed-differences.png new file mode 100644 index 00000000..0f2c9195 Binary files /dev/null and b/_images/anthony-speed-differences.png differ diff --git a/_images/anthony-terms-and-conditions.png b/_images/anthony-terms-and-conditions.png new file mode 100644 index 00000000..0021b15d Binary files /dev/null and b/_images/anthony-terms-and-conditions.png differ diff --git a/_images/aoc-presentation.jpg b/_images/aoc-presentation.jpg new file mode 100644 index 00000000..54f2b5a2 Binary files /dev/null and b/_images/aoc-presentation.jpg differ diff --git a/_images/arriving.jpg b/_images/arriving.jpg new file mode 100644 index 00000000..a02620c6 Binary files /dev/null and b/_images/arriving.jpg differ diff --git a/_images/as-usual.png b/_images/as-usual.png new file mode 100644 index 00000000..81bdb28c Binary files /dev/null and b/_images/as-usual.png differ diff --git a/_images/attendee-photo.jpg b/_images/attendee-photo.jpg new file mode 100644 index 00000000..02dfb445 Binary files /dev/null and b/_images/attendee-photo.jpg differ diff --git a/_images/attendees-photo.jpg b/_images/attendees-photo.jpg new file mode 100644 index 00000000..31bdf615 Binary files /dev/null and b/_images/attendees-photo.jpg differ diff --git a/_images/badge.jpg b/_images/badge.jpg new file mode 100644 index 00000000..68a171f4 Binary files /dev/null and b/_images/badge.jpg differ diff --git a/_images/badge1.jpg b/_images/badge1.jpg new file mode 100644 index 00000000..da6f4301 Binary files /dev/null and b/_images/badge1.jpg differ diff --git a/_images/bamboo-house-1.jpg b/_images/bamboo-house-1.jpg new file mode 100644 index 00000000..39d0452c Binary files /dev/null and b/_images/bamboo-house-1.jpg differ diff --git a/_images/bamboo-house-2.jpg b/_images/bamboo-house-2.jpg new file mode 100644 index 00000000..92d16e4b Binary files /dev/null and b/_images/bamboo-house-2.jpg differ diff --git a/_images/better-times.jpg b/_images/better-times.jpg new file mode 100644 index 00000000..bacd13b0 Binary files /dev/null and b/_images/better-times.jpg differ diff --git a/_images/black-python-devs-31.png b/_images/black-python-devs-31.png new file mode 100644 index 00000000..16c1ff2f Binary files /dev/null and b/_images/black-python-devs-31.png differ diff --git a/_images/black-python-devs-durham.png b/_images/black-python-devs-durham.png new file mode 100644 index 00000000..36c8f216 Binary files /dev/null and b/_images/black-python-devs-durham.png differ diff --git a/_images/black-python-devs-summit-me-afi-velda.jpg b/_images/black-python-devs-summit-me-afi-velda.jpg new file mode 100644 index 00000000..638ff461 Binary files /dev/null and b/_images/black-python-devs-summit-me-afi-velda.jpg differ diff --git a/_images/black-python-devs-summit-panel.jpg b/_images/black-python-devs-summit-panel.jpg new file mode 100644 index 00000000..0c403a22 Binary files /dev/null and b/_images/black-python-devs-summit-panel.jpg differ diff --git a/_images/blue-daisy-breakfast.jpg b/_images/blue-daisy-breakfast.jpg new file mode 100644 index 00000000..54462c88 Binary files /dev/null and b/_images/blue-daisy-breakfast.jpg differ diff --git a/_images/blue-daisy-latte.jpg b/_images/blue-daisy-latte.jpg new file mode 100644 index 00000000..c3e916f8 Binary files /dev/null and b/_images/blue-daisy-latte.jpg differ diff --git a/_images/boxcar-arcade-super-pac-man.jpg b/_images/boxcar-arcade-super-pac-man.jpg new file mode 100644 index 00000000..b6844cf9 Binary files /dev/null and b/_images/boxcar-arcade-super-pac-man.jpg differ diff --git a/_images/boxcar-arcade.jpg b/_images/boxcar-arcade.jpg new file mode 100644 index 00000000..8e877f72 Binary files /dev/null and b/_images/boxcar-arcade.jpg differ diff --git a/_images/brasao-1.jpg b/_images/brasao-1.jpg new file mode 100644 index 00000000..e35faac2 Binary files /dev/null and b/_images/brasao-1.jpg differ diff --git a/_images/brasao-2.jpg b/_images/brasao-2.jpg new file mode 100644 index 00000000..9aa75c40 Binary files /dev/null and b/_images/brasao-2.jpg differ diff --git a/_images/brasao-3.jpg b/_images/brasao-3.jpg new file mode 100644 index 00000000..8d0ee26a Binary files /dev/null and b/_images/brasao-3.jpg differ diff --git a/_images/brasao-4.jpg b/_images/brasao-4.jpg new file mode 100644 index 00000000..f6df6266 Binary files /dev/null and b/_images/brasao-4.jpg differ diff --git a/_images/brunos-night-1.jpg b/_images/brunos-night-1.jpg new file mode 100644 index 00000000..8326f5aa Binary files /dev/null and b/_images/brunos-night-1.jpg differ diff --git a/_images/brunos-night-2.jpg b/_images/brunos-night-2.jpg new file mode 100644 index 00000000..ecc21550 Binary files /dev/null and b/_images/brunos-night-2.jpg differ diff --git a/_images/butterfly.jpg b/_images/butterfly.jpg new file mode 100644 index 00000000..5ad96ff4 Binary files /dev/null and b/_images/butterfly.jpg differ diff --git a/_images/bye-la.jpg b/_images/bye-la.jpg new file mode 100644 index 00000000..5a5ecc3d Binary files /dev/null and b/_images/bye-la.jpg differ diff --git a/_images/carlton-gibson-and-sprinters.jpg b/_images/carlton-gibson-and-sprinters.jpg new file mode 100644 index 00000000..14001d77 Binary files /dev/null and b/_images/carlton-gibson-and-sprinters.jpg differ diff --git a/_images/carlton-gibson.jpg b/_images/carlton-gibson.jpg new file mode 100644 index 00000000..b6861054 Binary files /dev/null and b/_images/carlton-gibson.jpg differ diff --git a/_images/celebration.jpg b/_images/celebration.jpg new file mode 100644 index 00000000..d53642f4 Binary files /dev/null and b/_images/celebration.jpg differ diff --git a/_images/celebrity-home-bus-tour-leonardo-dicaprio.jpg b/_images/celebrity-home-bus-tour-leonardo-dicaprio.jpg new file mode 100644 index 00000000..ff557fa8 Binary files /dev/null and b/_images/celebrity-home-bus-tour-leonardo-dicaprio.jpg differ diff --git a/_images/celebrity-homes-bus-tour-dior.jpg b/_images/celebrity-homes-bus-tour-dior.jpg new file mode 100644 index 00000000..89c6794c Binary files /dev/null and b/_images/celebrity-homes-bus-tour-dior.jpg differ diff --git a/_images/celebrity-homes-bus-tour-jack-nicholson-home.jpg b/_images/celebrity-homes-bus-tour-jack-nicholson-home.jpg new file mode 100644 index 00000000..bf9456a3 Binary files /dev/null and b/_images/celebrity-homes-bus-tour-jack-nicholson-home.jpg differ diff --git a/_images/celebrity-homes-bus-tour-mark.jpg b/_images/celebrity-homes-bus-tour-mark.jpg new file mode 100644 index 00000000..c16999e2 Binary files /dev/null and b/_images/celebrity-homes-bus-tour-mark.jpg differ diff --git a/_images/celebrity-homes-bus-tour-pretty-woman-balcony.jpg b/_images/celebrity-homes-bus-tour-pretty-woman-balcony.jpg new file mode 100644 index 00000000..c75b225a Binary files /dev/null and b/_images/celebrity-homes-bus-tour-pretty-woman-balcony.jpg differ diff --git a/_images/chartreuse-tea.jpg b/_images/chartreuse-tea.jpg new file mode 100644 index 00000000..ad3b8cbe Binary files /dev/null and b/_images/chartreuse-tea.jpg differ diff --git a/_images/chocolate-bar.jpg b/_images/chocolate-bar.jpg new file mode 100644 index 00000000..9da4070f Binary files /dev/null and b/_images/chocolate-bar.jpg differ diff --git a/_images/chocolate-open-space.jpg b/_images/chocolate-open-space.jpg new file mode 100644 index 00000000..ff62deb2 Binary files /dev/null and b/_images/chocolate-open-space.jpg differ diff --git a/_images/chris-components-of-elevated-experience.png b/_images/chris-components-of-elevated-experience.png new file mode 100644 index 00000000..8b9175bd Binary files /dev/null and b/_images/chris-components-of-elevated-experience.png differ diff --git a/_images/chris-demo-1.png b/_images/chris-demo-1.png new file mode 100644 index 00000000..ac654216 Binary files /dev/null and b/_images/chris-demo-1.png differ diff --git a/_images/chris-demo-2.png b/_images/chris-demo-2.png new file mode 100644 index 00000000..c3e9c8ac Binary files /dev/null and b/_images/chris-demo-2.png differ diff --git a/_images/chris-developer-experience-boost.png b/_images/chris-developer-experience-boost.png new file mode 100644 index 00000000..6f71fc69 Binary files /dev/null and b/_images/chris-developer-experience-boost.png differ diff --git a/_images/chris-exceptional-experiences.png b/_images/chris-exceptional-experiences.png new file mode 100644 index 00000000..37e1fa2e Binary files /dev/null and b/_images/chris-exceptional-experiences.png differ diff --git a/_images/chris-experience-drove-spa-popularity.png b/_images/chris-experience-drove-spa-popularity.png new file mode 100644 index 00000000..a322b063 Binary files /dev/null and b/_images/chris-experience-drove-spa-popularity.png differ diff --git a/_images/chris-how-the-frontend-is-coping.png b/_images/chris-how-the-frontend-is-coping.png new file mode 100644 index 00000000..54a1c462 Binary files /dev/null and b/_images/chris-how-the-frontend-is-coping.png differ diff --git a/_images/chris-option-1.png b/_images/chris-option-1.png new file mode 100644 index 00000000..942434f4 Binary files /dev/null and b/_images/chris-option-1.png differ diff --git a/_images/chris-option-2.png b/_images/chris-option-2.png new file mode 100644 index 00000000..1937ec59 Binary files /dev/null and b/_images/chris-option-2.png differ diff --git a/_images/chris-spa-thoughtworks.png b/_images/chris-spa-thoughtworks.png new file mode 100644 index 00000000..8d457f48 Binary files /dev/null and b/_images/chris-spa-thoughtworks.png differ diff --git a/_images/chris-spas.png b/_images/chris-spas.png new file mode 100644 index 00000000..192ae4b9 Binary files /dev/null and b/_images/chris-spas.png differ diff --git a/_images/chris-specrum.png b/_images/chris-specrum.png new file mode 100644 index 00000000..dc502c53 Binary files /dev/null and b/_images/chris-specrum.png differ diff --git a/_images/chris-streamed-html-components.png b/_images/chris-streamed-html-components.png new file mode 100644 index 00000000..425c5702 Binary files /dev/null and b/_images/chris-streamed-html-components.png differ diff --git a/_images/chris-when-spas-could-be-worth-their-weight.png b/_images/chris-when-spas-could-be-worth-their-weight.png new file mode 100644 index 00000000..bb23f586 Binary files /dev/null and b/_images/chris-when-spas-could-be-worth-their-weight.png differ diff --git a/_images/christmas-party-presentation-1.jpg b/_images/christmas-party-presentation-1.jpg new file mode 100644 index 00000000..7071d1e7 Binary files /dev/null and b/_images/christmas-party-presentation-1.jpg differ diff --git a/_images/christmas-party-presentation-2.jpg b/_images/christmas-party-presentation-2.jpg new file mode 100644 index 00000000..2908b341 Binary files /dev/null and b/_images/christmas-party-presentation-2.jpg differ diff --git a/_images/christopher-ddt-other-uses.png b/_images/christopher-ddt-other-uses.png new file mode 100644 index 00000000..8633d16e Binary files /dev/null and b/_images/christopher-ddt-other-uses.png differ diff --git a/_images/city-hall-banquet-room.jpg b/_images/city-hall-banquet-room.jpg new file mode 100644 index 00000000..0b0ed4f6 Binary files /dev/null and b/_images/city-hall-banquet-room.jpg differ diff --git a/_images/city-hall-building.jpg b/_images/city-hall-building.jpg new file mode 100644 index 00000000..dcfe6d4b Binary files /dev/null and b/_images/city-hall-building.jpg differ diff --git a/_images/city-hall-observation-deck-view-explainer.jpg b/_images/city-hall-observation-deck-view-explainer.jpg new file mode 100644 index 00000000..f6de9261 Binary files /dev/null and b/_images/city-hall-observation-deck-view-explainer.jpg differ diff --git a/_images/city-hall-observation-deck-view.jpg b/_images/city-hall-observation-deck-view.jpg new file mode 100644 index 00000000..b065b980 Binary files /dev/null and b/_images/city-hall-observation-deck-view.jpg differ diff --git a/_images/city-hall-riding-in-style.jpg b/_images/city-hall-riding-in-style.jpg new file mode 100644 index 00000000..b901cf60 Binary files /dev/null and b/_images/city-hall-riding-in-style.jpg differ diff --git a/_images/city-page.png b/_images/city-page.png new file mode 100644 index 00000000..9c04a8b0 Binary files /dev/null and b/_images/city-page.png differ diff --git a/_images/cleveland-sign.jpg b/_images/cleveland-sign.jpg new file mode 100644 index 00000000..34079916 Binary files /dev/null and b/_images/cleveland-sign.jpg differ diff --git a/_images/closing-panel.jpg b/_images/closing-panel.jpg new file mode 100644 index 00000000..2af226d9 Binary files /dev/null and b/_images/closing-panel.jpg differ diff --git a/_images/clouds.jpg b/_images/clouds.jpg new file mode 100644 index 00000000..786f4e12 Binary files /dev/null and b/_images/clouds.jpg differ diff --git a/_images/cocoa-cinnamon-coffee.jpg b/_images/cocoa-cinnamon-coffee.jpg new file mode 100644 index 00000000..da47eadf Binary files /dev/null and b/_images/cocoa-cinnamon-coffee.jpg differ diff --git a/_images/cocoa-cinnamon-dr-durham.jpg b/_images/cocoa-cinnamon-dr-durham.jpg new file mode 100644 index 00000000..4beea768 Binary files /dev/null and b/_images/cocoa-cinnamon-dr-durham.jpg differ diff --git a/_images/cocoa-cinnamon.jpg b/_images/cocoa-cinnamon.jpg new file mode 100644 index 00000000..46ac18ef Binary files /dev/null and b/_images/cocoa-cinnamon.jpg differ diff --git a/_images/cocoa-cinnamon1.jpg b/_images/cocoa-cinnamon1.jpg new file mode 100644 index 00000000..c2dc35ed Binary files /dev/null and b/_images/cocoa-cinnamon1.jpg differ diff --git a/_images/coherence-demo.jpg b/_images/coherence-demo.jpg new file mode 100644 index 00000000..9d05d246 Binary files /dev/null and b/_images/coherence-demo.jpg differ diff --git a/_images/coherence-table.jpg b/_images/coherence-table.jpg new file mode 100644 index 00000000..1f5c1026 Binary files /dev/null and b/_images/coherence-table.jpg differ diff --git a/_images/comedy-show.jpg b/_images/comedy-show.jpg new file mode 100644 index 00000000..fd393964 Binary files /dev/null and b/_images/comedy-show.jpg differ diff --git a/_images/conference-attendees.jpg b/_images/conference-attendees.jpg new file mode 100644 index 00000000..f2d851ef Binary files /dev/null and b/_images/conference-attendees.jpg differ diff --git a/_images/couldn't-resist.png b/_images/couldn't-resist.png new file mode 100644 index 00000000..45b50546 Binary files /dev/null and b/_images/couldn't-resist.png differ diff --git a/_images/course-milestone.png b/_images/course-milestone.png new file mode 100644 index 00000000..1a8121c6 Binary files /dev/null and b/_images/course-milestone.png differ diff --git a/_images/cousins-maine-lobster.jpg b/_images/cousins-maine-lobster.jpg new file mode 100644 index 00000000..17009ae1 Binary files /dev/null and b/_images/cousins-maine-lobster.jpg differ diff --git a/_images/coverage-report.png b/_images/coverage-report.png new file mode 100644 index 00000000..9ce65fde Binary files /dev/null and b/_images/coverage-report.png differ diff --git a/_images/crepe.jpg b/_images/crepe.jpg new file mode 100644 index 00000000..a8f359b4 Binary files /dev/null and b/_images/crepe.jpg differ diff --git a/_images/cubo.jpg b/_images/cubo.jpg new file mode 100644 index 00000000..ae178cb1 Binary files /dev/null and b/_images/cubo.jpg differ diff --git a/_images/cultural-attire.jpg b/_images/cultural-attire.jpg new file mode 100644 index 00000000..db2b0bc0 Binary files /dev/null and b/_images/cultural-attire.jpg differ diff --git a/_images/david-l-lawrence-convention-center-rooftop-terrace.jpg b/_images/david-l-lawrence-convention-center-rooftop-terrace.jpg new file mode 100644 index 00000000..293047ca Binary files /dev/null and b/_images/david-l-lawrence-convention-center-rooftop-terrace.jpg differ diff --git a/_images/dawn-and-rachell.jpg b/_images/dawn-and-rachell.jpg new file mode 100644 index 00000000..be7f751b Binary files /dev/null and b/_images/dawn-and-rachell.jpg differ diff --git a/_images/deep-dive-day.jpg b/_images/deep-dive-day.jpg new file mode 100644 index 00000000..e694fee2 Binary files /dev/null and b/_images/deep-dive-day.jpg differ diff --git a/_images/defna-and-pycon-charlas.png b/_images/defna-and-pycon-charlas.png new file mode 100644 index 00000000..e3f4ed2c Binary files /dev/null and b/_images/defna-and-pycon-charlas.png differ diff --git a/_images/defna-board.jpg b/_images/defna-board.jpg new file mode 100644 index 00000000..fc9996af Binary files /dev/null and b/_images/defna-board.jpg differ diff --git a/_images/defna-board1.jpg b/_images/defna-board1.jpg new file mode 100644 index 00000000..91960e59 Binary files /dev/null and b/_images/defna-board1.jpg differ diff --git a/_images/defna-flowers.jpg b/_images/defna-flowers.jpg new file mode 100644 index 00000000..8a23df48 Binary files /dev/null and b/_images/defna-flowers.jpg differ diff --git a/_images/dev-ict-2017-speaker-photo.jpg b/_images/dev-ict-2017-speaker-photo.jpg new file mode 100644 index 00000000..beab931c Binary files /dev/null and b/_images/dev-ict-2017-speaker-photo.jpg differ diff --git a/_images/dinner-with-guido.jpg b/_images/dinner-with-guido.jpg new file mode 100644 index 00000000..6ecac727 Binary files /dev/null and b/_images/dinner-with-guido.jpg differ diff --git a/_images/discover-durham-box-2.jpg b/_images/discover-durham-box-2.jpg new file mode 100644 index 00000000..79e72627 Binary files /dev/null and b/_images/discover-durham-box-2.jpg differ diff --git a/_images/django-async.jpg b/_images/django-async.jpg new file mode 100644 index 00000000..392c3780 Binary files /dev/null and b/_images/django-async.jpg differ diff --git a/_images/django-girls-lunch.jpg b/_images/django-girls-lunch.jpg new file mode 100644 index 00000000..54784cf5 Binary files /dev/null and b/_images/django-girls-lunch.jpg differ diff --git a/_images/django-girls-shirts.jpg b/_images/django-girls-shirts.jpg new file mode 100644 index 00000000..7cea1a92 Binary files /dev/null and b/_images/django-girls-shirts.jpg differ diff --git a/_images/django-social.jpg b/_images/django-social.jpg new file mode 100644 index 00000000..e1a33398 Binary files /dev/null and b/_images/django-social.jpg differ diff --git a/_images/django-support-schedule.png b/_images/django-support-schedule.png new file mode 100644 index 00000000..90028d44 Binary files /dev/null and b/_images/django-support-schedule.png differ diff --git a/_images/djangocon-africa.jpg b/_images/djangocon-africa.jpg new file mode 100644 index 00000000..4afb0b36 Binary files /dev/null and b/_images/djangocon-africa.jpg differ diff --git a/_images/djangocon-us-2017-headshot-by-melanie-arbor.jpg b/_images/djangocon-us-2017-headshot-by-melanie-arbor.jpg new file mode 100644 index 00000000..c32ac54d Binary files /dev/null and b/_images/djangocon-us-2017-headshot-by-melanie-arbor.jpg differ diff --git a/_images/djangocon-us-2017-on-stage-2.jpg b/_images/djangocon-us-2017-on-stage-2.jpg new file mode 100644 index 00000000..9f2b30b9 Binary files /dev/null and b/_images/djangocon-us-2017-on-stage-2.jpg differ diff --git a/_images/djangocon-us-2017-on-stage.jpg b/_images/djangocon-us-2017-on-stage.jpg new file mode 100644 index 00000000..a102ddd1 Binary files /dev/null and b/_images/djangocon-us-2017-on-stage.jpg differ diff --git a/_images/djangocon-us-2017-on-stage1.jpg b/_images/djangocon-us-2017-on-stage1.jpg new file mode 100644 index 00000000..a102ddd1 Binary files /dev/null and b/_images/djangocon-us-2017-on-stage1.jpg differ diff --git a/_images/djangocon-us-2017-organizers-stage.jpg b/_images/djangocon-us-2017-organizers-stage.jpg new file mode 100644 index 00000000..537f6e7b Binary files /dev/null and b/_images/djangocon-us-2017-organizers-stage.jpg differ diff --git a/_images/djangocon-us-2017-speaker-photo.jpg b/_images/djangocon-us-2017-speaker-photo.jpg new file mode 100644 index 00000000..e87306b1 Binary files /dev/null and b/_images/djangocon-us-2017-speaker-photo.jpg differ diff --git a/_images/djangocon-us-2017-speaker-photo1.jpg b/_images/djangocon-us-2017-speaker-photo1.jpg new file mode 100644 index 00000000..e87306b1 Binary files /dev/null and b/_images/djangocon-us-2017-speaker-photo1.jpg differ diff --git a/_images/djangocon-us-2017-talk.jpg b/_images/djangocon-us-2017-talk.jpg new file mode 100644 index 00000000..a102ddd1 Binary files /dev/null and b/_images/djangocon-us-2017-talk.jpg differ diff --git a/_images/djangocon-us-2018-me.jpg b/_images/djangocon-us-2018-me.jpg new file mode 100644 index 00000000..c0852631 Binary files /dev/null and b/_images/djangocon-us-2018-me.jpg differ diff --git a/_images/djangocon-us-2018-meeting-betty-junod-at-docker-hq.jpg b/_images/djangocon-us-2018-meeting-betty-junod-at-docker-hq.jpg new file mode 100644 index 00000000..8e33e0b9 Binary files /dev/null and b/_images/djangocon-us-2018-meeting-betty-junod-at-docker-hq.jpg differ diff --git a/_images/djangocon-us-2018-meeting-jack-at-a-tweet-up.jpg b/_images/djangocon-us-2018-meeting-jack-at-a-tweet-up.jpg new file mode 100644 index 00000000..b93f8ddb Binary files /dev/null and b/_images/djangocon-us-2018-meeting-jack-at-a-tweet-up.jpg differ diff --git a/_images/djangocon-us-2018-organizers-outside.jpg b/_images/djangocon-us-2018-organizers-outside.jpg new file mode 100644 index 00000000..52aa3d62 Binary files /dev/null and b/_images/djangocon-us-2018-organizers-outside.jpg differ diff --git a/_images/djangocon-us-2018-organizers-stage-side.jpg b/_images/djangocon-us-2018-organizers-stage-side.jpg new file mode 100644 index 00000000..2ac527b2 Binary files /dev/null and b/_images/djangocon-us-2018-organizers-stage-side.jpg differ diff --git a/_images/djangocon-us-2018-organizers-stage.jpg b/_images/djangocon-us-2018-organizers-stage.jpg new file mode 100644 index 00000000..83dd6608 Binary files /dev/null and b/_images/djangocon-us-2018-organizers-stage.jpg differ diff --git a/_images/djangocon-us-2018-state-of-django-panel-crowd.jpg b/_images/djangocon-us-2018-state-of-django-panel-crowd.jpg new file mode 100644 index 00000000..de558778 Binary files /dev/null and b/_images/djangocon-us-2018-state-of-django-panel-crowd.jpg differ diff --git a/_images/djangocon-us-2018-state-of-django-panel-front.jpg b/_images/djangocon-us-2018-state-of-django-panel-front.jpg new file mode 100644 index 00000000..65b5e797 Binary files /dev/null and b/_images/djangocon-us-2018-state-of-django-panel-front.jpg differ diff --git a/_images/djangocon-us-2018-state-of-django-panel-me-speaking.jpg b/_images/djangocon-us-2018-state-of-django-panel-me-speaking.jpg new file mode 100644 index 00000000..ae666abb Binary files /dev/null and b/_images/djangocon-us-2018-state-of-django-panel-me-speaking.jpg differ diff --git a/_images/djangocon-us-2018-state-of-django-panel-me-speaking1.jpg b/_images/djangocon-us-2018-state-of-django-panel-me-speaking1.jpg new file mode 100644 index 00000000..ae666abb Binary files /dev/null and b/_images/djangocon-us-2018-state-of-django-panel-me-speaking1.jpg differ diff --git a/_images/djangocon-us-2018-state-of-django-panel-side.jpg b/_images/djangocon-us-2018-state-of-django-panel-side.jpg new file mode 100644 index 00000000..d7722350 Binary files /dev/null and b/_images/djangocon-us-2018-state-of-django-panel-side.jpg differ diff --git a/_images/djangocon-us-2019-me.jpg b/_images/djangocon-us-2019-me.jpg new file mode 100644 index 00000000..a9505972 Binary files /dev/null and b/_images/djangocon-us-2019-me.jpg differ diff --git a/_images/djangocon-us-2019-organizers-outside.jpg b/_images/djangocon-us-2019-organizers-outside.jpg new file mode 100644 index 00000000..2f2d04c8 Binary files /dev/null and b/_images/djangocon-us-2019-organizers-outside.jpg differ diff --git a/_images/djangocon-us-2019-organizers-stage.jpg b/_images/djangocon-us-2019-organizers-stage.jpg new file mode 100644 index 00000000..a1552123 Binary files /dev/null and b/_images/djangocon-us-2019-organizers-stage.jpg differ diff --git a/_images/djangocon-us-2019-with-ken-whitesell.jpg b/_images/djangocon-us-2019-with-ken-whitesell.jpg new file mode 100644 index 00000000..33e1ecfe Binary files /dev/null and b/_images/djangocon-us-2019-with-ken-whitesell.jpg differ diff --git a/_images/djangocon-us-2021-get-a-jumpstart-english.png b/_images/djangocon-us-2021-get-a-jumpstart-english.png new file mode 100644 index 00000000..938b5aa8 Binary files /dev/null and b/_images/djangocon-us-2021-get-a-jumpstart-english.png differ diff --git a/_images/djangocon-us-2021-get-a-jumpstart-english1.png b/_images/djangocon-us-2021-get-a-jumpstart-english1.png new file mode 100644 index 00000000..938b5aa8 Binary files /dev/null and b/_images/djangocon-us-2021-get-a-jumpstart-english1.png differ diff --git a/_images/djangocon-us-2021-get-a-jumpstart-spanish.png b/_images/djangocon-us-2021-get-a-jumpstart-spanish.png new file mode 100644 index 00000000..53fd865a Binary files /dev/null and b/_images/djangocon-us-2021-get-a-jumpstart-spanish.png differ diff --git a/_images/djangocon-us-2021-get-a-jumpstart-spanish1.png b/_images/djangocon-us-2021-get-a-jumpstart-spanish1.png new file mode 100644 index 00000000..53fd865a Binary files /dev/null and b/_images/djangocon-us-2021-get-a-jumpstart-spanish1.png differ diff --git a/_images/djangocon-us-2022-me-and-craig-bruce.jpg b/_images/djangocon-us-2022-me-and-craig-bruce.jpg new file mode 100644 index 00000000..d40f0d6d Binary files /dev/null and b/_images/djangocon-us-2022-me-and-craig-bruce.jpg differ diff --git a/_images/djangocon-us-2022-me-outside.jpg b/_images/djangocon-us-2022-me-outside.jpg new file mode 100644 index 00000000..eb1c7339 Binary files /dev/null and b/_images/djangocon-us-2022-me-outside.jpg differ diff --git a/_images/djangocon-us-2022-me-with-noah.jpg b/_images/djangocon-us-2022-me-with-noah.jpg new file mode 100644 index 00000000..3055ba0b Binary files /dev/null and b/_images/djangocon-us-2022-me-with-noah.jpg differ diff --git a/_images/djangocon-us-2022-organizers-outside.jpg b/_images/djangocon-us-2022-organizers-outside.jpg new file mode 100644 index 00000000..9e69701a Binary files /dev/null and b/_images/djangocon-us-2022-organizers-outside.jpg differ diff --git a/_images/djangocon-us-2022-organizers-stage.jpg b/_images/djangocon-us-2022-organizers-stage.jpg new file mode 100644 index 00000000..9df8c93e Binary files /dev/null and b/_images/djangocon-us-2022-organizers-stage.jpg differ diff --git a/_images/djangocon-us-2023-board-dinner.jpg b/_images/djangocon-us-2023-board-dinner.jpg new file mode 100644 index 00000000..a2775be3 Binary files /dev/null and b/_images/djangocon-us-2023-board-dinner.jpg differ diff --git a/_images/djangocon-us-2023-defna-board-outside.jpg b/_images/djangocon-us-2023-defna-board-outside.jpg new file mode 100644 index 00000000..67f6820b Binary files /dev/null and b/_images/djangocon-us-2023-defna-board-outside.jpg differ diff --git a/_images/djangocon-us-2023-hotel-table.jpg b/_images/djangocon-us-2023-hotel-table.jpg new file mode 100644 index 00000000..afb287df Binary files /dev/null and b/_images/djangocon-us-2023-hotel-table.jpg differ diff --git a/_images/djangocon-us-2023-me-and-abigail.jpg b/_images/djangocon-us-2023-me-and-abigail.jpg new file mode 100644 index 00000000..9f6ba058 Binary files /dev/null and b/_images/djangocon-us-2023-me-and-abigail.jpg differ diff --git a/_images/djangocon-us-2023-me-and-deb.jpg b/_images/djangocon-us-2023-me-and-deb.jpg new file mode 100644 index 00000000..04ed7d67 Binary files /dev/null and b/_images/djangocon-us-2023-me-and-deb.jpg differ diff --git a/_images/djangocon-us-2023-me-and-jon.jpg b/_images/djangocon-us-2023-me-and-jon.jpg new file mode 100644 index 00000000..d11c0dce Binary files /dev/null and b/_images/djangocon-us-2023-me-and-jon.jpg differ diff --git a/_images/djangocon-us-2023-organizers-outside.jpg b/_images/djangocon-us-2023-organizers-outside.jpg new file mode 100644 index 00000000..837ca161 Binary files /dev/null and b/_images/djangocon-us-2023-organizers-outside.jpg differ diff --git a/_images/djangocon-us-2023-organizers-outside1.jpg b/_images/djangocon-us-2023-organizers-outside1.jpg new file mode 100644 index 00000000..837ca161 Binary files /dev/null and b/_images/djangocon-us-2023-organizers-outside1.jpg differ diff --git a/_images/djangocon-us-2023-organizers-stage.jpg b/_images/djangocon-us-2023-organizers-stage.jpg new file mode 100644 index 00000000..37460c0e Binary files /dev/null and b/_images/djangocon-us-2023-organizers-stage.jpg differ diff --git a/_images/djangocon-us-2023-standing-ovation.jpg b/_images/djangocon-us-2023-standing-ovation.jpg new file mode 100644 index 00000000..f41cb96d Binary files /dev/null and b/_images/djangocon-us-2023-standing-ovation.jpg differ diff --git a/_images/djangocon-us-2023-website-header.png b/_images/djangocon-us-2023-website-header.png new file mode 100644 index 00000000..343767c0 Binary files /dev/null and b/_images/djangocon-us-2023-website-header.png differ diff --git a/_images/djangocon-us-2024-black-python-devs-summit-me-afi-velda.jpg b/_images/djangocon-us-2024-black-python-devs-summit-me-afi-velda.jpg new file mode 100644 index 00000000..638ff461 Binary files /dev/null and b/_images/djangocon-us-2024-black-python-devs-summit-me-afi-velda.jpg differ diff --git a/_images/djangocon-us-2024-butterfly.jpg b/_images/djangocon-us-2024-butterfly.jpg new file mode 100644 index 00000000..5ad96ff4 Binary files /dev/null and b/_images/djangocon-us-2024-butterfly.jpg differ diff --git a/_images/djangocon-us-2024-defna-board.jpg b/_images/djangocon-us-2024-defna-board.jpg new file mode 100644 index 00000000..91960e59 Binary files /dev/null and b/_images/djangocon-us-2024-defna-board.jpg differ diff --git a/_images/djangocon-us-2024-lemur-1.jpg b/_images/djangocon-us-2024-lemur-1.jpg new file mode 100644 index 00000000..398e601c Binary files /dev/null and b/_images/djangocon-us-2024-lemur-1.jpg differ diff --git a/_images/djangocon-us-2024-lemur-2.jpg b/_images/djangocon-us-2024-lemur-2.jpg new file mode 100644 index 00000000..73be9e69 Binary files /dev/null and b/_images/djangocon-us-2024-lemur-2.jpg differ diff --git a/_images/djangocon-us-2024-me-and-carlton.jpg b/_images/djangocon-us-2024-me-and-carlton.jpg new file mode 100644 index 00000000..16e29710 Binary files /dev/null and b/_images/djangocon-us-2024-me-and-carlton.jpg differ diff --git a/_images/djangocon-us-2024-me-and-lorenzo.jpg b/_images/djangocon-us-2024-me-and-lorenzo.jpg new file mode 100644 index 00000000..212b8558 Binary files /dev/null and b/_images/djangocon-us-2024-me-and-lorenzo.jpg differ diff --git a/_images/djangocon-us-2024-me-and-simon.jpg b/_images/djangocon-us-2024-me-and-simon.jpg new file mode 100644 index 00000000..29058093 Binary files /dev/null and b/_images/djangocon-us-2024-me-and-simon.jpg differ diff --git a/_images/djangocon-us-2024-queenys.jpg b/_images/djangocon-us-2024-queenys.jpg new file mode 100644 index 00000000..1e492c1d Binary files /dev/null and b/_images/djangocon-us-2024-queenys.jpg differ diff --git a/_images/djangocon-us-featured-post.png b/_images/djangocon-us-featured-post.png new file mode 100644 index 00000000..b798a2cb Binary files /dev/null and b/_images/djangocon-us-featured-post.png differ diff --git a/_images/djangocon-us-organizers.jpg b/_images/djangocon-us-organizers.jpg new file mode 100644 index 00000000..107102f4 Binary files /dev/null and b/_images/djangocon-us-organizers.jpg differ diff --git a/_images/djangonaut-space-stats.png b/_images/djangonaut-space-stats.png new file mode 100644 index 00000000..7aacc4de Binary files /dev/null and b/_images/djangonaut-space-stats.png differ diff --git a/_images/djurham.jpg b/_images/djurham.jpg new file mode 100644 index 00000000..56863152 Binary files /dev/null and b/_images/djurham.jpg differ diff --git a/_images/dock-local-2.jpg b/_images/dock-local-2.jpg new file mode 100644 index 00000000..f2b9474b Binary files /dev/null and b/_images/dock-local-2.jpg differ diff --git a/_images/dolby-theater-stage.jpg b/_images/dolby-theater-stage.jpg new file mode 100644 index 00000000..38e45e9f Binary files /dev/null and b/_images/dolby-theater-stage.jpg differ diff --git a/_images/dolby-theater-walkway-1.jpg b/_images/dolby-theater-walkway-1.jpg new file mode 100644 index 00000000..2ae16910 Binary files /dev/null and b/_images/dolby-theater-walkway-1.jpg differ diff --git a/_images/dolby-theater-walkway-2.jpg b/_images/dolby-theater-walkway-2.jpg new file mode 100644 index 00000000..b075588b Binary files /dev/null and b/_images/dolby-theater-walkway-2.jpg differ diff --git a/_images/dolby-theater-winners-walk-2.jpg b/_images/dolby-theater-winners-walk-2.jpg new file mode 100644 index 00000000..b70b7922 Binary files /dev/null and b/_images/dolby-theater-winners-walk-2.jpg differ diff --git a/_images/dolby-theater-winners-walk.jpg b/_images/dolby-theater-winners-walk.jpg new file mode 100644 index 00000000..6ce3921b Binary files /dev/null and b/_images/dolby-theater-winners-walk.jpg differ diff --git a/_images/don't-have-stats.png b/_images/don't-have-stats.png new file mode 100644 index 00000000..ca89b8f2 Binary files /dev/null and b/_images/don't-have-stats.png differ diff --git a/_images/double-bind-barbie.png b/_images/double-bind-barbie.png new file mode 100644 index 00000000..ce22f990 Binary files /dev/null and b/_images/double-bind-barbie.png differ diff --git a/_images/double-bind-paradoxes.png b/_images/double-bind-paradoxes.png new file mode 100644 index 00000000..94316c8b Binary files /dev/null and b/_images/double-bind-paradoxes.png differ diff --git a/_images/double-bind.png b/_images/double-bind.png new file mode 100644 index 00000000..d9ee40da Binary files /dev/null and b/_images/double-bind.png differ diff --git a/_images/downtown-la-skid-row.jpg b/_images/downtown-la-skid-row.jpg new file mode 100644 index 00000000..b71edb9d Binary files /dev/null and b/_images/downtown-la-skid-row.jpg differ diff --git a/_images/duke-chapel-altar.jpg b/_images/duke-chapel-altar.jpg new file mode 100644 index 00000000..1c347084 Binary files /dev/null and b/_images/duke-chapel-altar.jpg differ diff --git a/_images/duke-chapel-back.jpg b/_images/duke-chapel-back.jpg new file mode 100644 index 00000000..c061f078 Binary files /dev/null and b/_images/duke-chapel-back.jpg differ diff --git a/_images/duke-chapel-front.jpg b/_images/duke-chapel-front.jpg new file mode 100644 index 00000000..f935848d Binary files /dev/null and b/_images/duke-chapel-front.jpg differ diff --git a/_images/duke-chapel-side.jpg b/_images/duke-chapel-side.jpg new file mode 100644 index 00000000..4a215386 Binary files /dev/null and b/_images/duke-chapel-side.jpg differ diff --git a/_images/duke-gardens-blomquist-pavilion.jpg b/_images/duke-gardens-blomquist-pavilion.jpg new file mode 100644 index 00000000..34c0c6e5 Binary files /dev/null and b/_images/duke-gardens-blomquist-pavilion.jpg differ diff --git a/_images/duke-gardens-glorious-nature.jpg b/_images/duke-gardens-glorious-nature.jpg new file mode 100644 index 00000000..c48449b3 Binary files /dev/null and b/_images/duke-gardens-glorious-nature.jpg differ diff --git a/_images/duke-gardens-historic-terraces-fish-pool-and-cindy-brodhead-pergola.jpg b/_images/duke-gardens-historic-terraces-fish-pool-and-cindy-brodhead-pergola.jpg new file mode 100644 index 00000000..fc1e5f86 Binary files /dev/null and b/_images/duke-gardens-historic-terraces-fish-pool-and-cindy-brodhead-pergola.jpg differ diff --git a/_images/duke-gardens-pink-flowers.jpg b/_images/duke-gardens-pink-flowers.jpg new file mode 100644 index 00000000..4cb67b5b Binary files /dev/null and b/_images/duke-gardens-pink-flowers.jpg differ diff --git a/_images/duke-gardens-red-bridge.jpg b/_images/duke-gardens-red-bridge.jpg new file mode 100644 index 00000000..039267c7 Binary files /dev/null and b/_images/duke-gardens-red-bridge.jpg differ diff --git a/_images/duke-gardens-south-lawn.jpg b/_images/duke-gardens-south-lawn.jpg new file mode 100644 index 00000000..d3093166 Binary files /dev/null and b/_images/duke-gardens-south-lawn.jpg differ diff --git a/_images/duke-gardens-wooden-bridge.jpg b/_images/duke-gardens-wooden-bridge.jpg new file mode 100644 index 00000000..6920d2ee Binary files /dev/null and b/_images/duke-gardens-wooden-bridge.jpg differ diff --git a/_images/duquesne-incline-bottom.jpg b/_images/duquesne-incline-bottom.jpg new file mode 100644 index 00000000..0241cf1b Binary files /dev/null and b/_images/duquesne-incline-bottom.jpg differ diff --git a/_images/duquesne-incline-view.jpg b/_images/duquesne-incline-view.jpg new file mode 100644 index 00000000..71e45c7e Binary files /dev/null and b/_images/duquesne-incline-view.jpg differ diff --git a/_images/durham-downtown-snapshots.png b/_images/durham-downtown-snapshots.png new file mode 100644 index 00000000..c155dfc9 Binary files /dev/null and b/_images/durham-downtown-snapshots.png differ diff --git a/_images/durham-food-hall.jpg b/_images/durham-food-hall.jpg new file mode 100644 index 00000000..0358cff6 Binary files /dev/null and b/_images/durham-food-hall.jpg differ diff --git a/_images/edgewater-park.jpg b/_images/edgewater-park.jpg new file mode 100644 index 00000000..0fdffa07 Binary files /dev/null and b/_images/edgewater-park.jpg differ diff --git a/_images/embarcadero.jpg b/_images/embarcadero.jpg new file mode 100644 index 00000000..0425a687 Binary files /dev/null and b/_images/embarcadero.jpg differ diff --git a/_images/example-karel-test-cases.png b/_images/example-karel-test-cases.png new file mode 100644 index 00000000..48fc9072 Binary files /dev/null and b/_images/example-karel-test-cases.png differ diff --git a/_images/expo-hall.jpg b/_images/expo-hall.jpg new file mode 100644 index 00000000..d87e6ab5 Binary files /dev/null and b/_images/expo-hall.jpg differ diff --git a/_images/felt-like-it.png b/_images/felt-like-it.png new file mode 100644 index 00000000..c1945d57 Binary files /dev/null and b/_images/felt-like-it.png differ diff --git a/_images/fig-and-ash-brownie.jpg b/_images/fig-and-ash-brownie.jpg new file mode 100644 index 00000000..8159a0d9 Binary files /dev/null and b/_images/fig-and-ash-brownie.jpg differ diff --git a/_images/fig-and-ash-spaghetti.jpg b/_images/fig-and-ash-spaghetti.jpg new file mode 100644 index 00000000..68157d7d Binary files /dev/null and b/_images/fig-and-ash-spaghetti.jpg differ diff --git a/_images/floating-chase-logo.jpg b/_images/floating-chase-logo.jpg new file mode 100644 index 00000000..c9a51179 Binary files /dev/null and b/_images/floating-chase-logo.jpg differ diff --git a/_images/fowling.jpg b/_images/fowling.jpg new file mode 100644 index 00000000..bf064a91 Binary files /dev/null and b/_images/fowling.jpg differ diff --git a/_images/frank-post.png b/_images/frank-post.png new file mode 100644 index 00000000..7c9ed600 Binary files /dev/null and b/_images/frank-post.png differ diff --git a/_images/friends-set.jpg b/_images/friends-set.jpg new file mode 100644 index 00000000..b5fc76e7 Binary files /dev/null and b/_images/friends-set.jpg differ diff --git a/_images/froi.png b/_images/froi.png new file mode 100644 index 00000000..0921616c Binary files /dev/null and b/_images/froi.png differ diff --git a/_images/fun-but-challenging.png b/_images/fun-but-challenging.png new file mode 100644 index 00000000..044d5711 Binary files /dev/null and b/_images/fun-but-challenging.png differ diff --git a/_images/giant-guido.jpg b/_images/giant-guido.jpg new file mode 100644 index 00000000..1753cba5 Binary files /dev/null and b/_images/giant-guido.jpg differ diff --git a/_images/github-universe-2019-github-hq-tour.JPG b/_images/github-universe-2019-github-hq-tour.JPG new file mode 100644 index 00000000..ca7c7d8d Binary files /dev/null and b/_images/github-universe-2019-github-hq-tour.JPG differ diff --git a/_images/github-universe-2019-lunch-with-jigyasa-at-twitter-hq.jpg b/_images/github-universe-2019-lunch-with-jigyasa-at-twitter-hq.jpg new file mode 100644 index 00000000..9f5c63ca Binary files /dev/null and b/_images/github-universe-2019-lunch-with-jigyasa-at-twitter-hq.jpg differ diff --git a/_images/github-universe-2019-nat.JPG b/_images/github-universe-2019-nat.JPG new file mode 100644 index 00000000..02cade15 Binary files /dev/null and b/_images/github-universe-2019-nat.JPG differ diff --git a/_images/github-universe-2019-twitter-hq-1.jpg b/_images/github-universe-2019-twitter-hq-1.jpg new file mode 100644 index 00000000..eb8b62b2 Binary files /dev/null and b/_images/github-universe-2019-twitter-hq-1.jpg differ diff --git a/_images/github-universe-2019-twitter-hq-2.jpg b/_images/github-universe-2019-twitter-hq-2.jpg new file mode 100644 index 00000000..72c02860 Binary files /dev/null and b/_images/github-universe-2019-twitter-hq-2.jpg differ diff --git a/_images/grammy-museum-costumes.jpg b/_images/grammy-museum-costumes.jpg new file mode 100644 index 00000000..aee6eb11 Binary files /dev/null and b/_images/grammy-museum-costumes.jpg differ diff --git a/_images/grammy-museum-michael-jackson-collection.jpg b/_images/grammy-museum-michael-jackson-collection.jpg new file mode 100644 index 00000000..45dfcdde Binary files /dev/null and b/_images/grammy-museum-michael-jackson-collection.jpg differ diff --git a/_images/grammy-museum-michael-jackson-nomination.jpg b/_images/grammy-museum-michael-jackson-nomination.jpg new file mode 100644 index 00000000..c579975f Binary files /dev/null and b/_images/grammy-museum-michael-jackson-nomination.jpg differ diff --git a/_images/greenscreening.png b/_images/greenscreening.png new file mode 100644 index 00000000..9be15afa Binary files /dev/null and b/_images/greenscreening.png differ diff --git a/_images/guido-tweet.png b/_images/guido-tweet.png new file mode 100644 index 00000000..58c3da5b Binary files /dev/null and b/_images/guido-tweet.png differ diff --git a/_images/gym-rat.jpg b/_images/gym-rat.jpg new file mode 100644 index 00000000..ad3ad4e2 Binary files /dev/null and b/_images/gym-rat.jpg differ diff --git a/_images/hackathon-team.jpg b/_images/hackathon-team.jpg new file mode 100644 index 00000000..b4d25cb7 Binary files /dev/null and b/_images/hackathon-team.jpg differ diff --git a/_images/hackathon-team1.jpg b/_images/hackathon-team1.jpg new file mode 100644 index 00000000..272075a2 Binary files /dev/null and b/_images/hackathon-team1.jpg differ diff --git a/_images/hacker-news-rankings-expanded.png b/_images/hacker-news-rankings-expanded.png new file mode 100644 index 00000000..315cc658 Binary files /dev/null and b/_images/hacker-news-rankings-expanded.png differ diff --git a/_images/hacker-news-rankings-stats.png b/_images/hacker-news-rankings-stats.png new file mode 100644 index 00000000..81cb79b8 Binary files /dev/null and b/_images/hacker-news-rankings-stats.png differ diff --git a/_images/hacker-news-trending.png b/_images/hacker-news-trending.png new file mode 100644 index 00000000..250b18c6 Binary files /dev/null and b/_images/hacker-news-trending.png differ diff --git a/_images/hallway.jpg b/_images/hallway.jpg new file mode 100644 index 00000000..1ef79f98 Binary files /dev/null and b/_images/hallway.jpg differ diff --git a/_images/harbor-cruise.jpg b/_images/harbor-cruise.jpg new file mode 100644 index 00000000..c4a65deb Binary files /dev/null and b/_images/harbor-cruise.jpg differ diff --git a/_images/harvest-moon.jpg b/_images/harvest-moon.jpg new file mode 100644 index 00000000..2501b752 Binary files /dev/null and b/_images/harvest-moon.jpg differ diff --git a/_images/hats.jpg b/_images/hats.jpg new file mode 100644 index 00000000..d7494616 Binary files /dev/null and b/_images/hats.jpg differ diff --git a/_images/heinz-museum-mr-rogers.jpg b/_images/heinz-museum-mr-rogers.jpg new file mode 100644 index 00000000..da2fa34e Binary files /dev/null and b/_images/heinz-museum-mr-rogers.jpg differ diff --git a/_images/hey-we-dont.jpg b/_images/hey-we-dont.jpg new file mode 100644 index 00000000..ee16d55b Binary files /dev/null and b/_images/hey-we-dont.jpg differ diff --git a/_images/hollywood-boulevard-hollywood-sign.jpg b/_images/hollywood-boulevard-hollywood-sign.jpg new file mode 100644 index 00000000..f0d1d1c0 Binary files /dev/null and b/_images/hollywood-boulevard-hollywood-sign.jpg differ diff --git a/_images/hollywood-boulevard-michael-jackson-handprints.jpg b/_images/hollywood-boulevard-michael-jackson-handprints.jpg new file mode 100644 index 00000000..0b059228 Binary files /dev/null and b/_images/hollywood-boulevard-michael-jackson-handprints.jpg differ diff --git a/_images/hollywood-boulevard-sidewalk.jpg b/_images/hollywood-boulevard-sidewalk.jpg new file mode 100644 index 00000000..64b9affa Binary files /dev/null and b/_images/hollywood-boulevard-sidewalk.jpg differ diff --git a/_images/hollywood-boulevard-tcl-chinese-theater.jpg b/_images/hollywood-boulevard-tcl-chinese-theater.jpg new file mode 100644 index 00000000..917d6899 Binary files /dev/null and b/_images/hollywood-boulevard-tcl-chinese-theater.jpg differ diff --git a/_images/hotel-cecil-1.jpg b/_images/hotel-cecil-1.jpg new file mode 100644 index 00000000..78d2be7d Binary files /dev/null and b/_images/hotel-cecil-1.jpg differ diff --git a/_images/hotel-cecil-2.jpg b/_images/hotel-cecil-2.jpg new file mode 100644 index 00000000..bca1fede Binary files /dev/null and b/_images/hotel-cecil-2.jpg differ diff --git a/_images/hotel-table.jpg b/_images/hotel-table.jpg new file mode 100644 index 00000000..afb287df Binary files /dev/null and b/_images/hotel-table.jpg differ diff --git a/_images/hotpot.jpg b/_images/hotpot.jpg new file mode 100644 index 00000000..ad00f5ce Binary files /dev/null and b/_images/hotpot.jpg differ diff --git a/_images/i've-been-thinking-about-this-a-lot.png b/_images/i've-been-thinking-about-this-a-lot.png new file mode 100644 index 00000000..69ce5437 Binary files /dev/null and b/_images/i've-been-thinking-about-this-a-lot.png differ diff --git a/_images/i-had-to-stand-in-line.png b/_images/i-had-to-stand-in-line.png new file mode 100644 index 00000000..70c8a8b1 Binary files /dev/null and b/_images/i-had-to-stand-in-line.png differ diff --git a/_images/i-love-nyc.jpg b/_images/i-love-nyc.jpg new file mode 100644 index 00000000..895fe0bd Binary files /dev/null and b/_images/i-love-nyc.jpg differ diff --git a/_images/ice-cream.jpg b/_images/ice-cream.jpg new file mode 100644 index 00000000..6a5b20af Binary files /dev/null and b/_images/ice-cream.jpg differ diff --git a/_images/ice-skating.jpg b/_images/ice-skating.jpg new file mode 100644 index 00000000..3b27af22 Binary files /dev/null and b/_images/ice-skating.jpg differ diff --git a/_images/its-a-southern-thing-catfish.jpg b/_images/its-a-southern-thing-catfish.jpg new file mode 100644 index 00000000..9bec5467 Binary files /dev/null and b/_images/its-a-southern-thing-catfish.jpg differ diff --git a/_images/its-a-southern-thing-table.jpg b/_images/its-a-southern-thing-table.jpg new file mode 100644 index 00000000..971fc13f Binary files /dev/null and b/_images/its-a-southern-thing-table.jpg differ diff --git a/_images/jack-django-systems-check-framework.png b/_images/jack-django-systems-check-framework.png new file mode 100644 index 00000000..b51ddfc5 Binary files /dev/null and b/_images/jack-django-systems-check-framework.png differ diff --git a/_images/jack-how-to-effectively-ask-for-help.png b/_images/jack-how-to-effectively-ask-for-help.png new file mode 100644 index 00000000..67379dae Binary files /dev/null and b/_images/jack-how-to-effectively-ask-for-help.png differ diff --git a/_images/jack-oh-no.png b/_images/jack-oh-no.png new file mode 100644 index 00000000..12e0714d Binary files /dev/null and b/_images/jack-oh-no.png differ diff --git a/_images/jack-strategies-for-dissecting-complex-issues.png b/_images/jack-strategies-for-dissecting-complex-issues.png new file mode 100644 index 00000000..3ea1dca2 Binary files /dev/null and b/_images/jack-strategies-for-dissecting-complex-issues.png differ diff --git a/_images/jack-where-to-get-help.png b/_images/jack-where-to-get-help.png new file mode 100644 index 00000000..07c69b97 Binary files /dev/null and b/_images/jack-where-to-get-help.png differ diff --git a/_images/jack-write-down-your-troubleshooting-process.png b/_images/jack-write-down-your-troubleshooting-process.png new file mode 100644 index 00000000..2d438076 Binary files /dev/null and b/_images/jack-write-down-your-troubleshooting-process.png differ diff --git a/_images/jack-yep.png b/_images/jack-yep.png new file mode 100644 index 00000000..17d1982a Binary files /dev/null and b/_images/jack-yep.png differ diff --git a/_images/jacob-easy.png b/_images/jacob-easy.png new file mode 100644 index 00000000..de154401 Binary files /dev/null and b/_images/jacob-easy.png differ diff --git a/_images/jacob-hard.png b/_images/jacob-hard.png new file mode 100644 index 00000000..ede266bc Binary files /dev/null and b/_images/jacob-hard.png differ diff --git a/_images/jacob-medium.png b/_images/jacob-medium.png new file mode 100644 index 00000000..8e4e7d6f Binary files /dev/null and b/_images/jacob-medium.png differ diff --git a/_images/jacob-my-wishlist.png b/_images/jacob-my-wishlist.png new file mode 100644 index 00000000..e125b233 Binary files /dev/null and b/_images/jacob-my-wishlist.png differ diff --git a/_images/jacob.jpg b/_images/jacob.jpg new file mode 100644 index 00000000..4593c449 Binary files /dev/null and b/_images/jacob.jpg differ diff --git a/_images/jason-koo.jpg b/_images/jason-koo.jpg new file mode 100644 index 00000000..5c6c29a5 Binary files /dev/null and b/_images/jason-koo.jpg differ diff --git a/_images/jeff-eric-william.jpg b/_images/jeff-eric-william.jpg new file mode 100644 index 00000000..d42688b1 Binary files /dev/null and b/_images/jeff-eric-william.jpg differ diff --git a/_images/jessica-and-sara.jpg b/_images/jessica-and-sara.jpg new file mode 100644 index 00000000..1550bb0b Binary files /dev/null and b/_images/jessica-and-sara.jpg differ diff --git a/_images/jessica-rose.jpg b/_images/jessica-rose.jpg new file mode 100644 index 00000000..6576cebd Binary files /dev/null and b/_images/jessica-rose.jpg differ diff --git a/_images/jit-compiler-background.png b/_images/jit-compiler-background.png new file mode 100644 index 00000000..0048f629 Binary files /dev/null and b/_images/jit-compiler-background.png differ diff --git a/_images/jit-compiler-fibonacci.png b/_images/jit-compiler-fibonacci.png new file mode 100644 index 00000000..57f37c71 Binary files /dev/null and b/_images/jit-compiler-fibonacci.png differ diff --git a/_images/jit-compiler-micro-op-traces.png b/_images/jit-compiler-micro-op-traces.png new file mode 100644 index 00000000..a4631d3f Binary files /dev/null and b/_images/jit-compiler-micro-op-traces.png differ diff --git a/_images/jit-compiler-specialized-bytecode.png b/_images/jit-compiler-specialized-bytecode.png new file mode 100644 index 00000000..1c678d15 Binary files /dev/null and b/_images/jit-compiler-specialized-bytecode.png differ diff --git a/_images/jit-externs.png b/_images/jit-externs.png new file mode 100644 index 00000000..c189094d Binary files /dev/null and b/_images/jit-externs.png differ diff --git a/_images/jit-just-in-time-compilation.png b/_images/jit-just-in-time-compilation.png new file mode 100644 index 00000000..c5cbfb5c Binary files /dev/null and b/_images/jit-just-in-time-compilation.png differ diff --git a/_images/jit.png b/_images/jit.png new file mode 100644 index 00000000..faee37ff Binary files /dev/null and b/_images/jit.png differ diff --git a/_images/jon-lightning-talk.jpg b/_images/jon-lightning-talk.jpg new file mode 100644 index 00000000..ca347eb1 Binary files /dev/null and b/_images/jon-lightning-talk.jpg differ diff --git a/_images/joni-djangocon-us-website-post.png b/_images/joni-djangocon-us-website-post.png new file mode 100644 index 00000000..e5cec76e Binary files /dev/null and b/_images/joni-djangocon-us-website-post.png differ diff --git a/_images/jpmorgan-chase-2023-djangocon-us-recap-2.jpg b/_images/jpmorgan-chase-2023-djangocon-us-recap-2.jpg new file mode 100644 index 00000000..2908b341 Binary files /dev/null and b/_images/jpmorgan-chase-2023-djangocon-us-recap-2.jpg differ diff --git a/_images/jpmorgan-chase-2023-djangocon-us-recap.jpg b/_images/jpmorgan-chase-2023-djangocon-us-recap.jpg new file mode 100644 index 00000000..7071d1e7 Binary files /dev/null and b/_images/jpmorgan-chase-2023-djangocon-us-recap.jpg differ diff --git a/_images/karel-reference.png b/_images/karel-reference.png new file mode 100644 index 00000000..46e0985b Binary files /dev/null and b/_images/karel-reference.png differ diff --git a/_images/karel-world.png b/_images/karel-world.png new file mode 100644 index 00000000..4b8117df Binary files /dev/null and b/_images/karel-world.png differ diff --git a/_images/ken-being-honored.jpg b/_images/ken-being-honored.jpg new file mode 100644 index 00000000..cb9d03e7 Binary files /dev/null and b/_images/ken-being-honored.jpg differ diff --git a/_images/kojo-burnout-is-real.png b/_images/kojo-burnout-is-real.png new file mode 100644 index 00000000..2b2177d8 Binary files /dev/null and b/_images/kojo-burnout-is-real.png differ diff --git a/_images/kojo-call-to-action.png b/_images/kojo-call-to-action.png new file mode 100644 index 00000000..e59ea2d0 Binary files /dev/null and b/_images/kojo-call-to-action.png differ diff --git a/_images/kojo-idrissa.jpg b/_images/kojo-idrissa.jpg new file mode 100644 index 00000000..3f5e8f89 Binary files /dev/null and b/_images/kojo-idrissa.jpg differ diff --git a/_images/kojo-welcome.png b/_images/kojo-welcome.png new file mode 100644 index 00000000..d9b5aab4 Binary files /dev/null and b/_images/kojo-welcome.png differ diff --git a/_images/kojo-why-does-this-matter.jpg b/_images/kojo-why-does-this-matter.jpg new file mode 100644 index 00000000..f8ea2e2f Binary files /dev/null and b/_images/kojo-why-does-this-matter.jpg differ diff --git a/_images/la-morenita-food-truck.jpg b/_images/la-morenita-food-truck.jpg new file mode 100644 index 00000000..afc1494a Binary files /dev/null and b/_images/la-morenita-food-truck.jpg differ diff --git a/_images/lacey-kudo.png b/_images/lacey-kudo.png new file mode 100644 index 00000000..d89084fe Binary files /dev/null and b/_images/lacey-kudo.png differ diff --git a/_images/lemurs-1.jpg b/_images/lemurs-1.jpg new file mode 100644 index 00000000..3eff4857 Binary files /dev/null and b/_images/lemurs-1.jpg differ diff --git a/_images/lemurs-2.jpg b/_images/lemurs-2.jpg new file mode 100644 index 00000000..73be9e69 Binary files /dev/null and b/_images/lemurs-2.jpg differ diff --git a/_images/little-italy-piazza.jpg b/_images/little-italy-piazza.jpg new file mode 100644 index 00000000..89b2637a Binary files /dev/null and b/_images/little-italy-piazza.jpg differ diff --git a/_images/loaf-display-case.jpg b/_images/loaf-display-case.jpg new file mode 100644 index 00000000..e023f8b0 Binary files /dev/null and b/_images/loaf-display-case.jpg differ diff --git a/_images/loaf-ham-and-gruyere-croissant.jpg b/_images/loaf-ham-and-gruyere-croissant.jpg new file mode 100644 index 00000000..8601b590 Binary files /dev/null and b/_images/loaf-ham-and-gruyere-croissant.jpg differ diff --git a/_images/loaf.jpg b/_images/loaf.jpg new file mode 100644 index 00000000..263b819c Binary files /dev/null and b/_images/loaf.jpg differ diff --git a/_images/locations-page.png b/_images/locations-page.png new file mode 100644 index 00000000..57bd8035 Binary files /dev/null and b/_images/locations-page.png differ diff --git a/_images/longhorn.jpg b/_images/longhorn.jpg new file mode 100644 index 00000000..4ec194a9 Binary files /dev/null and b/_images/longhorn.jpg differ diff --git a/_images/lorenzo-post.png b/_images/lorenzo-post.png new file mode 100644 index 00000000..13da0db8 Binary files /dev/null and b/_images/lorenzo-post.png differ diff --git a/_images/lucis-bakery.jpg b/_images/lucis-bakery.jpg new file mode 100644 index 00000000..833d8ba4 Binary files /dev/null and b/_images/lucis-bakery.jpg differ diff --git a/_images/main-street-bakery-1.jpg b/_images/main-street-bakery-1.jpg new file mode 100644 index 00000000..01e39b97 Binary files /dev/null and b/_images/main-street-bakery-1.jpg differ diff --git a/_images/mario-withdrawn-mood-self-absorbed.png b/_images/mario-withdrawn-mood-self-absorbed.png new file mode 100644 index 00000000..d93a4aa8 Binary files /dev/null and b/_images/mario-withdrawn-mood-self-absorbed.png differ diff --git a/_images/marriott-fried-green-tomato.jpg b/_images/marriott-fried-green-tomato.jpg new file mode 100644 index 00000000..3aec8151 Binary files /dev/null and b/_images/marriott-fried-green-tomato.jpg differ diff --git a/_images/matt-mitchell.jpg b/_images/matt-mitchell.jpg new file mode 100644 index 00000000..f14a1dc1 Binary files /dev/null and b/_images/matt-mitchell.jpg differ diff --git a/_images/mclaren-750s.jpg b/_images/mclaren-750s.jpg new file mode 100644 index 00000000..7ebd6d30 Binary files /dev/null and b/_images/mclaren-750s.jpg differ diff --git a/_images/mclaren-artura.jpg b/_images/mclaren-artura.jpg new file mode 100644 index 00000000..218943b2 Binary files /dev/null and b/_images/mclaren-artura.jpg differ diff --git a/_images/me-and-abigail.jpg b/_images/me-and-abigail.jpg new file mode 100644 index 00000000..9f6ba058 Binary files /dev/null and b/_images/me-and-abigail.jpg differ diff --git a/_images/me-and-abigail1.jpg b/_images/me-and-abigail1.jpg new file mode 100644 index 00000000..4b6dc589 Binary files /dev/null and b/_images/me-and-abigail1.jpg differ diff --git a/_images/me-and-benedict.jpg b/_images/me-and-benedict.jpg new file mode 100644 index 00000000..a901f90f Binary files /dev/null and b/_images/me-and-benedict.jpg differ diff --git a/_images/me-and-carlton.jpg b/_images/me-and-carlton.jpg new file mode 100644 index 00000000..16e29710 Binary files /dev/null and b/_images/me-and-carlton.jpg differ diff --git a/_images/me-and-deb.jpg b/_images/me-and-deb.jpg new file mode 100644 index 00000000..04ed7d67 Binary files /dev/null and b/_images/me-and-deb.jpg differ diff --git a/_images/me-and-jackie.jpeg b/_images/me-and-jackie.jpeg new file mode 100644 index 00000000..0a38cd40 Binary files /dev/null and b/_images/me-and-jackie.jpeg differ diff --git a/_images/me-and-jon.jpeg b/_images/me-and-jon.jpeg new file mode 100644 index 00000000..f1574fa9 Binary files /dev/null and b/_images/me-and-jon.jpeg differ diff --git a/_images/me-and-jon.jpg b/_images/me-and-jon.jpg new file mode 100644 index 00000000..d11c0dce Binary files /dev/null and b/_images/me-and-jon.jpg differ diff --git a/_images/me-and-lorenzo.jpg b/_images/me-and-lorenzo.jpg new file mode 100644 index 00000000..212b8558 Binary files /dev/null and b/_images/me-and-lorenzo.jpg differ diff --git a/_images/me-and-mariatta.jpg b/_images/me-and-mariatta.jpg new file mode 100644 index 00000000..9ecefe41 Binary files /dev/null and b/_images/me-and-mariatta.jpg differ diff --git a/_images/me-and-simon.jpg b/_images/me-and-simon.jpg new file mode 100644 index 00000000..29058093 Binary files /dev/null and b/_images/me-and-simon.jpg differ diff --git a/_images/me-at-pycon-us.jpg b/_images/me-at-pycon-us.jpg new file mode 100644 index 00000000..adf554af Binary files /dev/null and b/_images/me-at-pycon-us.jpg differ diff --git a/_images/me-at-the-portland-japanese-garden.jpg b/_images/me-at-the-portland-japanese-garden.jpg new file mode 100644 index 00000000..34ac7417 Binary files /dev/null and b/_images/me-at-the-portland-japanese-garden.jpg differ diff --git a/_images/me-by-melanie.jpg b/_images/me-by-melanie.jpg new file mode 100644 index 00000000..286a9156 Binary files /dev/null and b/_images/me-by-melanie.jpg differ diff --git a/_images/me-juggling.png b/_images/me-juggling.png new file mode 100644 index 00000000..46553c02 Binary files /dev/null and b/_images/me-juggling.png differ diff --git a/_images/me-with-julie.jpg b/_images/me-with-julie.jpg new file mode 100644 index 00000000..da738298 Binary files /dev/null and b/_images/me-with-julie.jpg differ diff --git a/_images/me-with-mascots.jpg b/_images/me-with-mascots.jpg new file mode 100644 index 00000000..b7408fa7 Binary files /dev/null and b/_images/me-with-mascots.jpg differ diff --git a/_images/me-with-mclaren-artura.jpg b/_images/me-with-mclaren-artura.jpg new file mode 100644 index 00000000..b39386b5 Binary files /dev/null and b/_images/me-with-mclaren-artura.jpg differ diff --git a/_images/meg-python-education-website.png b/_images/meg-python-education-website.png new file mode 100644 index 00000000..8802f6e9 Binary files /dev/null and b/_images/meg-python-education-website.png differ diff --git a/_images/meg-social-justice-issue.png b/_images/meg-social-justice-issue.png new file mode 100644 index 00000000..7f9cd97e Binary files /dev/null and b/_images/meg-social-justice-issue.png differ diff --git a/_images/meg-the-zen-of-python-education.png b/_images/meg-the-zen-of-python-education.png new file mode 100644 index 00000000..e28abb51 Binary files /dev/null and b/_images/meg-the-zen-of-python-education.png differ diff --git a/_images/mels-drive-in-counter.jpg b/_images/mels-drive-in-counter.jpg new file mode 100644 index 00000000..808ab0c4 Binary files /dev/null and b/_images/mels-drive-in-counter.jpg differ diff --git a/_images/mels-drive-in-milkshake.jpg b/_images/mels-drive-in-milkshake.jpg new file mode 100644 index 00000000..d1502a8a Binary files /dev/null and b/_images/mels-drive-in-milkshake.jpg differ diff --git a/_images/members-of-the-deaf-community.jpg b/_images/members-of-the-deaf-community.jpg new file mode 100644 index 00000000..d4a63512 Binary files /dev/null and b/_images/members-of-the-deaf-community.jpg differ diff --git a/_images/mexican-sugar-1.jpg b/_images/mexican-sugar-1.jpg new file mode 100644 index 00000000..956abb40 Binary files /dev/null and b/_images/mexican-sugar-1.jpg differ diff --git a/_images/mexican-sugar-2.jpg b/_images/mexican-sugar-2.jpg new file mode 100644 index 00000000..a50eb289 Binary files /dev/null and b/_images/mexican-sugar-2.jpg differ diff --git a/_images/midway-bridge-and-plane.jpg b/_images/midway-bridge-and-plane.jpg new file mode 100644 index 00000000..1c87894f Binary files /dev/null and b/_images/midway-bridge-and-plane.jpg differ diff --git a/_images/midway-hangar-deck.jpg b/_images/midway-hangar-deck.jpg new file mode 100644 index 00000000..a07c4a2b Binary files /dev/null and b/_images/midway-hangar-deck.jpg differ diff --git a/_images/mission-beach.jpg b/_images/mission-beach.jpg new file mode 100644 index 00000000..8704f194 Binary files /dev/null and b/_images/mission-beach.jpg differ diff --git a/_images/moshe-convo-starters.jpg b/_images/moshe-convo-starters.jpg new file mode 100644 index 00000000..24da5fd4 Binary files /dev/null and b/_images/moshe-convo-starters.jpg differ diff --git a/_images/mother-and-sons-squid-ink-pasta.jpg b/_images/mother-and-sons-squid-ink-pasta.jpg new file mode 100644 index 00000000..cab76cdc Binary files /dev/null and b/_images/mother-and-sons-squid-ink-pasta.jpg differ diff --git a/_images/museum-of-life-and-science-butterfly-house-butterfly.jpg b/_images/museum-of-life-and-science-butterfly-house-butterfly.jpg new file mode 100644 index 00000000..0afb9bb3 Binary files /dev/null and b/_images/museum-of-life-and-science-butterfly-house-butterfly.jpg differ diff --git a/_images/museum-of-life-and-science-cockroaches.jpg b/_images/museum-of-life-and-science-cockroaches.jpg new file mode 100644 index 00000000..2c27df0c Binary files /dev/null and b/_images/museum-of-life-and-science-cockroaches.jpg differ diff --git a/_images/museum-of-life-and-science-exhibit.jpg b/_images/museum-of-life-and-science-exhibit.jpg new file mode 100644 index 00000000..efba6bcf Binary files /dev/null and b/_images/museum-of-life-and-science-exhibit.jpg differ diff --git a/_images/museum-of-life-and-science-eye-butterflies.jpg b/_images/museum-of-life-and-science-eye-butterflies.jpg new file mode 100644 index 00000000..f95f0300 Binary files /dev/null and b/_images/museum-of-life-and-science-eye-butterflies.jpg differ diff --git a/_images/museum-of-life-and-science-lemur.jpg b/_images/museum-of-life-and-science-lemur.jpg new file mode 100644 index 00000000..9d0c1cbe Binary files /dev/null and b/_images/museum-of-life-and-science-lemur.jpg differ diff --git a/_images/museum-of-life-and-science-lemurs.jpg b/_images/museum-of-life-and-science-lemurs.jpg new file mode 100644 index 00000000..bef8278c Binary files /dev/null and b/_images/museum-of-life-and-science-lemurs.jpg differ diff --git a/_images/museum-of-life-and-science-path-2.jpg b/_images/museum-of-life-and-science-path-2.jpg new file mode 100644 index 00000000..6669de94 Binary files /dev/null and b/_images/museum-of-life-and-science-path-2.jpg differ diff --git a/_images/museum-of-life-and-science-path.jpg b/_images/museum-of-life-and-science-path.jpg new file mode 100644 index 00000000..72e98005 Binary files /dev/null and b/_images/museum-of-life-and-science-path.jpg differ diff --git a/_images/museum-of-life-and-science-tarantula.jpg b/_images/museum-of-life-and-science-tarantula.jpg new file mode 100644 index 00000000..611daa52 Binary files /dev/null and b/_images/museum-of-life-and-science-tarantula.jpg differ diff --git a/_images/my-til-example-til-file.png b/_images/my-til-example-til-file.png new file mode 100644 index 00000000..0b3c00c0 Binary files /dev/null and b/_images/my-til-example-til-file.png differ diff --git a/_images/my-til.png b/_images/my-til.png new file mode 100644 index 00000000..3ded31c7 Binary files /dev/null and b/_images/my-til.png differ diff --git a/_images/new-friends.jpg b/_images/new-friends.jpg new file mode 100644 index 00000000..ee898880 Binary files /dev/null and b/_images/new-friends.jpg differ diff --git a/_images/nicholas-restuarant.jpg b/_images/nicholas-restuarant.jpg new file mode 100644 index 00000000..0dfccd79 Binary files /dev/null and b/_images/nicholas-restuarant.jpg differ diff --git a/_images/north-italia.jpg b/_images/north-italia.jpg new file mode 100644 index 00000000..f81c9c99 Binary files /dev/null and b/_images/north-italia.jpg differ diff --git a/_images/ocean-beach-from-pier.jpg b/_images/ocean-beach-from-pier.jpg new file mode 100644 index 00000000..f3084b2c Binary files /dev/null and b/_images/ocean-beach-from-pier.jpg differ diff --git a/_images/ocean-beach-pier.jpg b/_images/ocean-beach-pier.jpg new file mode 100644 index 00000000..9aea2aaa Binary files /dev/null and b/_images/ocean-beach-pier.jpg differ diff --git a/_images/oh-i-really-like-this.png b/_images/oh-i-really-like-this.png new file mode 100644 index 00000000..182f0fbb Binary files /dev/null and b/_images/oh-i-really-like-this.png differ diff --git a/_images/one-city-center-roof.jpg b/_images/one-city-center-roof.jpg new file mode 100644 index 00000000..2d051178 Binary files /dev/null and b/_images/one-city-center-roof.jpg differ diff --git a/_images/one-day-too-many.png b/_images/one-day-too-many.png new file mode 100644 index 00000000..7c1acc8d Binary files /dev/null and b/_images/one-day-too-many.png differ diff --git a/_images/opening-reception.jpg b/_images/opening-reception.jpg new file mode 100644 index 00000000..6f9cf31b Binary files /dev/null and b/_images/opening-reception.jpg differ diff --git a/_images/organizers-slide.jpg b/_images/organizers-slide.jpg new file mode 100644 index 00000000..4718daf8 Binary files /dev/null and b/_images/organizers-slide.jpg differ diff --git a/_images/organizers.jpg b/_images/organizers.jpg new file mode 100644 index 00000000..3210ae1d Binary files /dev/null and b/_images/organizers.jpg differ diff --git a/_images/parade.jpg b/_images/parade.jpg new file mode 100644 index 00000000..629b2e3a Binary files /dev/null and b/_images/parade.jpg differ diff --git a/_images/parizade-apple-pie-mezcal-margarita.jpg b/_images/parizade-apple-pie-mezcal-margarita.jpg new file mode 100644 index 00000000..e4f2eb4f Binary files /dev/null and b/_images/parizade-apple-pie-mezcal-margarita.jpg differ diff --git a/_images/parizade-cookie-and-ice-cream-dessert.jpg b/_images/parizade-cookie-and-ice-cream-dessert.jpg new file mode 100644 index 00000000..174f2e4b Binary files /dev/null and b/_images/parizade-cookie-and-ice-cream-dessert.jpg differ diff --git a/_images/parizade-dining-room.jpg b/_images/parizade-dining-room.jpg new file mode 100644 index 00000000..910a80a0 Binary files /dev/null and b/_images/parizade-dining-room.jpg differ diff --git a/_images/parizade-linguini-and-clams.jpg b/_images/parizade-linguini-and-clams.jpg new file mode 100644 index 00000000..f24d7488 Binary files /dev/null and b/_images/parizade-linguini-and-clams.jpg differ diff --git a/_images/parizade-post.png b/_images/parizade-post.png new file mode 100644 index 00000000..669945cb Binary files /dev/null and b/_images/parizade-post.png differ diff --git a/_images/parizade-walking-to-table.jpg b/_images/parizade-walking-to-table.jpg new file mode 100644 index 00000000..9788286e Binary files /dev/null and b/_images/parizade-walking-to-table.jpg differ diff --git a/_images/parts-and-labor-margarita.jpg b/_images/parts-and-labor-margarita.jpg new file mode 100644 index 00000000..c6976023 Binary files /dev/null and b/_images/parts-and-labor-margarita.jpg differ diff --git a/_images/personal-banker.png b/_images/personal-banker.png new file mode 100644 index 00000000..39cdb35e Binary files /dev/null and b/_images/personal-banker.png differ diff --git a/_images/petersen-back-to-the-future-close-up.jpg b/_images/petersen-back-to-the-future-close-up.jpg new file mode 100644 index 00000000..1d515e9f Binary files /dev/null and b/_images/petersen-back-to-the-future-close-up.jpg differ diff --git a/_images/petersen-back-to-the-future.jpg b/_images/petersen-back-to-the-future.jpg new file mode 100644 index 00000000..265b09b5 Binary files /dev/null and b/_images/petersen-back-to-the-future.jpg differ diff --git a/_images/petersen-thelma-and-louise-car-1.jpg b/_images/petersen-thelma-and-louise-car-1.jpg new file mode 100644 index 00000000..e67430c3 Binary files /dev/null and b/_images/petersen-thelma-and-louise-car-1.jpg differ diff --git a/_images/petersen-thelma-and-louise-car-2.jpg b/_images/petersen-thelma-and-louise-car-2.jpg new file mode 100644 index 00000000..abc7e61e Binary files /dev/null and b/_images/petersen-thelma-and-louise-car-2.jpg differ diff --git a/_images/petersen-thelma-and-louise-car-description.jpg b/_images/petersen-thelma-and-louise-car-description.jpg new file mode 100644 index 00000000..2cafd7d8 Binary files /dev/null and b/_images/petersen-thelma-and-louise-car-description.jpg differ diff --git a/_images/pie-pushers.jpg b/_images/pie-pushers.jpg new file mode 100644 index 00000000..6afb8ba4 Binary files /dev/null and b/_images/pie-pushers.jpg differ diff --git a/_images/piper-accepting-your-success.png b/_images/piper-accepting-your-success.png new file mode 100644 index 00000000..eaff876d Binary files /dev/null and b/_images/piper-accepting-your-success.png differ diff --git a/_images/pizzeria-toro-pizza.jpg b/_images/pizzeria-toro-pizza.jpg new file mode 100644 index 00000000..7b315423 Binary files /dev/null and b/_images/pizzeria-toro-pizza.jpg differ diff --git a/_images/pizzeria-toro.jpg b/_images/pizzeria-toro.jpg new file mode 100644 index 00000000..1b2f53c9 Binary files /dev/null and b/_images/pizzeria-toro.jpg differ diff --git a/_images/ponysaurus-beer-cocktail.jpg b/_images/ponysaurus-beer-cocktail.jpg new file mode 100644 index 00000000..6418c6e3 Binary files /dev/null and b/_images/ponysaurus-beer-cocktail.jpg differ diff --git a/_images/portland-aerial-tram.jpg b/_images/portland-aerial-tram.jpg new file mode 100644 index 00000000..da1df608 Binary files /dev/null and b/_images/portland-aerial-tram.jpg differ diff --git a/_images/portland-japanese-garden-bridge.jpg b/_images/portland-japanese-garden-bridge.jpg new file mode 100644 index 00000000..5add7ba8 Binary files /dev/null and b/_images/portland-japanese-garden-bridge.jpg differ diff --git a/_images/portland-japanese-garden-waterfall.jpg b/_images/portland-japanese-garden-waterfall.jpg new file mode 100644 index 00000000..52ba8f1a Binary files /dev/null and b/_images/portland-japanese-garden-waterfall.jpg differ diff --git a/_images/press-crepe-company-avocado-toast.jpg b/_images/press-crepe-company-avocado-toast.jpg new file mode 100644 index 00000000..d7a1a2e3 Binary files /dev/null and b/_images/press-crepe-company-avocado-toast.jpg differ diff --git a/_images/press-crepe-company-berries.jpg b/_images/press-crepe-company-berries.jpg new file mode 100644 index 00000000..2c31c8ad Binary files /dev/null and b/_images/press-crepe-company-berries.jpg differ diff --git a/_images/press-crepes-bar.jpg b/_images/press-crepes-bar.jpg new file mode 100644 index 00000000..e58120ad Binary files /dev/null and b/_images/press-crepes-bar.jpg differ diff --git a/_images/press-crepes-coffee.jpg b/_images/press-crepes-coffee.jpg new file mode 100644 index 00000000..f3ee09eb Binary files /dev/null and b/_images/press-crepes-coffee.jpg differ diff --git a/_images/press-crepes-crepe-inside.jpg b/_images/press-crepes-crepe-inside.jpg new file mode 100644 index 00000000..2d998656 Binary files /dev/null and b/_images/press-crepes-crepe-inside.jpg differ diff --git a/_images/press-crepes-crepe.jpg b/_images/press-crepes-crepe.jpg new file mode 100644 index 00000000..a68633b7 Binary files /dev/null and b/_images/press-crepes-crepe.jpg differ diff --git a/_images/press-crepes-silky-black-forest-latte.jpg b/_images/press-crepes-silky-black-forest-latte.jpg new file mode 100644 index 00000000..92ca8183 Binary files /dev/null and b/_images/press-crepes-silky-black-forest-latte.jpg differ diff --git a/_images/psf-members-luncheon.jpg b/_images/psf-members-luncheon.jpg new file mode 100644 index 00000000..20414605 Binary files /dev/null and b/_images/psf-members-luncheon.jpg differ diff --git a/_images/pycascades-2020-dinner-with-guido.jpg b/_images/pycascades-2020-dinner-with-guido.jpg new file mode 100644 index 00000000..6ecac727 Binary files /dev/null and b/_images/pycascades-2020-dinner-with-guido.jpg differ diff --git a/_images/pycascades-2020-sprints-hanging-out-with-guido.jpg b/_images/pycascades-2020-sprints-hanging-out-with-guido.jpg new file mode 100644 index 00000000..33dde96e Binary files /dev/null and b/_images/pycascades-2020-sprints-hanging-out-with-guido.jpg differ diff --git a/_images/pycon-us-2019-me-and-mariatta.jpg b/_images/pycon-us-2019-me-and-mariatta.jpg new file mode 100644 index 00000000..9ecefe41 Binary files /dev/null and b/_images/pycon-us-2019-me-and-mariatta.jpg differ diff --git a/_images/pycon-us-2019-pylatam.jpg b/_images/pycon-us-2019-pylatam.jpg new file mode 100644 index 00000000..1de2eefb Binary files /dev/null and b/_images/pycon-us-2019-pylatam.jpg differ diff --git a/_images/pycon-us-2024-black-python-devs-durham.png b/_images/pycon-us-2024-black-python-devs-durham.png new file mode 100644 index 00000000..36c8f216 Binary files /dev/null and b/_images/pycon-us-2024-black-python-devs-durham.png differ diff --git a/_images/pycon-us-2024-me-and-abigail.jpg b/_images/pycon-us-2024-me-and-abigail.jpg new file mode 100644 index 00000000..4b6dc589 Binary files /dev/null and b/_images/pycon-us-2024-me-and-abigail.jpg differ diff --git a/_images/pycon-us-2024-me-and-benedict.jpg b/_images/pycon-us-2024-me-and-benedict.jpg new file mode 100644 index 00000000..a901f90f Binary files /dev/null and b/_images/pycon-us-2024-me-and-benedict.jpg differ diff --git a/_images/pycon-us-2024-me-and-jackie.jpeg b/_images/pycon-us-2024-me-and-jackie.jpeg new file mode 100644 index 00000000..0a38cd40 Binary files /dev/null and b/_images/pycon-us-2024-me-and-jackie.jpeg differ diff --git a/_images/pycon-us-2024-me-by-melanie.jpg b/_images/pycon-us-2024-me-by-melanie.jpg new file mode 100644 index 00000000..286a9156 Binary files /dev/null and b/_images/pycon-us-2024-me-by-melanie.jpg differ diff --git a/_images/pycon-us-2024-me-juggling.png b/_images/pycon-us-2024-me-juggling.png new file mode 100644 index 00000000..46553c02 Binary files /dev/null and b/_images/pycon-us-2024-me-juggling.png differ diff --git a/_images/pycon-us-2024-sunday-night.jpeg b/_images/pycon-us-2024-sunday-night.jpeg new file mode 100644 index 00000000..783379c8 Binary files /dev/null and b/_images/pycon-us-2024-sunday-night.jpeg differ diff --git a/_images/pygotham-2017-dinner.jpg b/_images/pygotham-2017-dinner.jpg new file mode 100644 index 00000000..df3b0fdb Binary files /dev/null and b/_images/pygotham-2017-dinner.jpg differ diff --git a/_images/pygotham-2018-han-dynasty.jpg b/_images/pygotham-2018-han-dynasty.jpg new file mode 100644 index 00000000..5892451b Binary files /dev/null and b/_images/pygotham-2018-han-dynasty.jpg differ diff --git a/_images/pygotham-2018-me-and-lacey.jpg b/_images/pygotham-2018-me-and-lacey.jpg new file mode 100644 index 00000000..7e6e2fb8 Binary files /dev/null and b/_images/pygotham-2018-me-and-lacey.jpg differ diff --git a/_images/pygotham-2018-me-lindsey-trey-nic.jpg b/_images/pygotham-2018-me-lindsey-trey-nic.jpg new file mode 100644 index 00000000..7501690a Binary files /dev/null and b/_images/pygotham-2018-me-lindsey-trey-nic.jpg differ diff --git a/_images/pyladies-auction.jpg b/_images/pyladies-auction.jpg new file mode 100644 index 00000000..a00ad5a1 Binary files /dev/null and b/_images/pyladies-auction.jpg differ diff --git a/_images/pyladies-luncheon.jpg b/_images/pyladies-luncheon.jpg new file mode 100644 index 00000000..77aa8d2c Binary files /dev/null and b/_images/pyladies-luncheon.jpg differ diff --git a/_images/pyladies-t-shirt.jpg b/_images/pyladies-t-shirt.jpg new file mode 100644 index 00000000..847e53c0 Binary files /dev/null and b/_images/pyladies-t-shirt.jpg differ diff --git a/_images/pyladies.jpg b/_images/pyladies.jpg new file mode 100644 index 00000000..d70d3619 Binary files /dev/null and b/_images/pyladies.jpg differ diff --git a/_images/pylatam.jpg b/_images/pylatam.jpg new file mode 100644 index 00000000..1de2eefb Binary files /dev/null and b/_images/pylatam.jpg differ diff --git a/_images/pytexas-2024-jason-koo.jpg b/_images/pytexas-2024-jason-koo.jpg new file mode 100644 index 00000000..5c6c29a5 Binary files /dev/null and b/_images/pytexas-2024-jason-koo.jpg differ diff --git a/_images/python-benchmarking-faster-python.png b/_images/python-benchmarking-faster-python.png new file mode 100644 index 00000000..53502503 Binary files /dev/null and b/_images/python-benchmarking-faster-python.png differ diff --git a/_images/python-django-compatibility.png b/_images/python-django-compatibility.png new file mode 100644 index 00000000..d2df09f3 Binary files /dev/null and b/_images/python-django-compatibility.png differ diff --git a/_images/python-steering-council-free-threading-community-support.png b/_images/python-steering-council-free-threading-community-support.png new file mode 100644 index 00000000..a1d6a0fb Binary files /dev/null and b/_images/python-steering-council-free-threading-community-support.png differ diff --git a/_images/python-steering-council-free-threading-phase-1.png b/_images/python-steering-council-free-threading-phase-1.png new file mode 100644 index 00000000..be317872 Binary files /dev/null and b/_images/python-steering-council-free-threading-phase-1.png differ diff --git a/_images/python-steering-council-free-threading-phase-2.png b/_images/python-steering-council-free-threading-phase-2.png new file mode 100644 index 00000000..d4cdaca0 Binary files /dev/null and b/_images/python-steering-council-free-threading-phase-2.png differ diff --git a/_images/python-steering-council-free-threading-phase-3.png b/_images/python-steering-council-free-threading-phase-3.png new file mode 100644 index 00000000..ea93872b Binary files /dev/null and b/_images/python-steering-council-free-threading-phase-3.png differ diff --git a/_images/python-steering-council-free-threading-the-plan.png b/_images/python-steering-council-free-threading-the-plan.png new file mode 100644 index 00000000..838b2188 Binary files /dev/null and b/_images/python-steering-council-free-threading-the-plan.png differ diff --git a/_images/python-steering-council-one-more-thing.png b/_images/python-steering-council-one-more-thing.png new file mode 100644 index 00000000..545f885c Binary files /dev/null and b/_images/python-steering-council-one-more-thing.png differ diff --git a/_images/python-support-schedule.png b/_images/python-support-schedule.png new file mode 100644 index 00000000..56dd00db Binary files /dev/null and b/_images/python-support-schedule.png differ diff --git a/_images/queenys.jpg b/_images/queenys.jpg new file mode 100644 index 00000000..1e492c1d Binary files /dev/null and b/_images/queenys.jpg differ diff --git a/_images/rebel-moon-premier.jpg b/_images/rebel-moon-premier.jpg new file mode 100644 index 00000000..34dde4f8 Binary files /dev/null and b/_images/rebel-moon-premier.jpg differ diff --git a/_images/republique-bakery.jpg b/_images/republique-bakery.jpg new file mode 100644 index 00000000..ce00ef9b Binary files /dev/null and b/_images/republique-bakery.jpg differ diff --git a/_images/republique-breakfast-1.jpg b/_images/republique-breakfast-1.jpg new file mode 100644 index 00000000..3cf59f72 Binary files /dev/null and b/_images/republique-breakfast-1.jpg differ diff --git a/_images/republique-breakfast-2.jpg b/_images/republique-breakfast-2.jpg new file mode 100644 index 00000000..d2bef0cd Binary files /dev/null and b/_images/republique-breakfast-2.jpg differ diff --git a/_images/republique-courtyard.jpg b/_images/republique-courtyard.jpg new file mode 100644 index 00000000..b272a5c8 Binary files /dev/null and b/_images/republique-courtyard.jpg differ diff --git a/_images/republique-front.jpg b/_images/republique-front.jpg new file mode 100644 index 00000000..823b3884 Binary files /dev/null and b/_images/republique-front.jpg differ diff --git a/_images/restaurant-page.png b/_images/restaurant-page.png new file mode 100644 index 00000000..d7618eb5 Binary files /dev/null and b/_images/restaurant-page.png differ diff --git a/_images/revolution-hall.jpg b/_images/revolution-hall.jpg new file mode 100644 index 00000000..e04fa36d Binary files /dev/null and b/_images/revolution-hall.jpg differ diff --git a/_images/rock-and-roll-hall-of-fame.jpg b/_images/rock-and-roll-hall-of-fame.jpg new file mode 100644 index 00000000..bb394480 Binary files /dev/null and b/_images/rock-and-roll-hall-of-fame.jpg differ diff --git a/_images/rodeo-drive-harry-winston.jpg b/_images/rodeo-drive-harry-winston.jpg new file mode 100644 index 00000000..8287bbcf Binary files /dev/null and b/_images/rodeo-drive-harry-winston.jpg differ diff --git a/_images/rodeo-drive-valentino.jpg b/_images/rodeo-drive-valentino.jpg new file mode 100644 index 00000000..6895cfbd Binary files /dev/null and b/_images/rodeo-drive-valentino.jpg differ diff --git a/_images/rodeo-goat-1.jpg b/_images/rodeo-goat-1.jpg new file mode 100644 index 00000000..c1873882 Binary files /dev/null and b/_images/rodeo-goat-1.jpg differ diff --git a/_images/rodeo-goat-2.jpg b/_images/rodeo-goat-2.jpg new file mode 100644 index 00000000..ae384fd4 Binary files /dev/null and b/_images/rodeo-goat-2.jpg differ diff --git a/_images/ron-process-to-follow.png b/_images/ron-process-to-follow.png new file mode 100644 index 00000000..13c29848 Binary files /dev/null and b/_images/ron-process-to-follow.png differ diff --git a/_images/ron-summary.png b/_images/ron-summary.png new file mode 100644 index 00000000..4e31c784 Binary files /dev/null and b/_images/ron-summary.png differ diff --git a/_images/ryan-best-example.png b/_images/ryan-best-example.png new file mode 100644 index 00000000..16f0deb8 Binary files /dev/null and b/_images/ryan-best-example.png differ diff --git a/_images/ryan-venn-diagram.png b/_images/ryan-venn-diagram.png new file mode 100644 index 00000000..dff5c29a Binary files /dev/null and b/_images/ryan-venn-diagram.png differ diff --git a/_images/saffron-chicken.jpg b/_images/saffron-chicken.jpg new file mode 100644 index 00000000..37d6c419 Binary files /dev/null and b/_images/saffron-chicken.jpg differ diff --git a/_images/sake.jpg b/_images/sake.jpg new file mode 100644 index 00000000..1d795824 Binary files /dev/null and b/_images/sake.jpg differ diff --git a/_images/salt-and-straw-ice-cream.jpg b/_images/salt-and-straw-ice-cream.jpg new file mode 100644 index 00000000..94ed5162 Binary files /dev/null and b/_images/salt-and-straw-ice-cream.jpg differ diff --git a/_images/santa-monica-beach-sunset-1.jpg b/_images/santa-monica-beach-sunset-1.jpg new file mode 100644 index 00000000..73bc6281 Binary files /dev/null and b/_images/santa-monica-beach-sunset-1.jpg differ diff --git a/_images/santa-monica-beach-sunset-2.jpg b/_images/santa-monica-beach-sunset-2.jpg new file mode 100644 index 00000000..0d17e478 Binary files /dev/null and b/_images/santa-monica-beach-sunset-2.jpg differ diff --git a/_images/santa-monica-beach-sunset-3.jpg b/_images/santa-monica-beach-sunset-3.jpg new file mode 100644 index 00000000..8810d176 Binary files /dev/null and b/_images/santa-monica-beach-sunset-3.jpg differ diff --git a/_images/santa-monica-pier-at-night-pacific-park-ferris-wheel.jpg b/_images/santa-monica-pier-at-night-pacific-park-ferris-wheel.jpg new file mode 100644 index 00000000..3f5542ff Binary files /dev/null and b/_images/santa-monica-pier-at-night-pacific-park-ferris-wheel.jpg differ diff --git a/_images/santa-monica-pier-at-night-pacific-park.jpg b/_images/santa-monica-pier-at-night-pacific-park.jpg new file mode 100644 index 00000000..c512fbc5 Binary files /dev/null and b/_images/santa-monica-pier-at-night-pacific-park.jpg differ diff --git a/_images/santa-monica-pier-at-night.jpg b/_images/santa-monica-pier-at-night.jpg new file mode 100644 index 00000000..e78253bb Binary files /dev/null and b/_images/santa-monica-pier-at-night.jpg differ diff --git a/_images/santa-monica-pier-cityscape-pink.jpg b/_images/santa-monica-pier-cityscape-pink.jpg new file mode 100644 index 00000000..f79fd8c1 Binary files /dev/null and b/_images/santa-monica-pier-cityscape-pink.jpg differ diff --git a/_images/santa-monica-pier-pier-burger.jpg b/_images/santa-monica-pier-pier-burger.jpg new file mode 100644 index 00000000..55789be0 Binary files /dev/null and b/_images/santa-monica-pier-pier-burger.jpg differ diff --git a/_images/santa-monica-pier-sunset-carousel.jpg b/_images/santa-monica-pier-sunset-carousel.jpg new file mode 100644 index 00000000..598c51b7 Binary files /dev/null and b/_images/santa-monica-pier-sunset-carousel.jpg differ diff --git a/_images/santa-monica-pier-sunset-cityscape.jpg b/_images/santa-monica-pier-sunset-cityscape.jpg new file mode 100644 index 00000000..5ee345ce Binary files /dev/null and b/_images/santa-monica-pier-sunset-cityscape.jpg differ diff --git a/_images/santa-monica-pier-sunset-end-of-pier.jpg b/_images/santa-monica-pier-sunset-end-of-pier.jpg new file mode 100644 index 00000000..77947bdb Binary files /dev/null and b/_images/santa-monica-pier-sunset-end-of-pier.jpg differ diff --git a/_images/santa-monica-pier-sunset-end.jpg b/_images/santa-monica-pier-sunset-end.jpg new file mode 100644 index 00000000..45824bf3 Binary files /dev/null and b/_images/santa-monica-pier-sunset-end.jpg differ diff --git a/_images/santa-monica-pier-sunset-people.jpg b/_images/santa-monica-pier-sunset-people.jpg new file mode 100644 index 00000000..6985c88e Binary files /dev/null and b/_images/santa-monica-pier-sunset-people.jpg differ diff --git a/_images/santa-monica-pier-sunset-pier.jpg b/_images/santa-monica-pier-sunset-pier.jpg new file mode 100644 index 00000000..b29ff2ff Binary files /dev/null and b/_images/santa-monica-pier-sunset-pier.jpg differ diff --git a/_images/santa-monica-pier-sunset-steps.jpg b/_images/santa-monica-pier-sunset-steps.jpg new file mode 100644 index 00000000..f81390e3 Binary files /dev/null and b/_images/santa-monica-pier-sunset-steps.jpg differ diff --git a/_images/santa-monica-pier-sunset-view-to-the-right.jpg b/_images/santa-monica-pier-sunset-view-to-the-right.jpg new file mode 100644 index 00000000..0a00b51f Binary files /dev/null and b/_images/santa-monica-pier-sunset-view-to-the-right.jpg differ diff --git a/_images/santa-monica-pier-tacos-1986-and-sunset-ocean.jpg b/_images/santa-monica-pier-tacos-1986-and-sunset-ocean.jpg new file mode 100644 index 00000000..230639c0 Binary files /dev/null and b/_images/santa-monica-pier-tacos-1986-and-sunset-ocean.jpg differ diff --git a/_images/santa-monica-pier-tacos-1986-and-sunset-on-the-beach.jpg b/_images/santa-monica-pier-tacos-1986-and-sunset-on-the-beach.jpg new file mode 100644 index 00000000..f5c91ae0 Binary files /dev/null and b/_images/santa-monica-pier-tacos-1986-and-sunset-on-the-beach.jpg differ diff --git a/_images/santa-monica-pier-tacos-1986-and-sunset-pier.jpg b/_images/santa-monica-pier-tacos-1986-and-sunset-pier.jpg new file mode 100644 index 00000000..73ce4d34 Binary files /dev/null and b/_images/santa-monica-pier-tacos-1986-and-sunset-pier.jpg differ diff --git a/_images/santa-monica-pier-tacos-1986-and-sunset-walking-to-the-pier.jpg b/_images/santa-monica-pier-tacos-1986-and-sunset-walking-to-the-pier.jpg new file mode 100644 index 00000000..830e0679 Binary files /dev/null and b/_images/santa-monica-pier-tacos-1986-and-sunset-walking-to-the-pier.jpg differ diff --git a/_images/santa-monica-promenade-1.jpg b/_images/santa-monica-promenade-1.jpg new file mode 100644 index 00000000..668b3529 Binary files /dev/null and b/_images/santa-monica-promenade-1.jpg differ diff --git a/_images/santa-monica-promenade-2.jpg b/_images/santa-monica-promenade-2.jpg new file mode 100644 index 00000000..6ad7c1d0 Binary files /dev/null and b/_images/santa-monica-promenade-2.jpg differ diff --git a/_images/sarah-p-duke-gardens-ducks.jpg b/_images/sarah-p-duke-gardens-ducks.jpg new file mode 100644 index 00000000..99011592 Binary files /dev/null and b/_images/sarah-p-duke-gardens-ducks.jpg differ diff --git a/_images/sarah-p-duke-gardens-grass-for-days.jpg b/_images/sarah-p-duke-gardens-grass-for-days.jpg new file mode 100644 index 00000000..3d796287 Binary files /dev/null and b/_images/sarah-p-duke-gardens-grass-for-days.jpg differ diff --git a/_images/sarah-p-duke-gardens-overlook.jpg b/_images/sarah-p-duke-gardens-overlook.jpg new file mode 100644 index 00000000..ea6ecb9d Binary files /dev/null and b/_images/sarah-p-duke-gardens-overlook.jpg differ diff --git a/_images/sarah-p-duke-gardens-red-bridge.jpg b/_images/sarah-p-duke-gardens-red-bridge.jpg new file mode 100644 index 00000000..58fd19d0 Binary files /dev/null and b/_images/sarah-p-duke-gardens-red-bridge.jpg differ diff --git a/_images/secure-code-swag.jpg b/_images/secure-code-swag.jpg new file mode 100644 index 00000000..44a6b02d Binary files /dev/null and b/_images/secure-code-swag.jpg differ diff --git a/_images/self-care-sprint.jpg b/_images/self-care-sprint.jpg new file mode 100644 index 00000000..52c5e72a Binary files /dev/null and b/_images/self-care-sprint.jpg differ diff --git a/_images/sheena-mastery-learning-techniques.png b/_images/sheena-mastery-learning-techniques.png new file mode 100644 index 00000000..e9d2ac3c Binary files /dev/null and b/_images/sheena-mastery-learning-techniques.png differ diff --git a/_images/shrimp-and-grits.jpg b/_images/shrimp-and-grits.jpg new file mode 100644 index 00000000..17199182 Binary files /dev/null and b/_images/shrimp-and-grits.jpg differ diff --git a/_images/simba.png b/_images/simba.png new file mode 100644 index 00000000..35249aaf Binary files /dev/null and b/_images/simba.png differ diff --git a/_images/simon-says-counter.jpg b/_images/simon-says-counter.jpg new file mode 100644 index 00000000..52f33fd1 Binary files /dev/null and b/_images/simon-says-counter.jpg differ diff --git a/_images/simon-says-ice-cream.jpg b/_images/simon-says-ice-cream.jpg new file mode 100644 index 00000000..8f389f11 Binary files /dev/null and b/_images/simon-says-ice-cream.jpg differ diff --git a/_images/simon-says-sauce.jpg b/_images/simon-says-sauce.jpg new file mode 100644 index 00000000..7c90b284 Binary files /dev/null and b/_images/simon-says-sauce.jpg differ diff --git a/_images/simon-says-toppings.jpg b/_images/simon-says-toppings.jpg new file mode 100644 index 00000000..2425a574 Binary files /dev/null and b/_images/simon-says-toppings.jpg differ diff --git a/_images/simon-til.png b/_images/simon-til.png new file mode 100644 index 00000000..d2c051e0 Binary files /dev/null and b/_images/simon-til.png differ diff --git a/_images/simon-tweet.png b/_images/simon-tweet.png new file mode 100644 index 00000000..59d22b44 Binary files /dev/null and b/_images/simon-tweet.png differ diff --git a/_images/sitting-here-stunned.png b/_images/sitting-here-stunned.png new file mode 100644 index 00000000..e9df1d33 Binary files /dev/null and b/_images/sitting-here-stunned.png differ diff --git a/_images/source-code-snippet.png b/_images/source-code-snippet.png new file mode 100644 index 00000000..b7cd19af Binary files /dev/null and b/_images/source-code-snippet.png differ diff --git a/_images/standing-ovation.jpg b/_images/standing-ovation.jpg new file mode 100644 index 00000000..6500dca1 Binary files /dev/null and b/_images/standing-ovation.jpg differ diff --git a/_images/state-page.png b/_images/state-page.png new file mode 100644 index 00000000..45816c17 Binary files /dev/null and b/_images/state-page.png differ diff --git a/_images/statue-of-liberty-and-south-manhattan.jpg b/_images/statue-of-liberty-and-south-manhattan.jpg new file mode 100644 index 00000000..0a0534d9 Binary files /dev/null and b/_images/statue-of-liberty-and-south-manhattan.jpg differ diff --git a/_images/still-reflecting.png b/_images/still-reflecting.png new file mode 100644 index 00000000..7bb95829 Binary files /dev/null and b/_images/still-reflecting.png differ diff --git a/_images/strange-loop-2019-me-with-marcia.JPG b/_images/strange-loop-2019-me-with-marcia.JPG new file mode 100644 index 00000000..e935bcfb Binary files /dev/null and b/_images/strange-loop-2019-me-with-marcia.JPG differ diff --git a/_images/street-market-in-tijuana.jpg b/_images/street-market-in-tijuana.jpg new file mode 100644 index 00000000..49ae929b Binary files /dev/null and b/_images/street-market-in-tijuana.jpg differ diff --git a/_images/sunday-night.jpeg b/_images/sunday-night.jpeg new file mode 100644 index 00000000..783379c8 Binary files /dev/null and b/_images/sunday-night.jpeg differ diff --git a/_images/sunset-illuminating-the-marina.jpg b/_images/sunset-illuminating-the-marina.jpg new file mode 100644 index 00000000..70da549b Binary files /dev/null and b/_images/sunset-illuminating-the-marina.jpg differ diff --git a/_images/swag-stuffing.jpg b/_images/swag-stuffing.jpg new file mode 100644 index 00000000..410bd2c2 Binary files /dev/null and b/_images/swag-stuffing.jpg differ diff --git a/_images/swag.jpg b/_images/swag.jpg new file mode 100644 index 00000000..d0efe974 Binary files /dev/null and b/_images/swag.jpg differ diff --git a/_images/swag1.jpg b/_images/swag1.jpg new file mode 100644 index 00000000..bb97ddd0 Binary files /dev/null and b/_images/swag1.jpg differ diff --git a/_images/tables-turned.jpg b/_images/tables-turned.jpg new file mode 100644 index 00000000..b357b4a3 Binary files /dev/null and b/_images/tables-turned.jpg differ diff --git a/_images/taco-stand.jpg b/_images/taco-stand.jpg new file mode 100644 index 00000000..dc1429d1 Binary files /dev/null and b/_images/taco-stand.jpg differ diff --git a/_images/tech-sector-stats-1.png b/_images/tech-sector-stats-1.png new file mode 100644 index 00000000..823c7265 Binary files /dev/null and b/_images/tech-sector-stats-1.png differ diff --git a/_images/tech-sector-stats-2.png b/_images/tech-sector-stats-2.png new file mode 100644 index 00000000..e9621745 Binary files /dev/null and b/_images/tech-sector-stats-2.png differ diff --git a/_images/tenth-street-water-feature.jpg b/_images/tenth-street-water-feature.jpg new file mode 100644 index 00000000..637775f2 Binary files /dev/null and b/_images/tenth-street-water-feature.jpg differ diff --git a/_images/terminal-tower.jpg b/_images/terminal-tower.jpg new file mode 100644 index 00000000..82b16e2b Binary files /dev/null and b/_images/terminal-tower.jpg differ diff --git a/_images/test-card-from-andy.jpg b/_images/test-card-from-andy.jpg new file mode 100644 index 00000000..f940b2d1 Binary files /dev/null and b/_images/test-card-from-andy.jpg differ diff --git a/_images/thank-you-card.jpg b/_images/thank-you-card.jpg new file mode 100644 index 00000000..28985e8b Binary files /dev/null and b/_images/thank-you-card.jpg differ diff --git a/_images/thank-you-dinner.jpg b/_images/thank-you-dinner.jpg new file mode 100644 index 00000000..eb9973be Binary files /dev/null and b/_images/thank-you-dinner.jpg differ diff --git a/_images/thank-you-memo.jpg b/_images/thank-you-memo.jpg new file mode 100644 index 00000000..60499f20 Binary files /dev/null and b/_images/thank-you-memo.jpg differ diff --git a/_images/thank-you-to.png b/_images/thank-you-to.png new file mode 100644 index 00000000..267d8e86 Binary files /dev/null and b/_images/thank-you-to.png differ diff --git a/_images/the-can-opener.jpg b/_images/the-can-opener.jpg new file mode 100644 index 00000000..ef9cb34c Binary files /dev/null and b/_images/the-can-opener.jpg differ diff --git a/_images/the-djangocon-us-cfp.png b/_images/the-djangocon-us-cfp.png new file mode 100644 index 00000000..165ca19c Binary files /dev/null and b/_images/the-djangocon-us-cfp.png differ diff --git a/_images/the-durham-hotel-lobby.jpg b/_images/the-durham-hotel-lobby.jpg new file mode 100644 index 00000000..9633da7a Binary files /dev/null and b/_images/the-durham-hotel-lobby.jpg differ diff --git a/_images/the-durham-hotel-roof-left.jpg b/_images/the-durham-hotel-roof-left.jpg new file mode 100644 index 00000000..10e8ae25 Binary files /dev/null and b/_images/the-durham-hotel-roof-left.jpg differ diff --git a/_images/the-durham-hotel-roof-right.jpg b/_images/the-durham-hotel-roof-right.jpg new file mode 100644 index 00000000..3032d477 Binary files /dev/null and b/_images/the-durham-hotel-roof-right.jpg differ diff --git a/_images/the-getty-center-entrance-hall.jpg b/_images/the-getty-center-entrance-hall.jpg new file mode 100644 index 00000000..eae58bed Binary files /dev/null and b/_images/the-getty-center-entrance-hall.jpg differ diff --git a/_images/the-getty-center-fountain.jpg b/_images/the-getty-center-fountain.jpg new file mode 100644 index 00000000..4a022fe5 Binary files /dev/null and b/_images/the-getty-center-fountain.jpg differ diff --git a/_images/the-getty-central-garden.jpg b/_images/the-getty-central-garden.jpg new file mode 100644 index 00000000..e67757ed Binary files /dev/null and b/_images/the-getty-central-garden.jpg differ diff --git a/_images/the-getty-irises.jpg b/_images/the-getty-irises.jpg new file mode 100644 index 00000000..df64d66c Binary files /dev/null and b/_images/the-getty-irises.jpg differ diff --git a/_images/the-griffith-observatory-architecture.jpg b/_images/the-griffith-observatory-architecture.jpg new file mode 100644 index 00000000..9cac5416 Binary files /dev/null and b/_images/the-griffith-observatory-architecture.jpg differ diff --git a/_images/the-griffith-observatory-entrance-hall.jpg b/_images/the-griffith-observatory-entrance-hall.jpg new file mode 100644 index 00000000..313c9d61 Binary files /dev/null and b/_images/the-griffith-observatory-entrance-hall.jpg differ diff --git a/_images/the-griffith-observatory-view.jpg b/_images/the-griffith-observatory-view.jpg new file mode 100644 index 00000000..1e7756af Binary files /dev/null and b/_images/the-griffith-observatory-view.jpg differ diff --git a/_images/the-loaf-brownie.jpg b/_images/the-loaf-brownie.jpg new file mode 100644 index 00000000..674eb6f6 Binary files /dev/null and b/_images/the-loaf-brownie.jpg differ diff --git a/_images/the-parlour-flavors.jpg b/_images/the-parlour-flavors.jpg new file mode 100644 index 00000000..9fd4d73c Binary files /dev/null and b/_images/the-parlour-flavors.jpg differ diff --git a/_images/the-parlour.jpg b/_images/the-parlour.jpg new file mode 100644 index 00000000..905c9ada Binary files /dev/null and b/_images/the-parlour.jpg differ diff --git a/_images/the-parlour1.jpg b/_images/the-parlour1.jpg new file mode 100644 index 00000000..008a9148 Binary files /dev/null and b/_images/the-parlour1.jpg differ diff --git a/_images/the-pit-dining-room.jpg b/_images/the-pit-dining-room.jpg new file mode 100644 index 00000000..3da5814f Binary files /dev/null and b/_images/the-pit-dining-room.jpg differ diff --git a/_images/the-pit-meal.jpg b/_images/the-pit-meal.jpg new file mode 100644 index 00000000..79a67224 Binary files /dev/null and b/_images/the-pit-meal.jpg differ diff --git a/_images/this-makes-me-smile.png b/_images/this-makes-me-smile.png new file mode 100644 index 00000000..df210c47 Binary files /dev/null and b/_images/this-makes-me-smile.png differ diff --git a/_images/tif-cup.jpg b/_images/tif-cup.jpg new file mode 100644 index 00000000..7601b634 Binary files /dev/null and b/_images/tif-cup.jpg differ diff --git a/_images/tim-welcome.jpg b/_images/tim-welcome.jpg new file mode 100644 index 00000000..be77fdeb Binary files /dev/null and b/_images/tim-welcome.jpg differ diff --git a/_images/times-square.jpg b/_images/times-square.jpg new file mode 100644 index 00000000..8e83bc40 Binary files /dev/null and b/_images/times-square.jpg differ diff --git a/_images/tims-talk.jpg b/_images/tims-talk.jpg new file mode 100644 index 00000000..3bc13578 Binary files /dev/null and b/_images/tims-talk.jpg differ diff --git a/_images/tool-safety-zine.jpg b/_images/tool-safety-zine.jpg new file mode 100644 index 00000000..2e487641 Binary files /dev/null and b/_images/tool-safety-zine.jpg differ diff --git a/_images/tox-folder.png b/_images/tox-folder.png new file mode 100644 index 00000000..48d1e602 Binary files /dev/null and b/_images/tox-folder.png differ diff --git a/_images/tox-success.png b/_images/tox-success.png new file mode 100644 index 00000000..b813a3c7 Binary files /dev/null and b/_images/tox-success.png differ diff --git a/_images/trilogy.jpg b/_images/trilogy.jpg new file mode 100644 index 00000000..c5ad5700 Binary files /dev/null and b/_images/trilogy.jpg differ diff --git a/_images/universal-citywalk.jpg b/_images/universal-citywalk.jpg new file mode 100644 index 00000000..5808ad2f Binary files /dev/null and b/_images/universal-citywalk.jpg differ diff --git a/_images/universal-me-and-max.jpg b/_images/universal-me-and-max.jpg new file mode 100644 index 00000000..b5de0ddf Binary files /dev/null and b/_images/universal-me-and-max.jpg differ diff --git a/_images/universal-psycho-bates-motel.jpg b/_images/universal-psycho-bates-motel.jpg new file mode 100644 index 00000000..3893f105 Binary files /dev/null and b/_images/universal-psycho-bates-motel.jpg differ diff --git a/_images/universal-psycho-house.jpg b/_images/universal-psycho-house.jpg new file mode 100644 index 00000000..85647211 Binary files /dev/null and b/_images/universal-psycho-house.jpg differ diff --git a/_images/unscripted-rooftop-pool.jpg b/_images/unscripted-rooftop-pool.jpg new file mode 100644 index 00000000..7f4590a8 Binary files /dev/null and b/_images/unscripted-rooftop-pool.jpg differ diff --git a/_images/velda-and-john-with-swag-bag-signed-by-famous-people.jpg b/_images/velda-and-john-with-swag-bag-signed-by-famous-people.jpg new file mode 100644 index 00000000..67001303 Binary files /dev/null and b/_images/velda-and-john-with-swag-bag-signed-by-famous-people.jpg differ diff --git a/_images/venice-beach-boardwalk.jpg b/_images/venice-beach-boardwalk.jpg new file mode 100644 index 00000000..08a2a1ce Binary files /dev/null and b/_images/venice-beach-boardwalk.jpg differ diff --git a/_images/venice-beach-pier.jpg b/_images/venice-beach-pier.jpg new file mode 100644 index 00000000..eb16eb74 Binary files /dev/null and b/_images/venice-beach-pier.jpg differ diff --git a/_images/venice-beach-santa-monica-pier-sun.jpg b/_images/venice-beach-santa-monica-pier-sun.jpg new file mode 100644 index 00000000..bc12a35f Binary files /dev/null and b/_images/venice-beach-santa-monica-pier-sun.jpg differ diff --git a/_images/venice-beach-santa-monica-pier.jpg b/_images/venice-beach-santa-monica-pier.jpg new file mode 100644 index 00000000..8c2d767d Binary files /dev/null and b/_images/venice-beach-santa-monica-pier.jpg differ diff --git a/_images/venice-beach-skateboarding-park.jpg b/_images/venice-beach-skateboarding-park.jpg new file mode 100644 index 00000000..865e8b17 Binary files /dev/null and b/_images/venice-beach-skateboarding-park.jpg differ diff --git a/_images/venice-beach-waves-crashing-1.jpg b/_images/venice-beach-waves-crashing-1.jpg new file mode 100644 index 00000000..27772deb Binary files /dev/null and b/_images/venice-beach-waves-crashing-1.jpg differ diff --git a/_images/venice-beach-waves-crashing-2.jpg b/_images/venice-beach-waves-crashing-2.jpg new file mode 100644 index 00000000..9ecc95d4 Binary files /dev/null and b/_images/venice-beach-waves-crashing-2.jpg differ diff --git a/_images/via-alloro.jpg b/_images/via-alloro.jpg new file mode 100644 index 00000000..55e0e786 Binary files /dev/null and b/_images/via-alloro.jpg differ diff --git a/_images/view-source.png b/_images/view-source.png new file mode 100644 index 00000000..42e23670 Binary files /dev/null and b/_images/view-source.png differ diff --git a/_images/warhol-simba.png b/_images/warhol-simba.png new file mode 100644 index 00000000..1f007973 Binary files /dev/null and b/_images/warhol-simba.png differ diff --git a/_images/warner-brothers-awards.jpg b/_images/warner-brothers-awards.jpg new file mode 100644 index 00000000..17554926 Binary files /dev/null and b/_images/warner-brothers-awards.jpg differ diff --git a/_images/warner-brothers-community-backlot.jpg b/_images/warner-brothers-community-backlot.jpg new file mode 100644 index 00000000..3a3ca936 Binary files /dev/null and b/_images/warner-brothers-community-backlot.jpg differ diff --git a/_images/warner-brothers-friends-couch.jpg b/_images/warner-brothers-friends-couch.jpg new file mode 100644 index 00000000..56ae6395 Binary files /dev/null and b/_images/warner-brothers-friends-couch.jpg differ diff --git a/_images/warner-brothers-friends-set.jpg b/_images/warner-brothers-friends-set.jpg new file mode 100644 index 00000000..b5fc76e7 Binary files /dev/null and b/_images/warner-brothers-friends-set.jpg differ diff --git a/_images/warner-brothers-harry-potter-spells.jpg b/_images/warner-brothers-harry-potter-spells.jpg new file mode 100644 index 00000000..2cfcefb5 Binary files /dev/null and b/_images/warner-brothers-harry-potter-spells.jpg differ diff --git a/_images/warner-brothers-mr-freeze-joker-oz-riddler-costumes.jpg b/_images/warner-brothers-mr-freeze-joker-oz-riddler-costumes.jpg new file mode 100644 index 00000000..3cd129c1 Binary files /dev/null and b/_images/warner-brothers-mr-freeze-joker-oz-riddler-costumes.jpg differ diff --git a/_images/what-can-the-dsf.jpg b/_images/what-can-the-dsf.jpg new file mode 100644 index 00000000..23832600 Binary files /dev/null and b/_images/what-can-the-dsf.jpg differ diff --git a/_images/yury-efficient-immutability.png b/_images/yury-efficient-immutability.png new file mode 100644 index 00000000..2034eb41 Binary files /dev/null and b/_images/yury-efficient-immutability.png differ diff --git a/_images/yury-node-copy.png b/_images/yury-node-copy.png new file mode 100644 index 00000000..49c45642 Binary files /dev/null and b/_images/yury-node-copy.png differ diff --git a/_images/yury-shared-state-no-pickle.png b/_images/yury-shared-state-no-pickle.png new file mode 100644 index 00000000..83f2f2b6 Binary files /dev/null and b/_images/yury-shared-state-no-pickle.png differ diff --git a/_sources/2020-year-in-review.md.txt b/_sources/2020-year-in-review.md.txt new file mode 100644 index 00000000..9d29fe2c --- /dev/null +++ b/_sources/2020-year-in-review.md.txt @@ -0,0 +1,176 @@ +# 2020 Year in Review + +Thank you to [Dawn Wages](https://twitter.com/DawnWagesSays/status/1337212013014110209) for inspiring me to do a Year in Review blog post! + +## TL;DR + +This year could have been better for me, but it also could have been much worse. + +My highlights for the year have been: +* Attending PyCascades 2020 in February +* Taking part in Stanford Code in Place in April and subsequently participating in 100 Days of Code +* Completing an important Pinax release in July that was a personal and professional milestone +* Resuming public speaking in September +* Working on an amazing Wharton Business School project, Simpl game simulation framework, for the last couple of months. + +Although it has been a difficult year, I've achieved some knowledge and skill "step changes" that I think have added some invaluable experience to my resume. This has helped me to cope. I can't control everything, but I can control my attitude and actions. I will give a recap of these step changes at the end of my blog post. :) + +## PyCascades 2020 + +In early February, I attended [PyCascades 2020](https://2020.pycascades.com/) for the first time, in Portland, Oregon. At the time, there was just a handful of Covid cases in the region. For me, PyCascades will forever be a dream-like memory of normalcy and naïveté before Covid hit. + +The atmosphere at PyCascades 2020 was amazing. It was held at [Revolution Hall](https://www.revolutionhall.com/), a former high school on the east side of Portland that was renovated into an event space. + +![](2020-year-in-review-images/revolution-hall.jpg) +The entrance to Revolution Hall + +The talks were as great as you'd expect and I enjoyed the "hallway track" too. I saw many "old" friends there and made plenty of new ones. Notably, I met a number of "famous" Python folks, too. :) + +A few memorable moments: +* Meeting [Al Sweigart](https://twitter.com/AlSweigart), one of my favorite Python authors +* Chatting with [Joanne Hastie](https://twitter.com/JoanneHastieArt) about using robots and AI to make fine art +* Getting some insight from [Moshe Zadka](https://twitter.com/moshezadka) into the success of Israeli startups +* Making a new GIS friend [Ana Leticia](https://twitter.com/AnaLeticiaGIS) +* Meeting [Scott Shawcroft](https://twitter.com/tannewt) (CircuitPython project lead), [David Lord](https://twitter.com/davidism) (Flask maintainer), and [Timothy Crosley](https://twitter.com/timothycrosley) (isort author) + +One of the highlights of the conference was eating dinner with [Guido van Rossum](https://en.wikipedia.org/wiki/Guido_van_Rossum), the original author of Python, and friends at [Grassa](https://www.grassapdx.com/), a "handcrafted pasta" restaurant. Guido told us some stories from the early days of Python. It was quite an evening. + +![](2020-year-in-review-images/dinner-with-guido.jpg) +Dinner with Guido (he's the one waving!)... what fun; photo credit: Jonan Scheffler, used with permission + +While I was in Portland, I also enjoyed Cuban food at [Cubo](https://www.cuboportland.com/), Lebanese and Mediterranean food at [Nicholas Restaurant](http://nicholasrestaurant.com/), and Mexican food at [La Morenita](https://www.facebook.com/La-morenita-mexican-food-687319458053736/) food truck. All of the food was super delicious and I'd love to go back and eat it again! :) + +![](2020-year-in-review-images/cubo.jpg) +Ropita at Cubo: shredded beef brisket stewed with tomato, vegetables and traditional Cuban spices, served with white rice, black beans, mango, avocado, maduros and tostone + +![](2020-year-in-review-images/nicholas-restuarant.jpg) +Chicken Kabob Lunch Bowl at Nicholas Restaurant: chicken breast marinated in olive oil, garlic, yogurt, paprika, and lemon, served with tzatziki and toum, saffron jasmine rice, and cabbage garbanzo salad; not pictured: yummy hummus and warm pita bread + +![](2020-year-in-review-images/la-morenita-food-truck.jpg) +Morenita Burrito at La Morenita Food Truck: steak, chile relleno, beans, cheese, lettuce, pico de gallo, and guacamole in a flour tortilla + +I enjoyed a birdseye view of Portland while riding the [Portland Aerial Tram](https://www.ohsu.edu/visit/tram) and visited the picturesque [Portland Japanese Garden](https://japanesegarden.org/). + +![](2020-year-in-review-images/portland-aerial-tram.jpg) +The view from the Portland Aerial Tram upper platform + +![](2020-year-in-review-images/me-at-the-portland-japanese-garden.jpg) +Me at the Portland Japanese Garden... a kind stranger saw me taking photos and offered to take mine + +![](2020-year-in-review-images/portland-japanese-garden-bridge.jpg) +The iconic Moon Bridge at the Portland Japanese Garden... breathtaking + +![](2020-year-in-review-images/portland-japanese-garden-waterfall.jpg) +The iconic Heavenly Falls at the Portland Japanese Garden... wow! + +From the moment I arrived in Portland, it came across as a relaxed city full of very nice people. For instance, I was pleasantly taken aback one morning, while walking down the sidewalk, when a stranger kindly said "good morning" to me. That's something I might expect in small town Kansas, not in a city as big as Portland. I loved the food truck culture. And the city itself was quirky and beautiful. It's a potentially triggering subject, but I feel it would be remiss to not acknowledge that a KKK rally took place in the downtown during one of the conference days. During the trip, as I learned more about Oregon's history of racism, I found it to be very disturbing and a reminder of the complexities in our past and, unfortunately, present. + +I've enjoyed having the opportunity to attend a few online conferences and meetups, especially ones I wouldn't normally be able to attend, but nothing takes the place of an in-person event full of interesting people in a city that you'd love to get to know better. + +## Stanford Code in Place and 100 Days of Code + +In late March, while I was looking through my Twitter news feed, I came across a [tweet](https://twitter.com/chrispiech/status/1244692768431038473) about a one-time [Python](https://www.python.org/) programming course called Stanford Code in Place. + +[Mehran Sahami](http://robotics.stanford.edu/users/sahami/bio.html) and [Chris Piech](https://stanford.edu/~cpiech/bio/index.html) teach Stanford's introductory Python course CS106A. Because of shelter-in-place, they decided to open the course to the public. They would teach the traditional CS106A version and public Code in Place version simultaneously. + +I applied and was chosen to participate. Although I was much more familiar with Python than some of the other participants, I used it as an opportunity to reinforce concepts and kickstart making some new fun and practical apps from scratch. Although my "section" had a dedicated leader, I was also able to provide some informal mentoring to other members of the group. + +I won't write much about my Stanford Code in Place experience here, because you can read about it in my [Reflections on Stanford Code in Place](https://github.com/KatherineMichel/portfolio/blob/master/regular-blog-posts/reflections-on-stanford-code-in-place.md) blog post. It was a fun and unique experience and I think I got a lot out of it, including making [Simba Friends Twitter Bot](https://github.com/KatherineMichel/stanford-code-in-place-final-project). + +After Stanford Code in Place ended, I decided to keep the momentum of making apps going by participating in 100 Days of Code. The highlight has been completing several small projects and writing about the process I went through and what I learned. + +A few of my favorite 100 Days of Code project blog posts from this year: +* [Building a Taco John's Scraper Blog Post](https://github.com/KatherineMichel/portfolio/blob/master/regular-blog-posts/building-a-taco-johns-scraper.md) +* [TIL- 100 Days of Code Version Blog Post](https://github.com/KatherineMichel/portfolio/blob/master/regular-blog-posts/til-100-days-of-code-version.md) and [GitHub Repo](https://github.com/KatherineMichel/til-100-days-of-code-version/) +* [Hacktoberfest PRs- 2020 Blog Post](https://github.com/KatherineMichel/portfolio/blob/master/regular-blog-posts/hacktoberfest-prs-2020.md) + +## Pinax Release + +In July, I oversaw the completion of an important [Pinax](https://github.com/pinax/) release. It was a huge milestone for me, personally and professionally. Not only did I initiate the release, but I managed the end-to-end process. I created the release plan, oversaw the work of others, updated 10 apps myself, merged all of the PRs, and tagged and published the packages. I really took the bull by the horns and learned a lot in the process, I'm happy to say. :) + +It was no small task, though. Many of the original Pinax authors were Django core devs and it shows. Pinax is a large and complex library of open-source, professional quality, interdependent Django projects and apps, including sophisticated testing, packaging, and continuous integration configurations. The Pinax GitHub organization alone has around 80 repos. + +One of my goals for this release was to make it easier for people to get started contributing to Pinax. I began by creating a detailed [Pinax 20.XX Release Plan](https://github.com/pinax/pinax/wiki/Pinax-20.XX-Release-Plan) that put into writing for the first time, the Pinax "way of doing things." I was thrilled that contributors were able to use this documentation to complete a large portion of the work, with occasional support from me. + +Notably, in this release, support was dropped for Python 2.7, and support was added for Python 3.6+ and Django 3.0. + +A number of people contributed to the release in many different and important ways, but I couldn't have finished the release without the generous contribution of [Mfon Eti-mfon](https://twitter.com/mfonism). + +As a first time contributor, Mfon provided expertise in dropping Python 2 support, dropped and added support for Python and Django versions in 14 apps, including Django User Accounts, and created a script to automate the addition of contributors to the AUTHORS files. He also reviewed all of the code changes with me, to ensure that the best choices were made. I'm so grateful for the contributions that he made to the Pinax release and I'm thrilled that he was recently elected to the [Django Software Foundation Board](https://www.djangoproject.com/weblog/2020/dec/10/2021-dsf-board-election-results/). + +### Release Highlights + +Contributors, issues, and PRs since the previous release: +* Dozens of contributors opened issues, submitted PRs, and provided support +* Over 160 issues were closed +* Over 100 PRs were merged +* Over 30 PRs were closed + +Release overview: +* Around 28 Pinax apps were included +* Support was dropped for Django 1.11, 2.0, and 2.1, and Python 2,7, 3.4, and 3.5 +* Support was added for Django 2.2 and 3.0, and Python 3.6, 3.7, and 3.8 +* Version testing, continuous integration, and packaging configurations were updated + +Documentation and discoverability: +* The Pinax release and maintainer processes were extensively documented for the first time +* The number of files in repos was reduced and configurations standardized across repos in order to make repos more approachable and more easily documented +* Community documents were created or revised if out-of-date, and moved to central locations + +Community: +* A new Community Plan created a strategy to make it easier for users and contributors to get started +* A new "Important Links" section at the top of each README.md will help people find what they need + +## Public Speaking + +In 2017, I became an open source maintainer for the first time, then created a talk about what I'd learned about using Git and GitHub for collaboration and code review. I gave the talk at DjangoCon US 2017 (my first ever conference and talk!), PyLadies Remote, and at a DevICT Hacktoberfest meetup. + +![](2020-year-in-review-images/djangocon-us-2017-talk.jpg) +Me on stage giving my talk at DjangoCon US 2017, my first ever conference and talk + +In September, a PyLadies Southwest Florida organizer came across the talk and asked me to give the talk virtually to an audience that would consist of members of PyLadies Southwest Florida, PyLadies Miami, SWFL Coders, SWFL Data, and FGCU SEC Meetup. + +I was delighted to be asked to do it. + +I had the choice to give the talk a week and a half later, or a month or more in the future. After some thought, I decided to give the talk in a week and a half. I knew that the talk would not be "better" in a month or more. Putting the talk off would just give me the opportunity to prolong any fear I might have of giving my first virtual talk to an audience of this size. Doing this kind of thing isn't easy, but it's satisfying to face my fear head on. + +With Hacktoberfest beginning only a few days later, the timing of my talk could not have been better. I spent some time updating the talk to incorporate some things I had learned since 2017. You can see a copy of the slides and script in the [talk repo](https://github.com/KatherineMichel/get-a-jumpstart-on-collaboration-and-code-review-in-github-pyladies-southwest-florida). + +I was extremely happy with how the talk went. The audience was fairly large for a local meetup... around 50 people had signed up to attend. + +My presentation lasted for around 45 minutes, followed by questions. I was really at ease and it went very well. There were a lot of positive comments and they would like for me to return sometime. + +At that time, I also got some good news about a talk proposal I had submitted to the PyCon US 2020 Maintainers Summit, which was cancelled. My talk proposal, entitled "[Bringing Pinax Back to Life](https://github.com/KatherineMichel/portfolio/blob/master/talk-proposals/pycon-us-2020-maintainers-summit.md)", had been accepted and was thought to be "excellent." Perhaps I will have the opportunity to give that talk in the future, which I would absolutely love to do. :) + +## The Wharton School and Simpl + +For the last couple of months, I've been working on a project for The Wharton School at the University of Pennsylvania. + +I'm a Technical Writer and Advisor for an open-source game simulation framework known as [Simpl](https://simpl.world/). + +Built using Python, Django, and React, and hosted on [GitHub](https://github.com/simplworld/), Simpl has the potential to democratize game simulation access everywhere. + +It's a pretty amazing initiative and I'm thrilled to be taking part. + +I'm excited to watch the future of it unfold in classrooms and beyond. + +## Step Changes Recap + +Like I said at the beginning of this post, during this difficult year, I've achieved some knowledge and skill "step changes" that I think have added some invaluable experience to my resume. This is a work in progress. :) + +My step changes have fallen under a few different categories: +* Doing things that seem scary (and they often turn out to be not that scary, actually) +* Combining skills that I'm already good at with skills that are more difficult for me, to reach new heights +* Completing projects, then writing about what I learned or achieved +* Learning from the experts around me and producing higher quality work as a result +* Doing a better job of recording information for my portfolio, resume, and doing career-related research + +My major step changes this year: +* Gaining technical writing and product/market experience while working for Wharton School's Simpl game simulation project +* Initiated and oversaw an important Pinax release, managing the end-to-end process for the first time +* Kickstarted by Stanford Code in Place, spent more time making fun and useful apps and teaching others how to do it +* Wrote a number of blog posts about my projects, conferences I attended, and other learning experiences +* Gave a virtual talk to a fairly sizeable meetup audience and had another talk accepted +* Had several experts review my resume and am revising it accordingly +* Did pay rate research and sought pay rate advice from experts +* Used my people skills more, including reaching out to my connections for help more often diff --git a/_sources/2023-recap.md.txt b/_sources/2023-recap.md.txt new file mode 100644 index 00000000..181e6030 --- /dev/null +++ b/_sources/2023-recap.md.txt @@ -0,0 +1,194 @@ +# 2023 Recap + +## Daily Work + +Throughout the year, I led/co-led the completion of a variety of substantial code features at JPMorgan Chase. I had the opportunity to lead team meetings such as Sprint Retro and Sprint Review and Demo. I gave code deep dives and demos to team members and managers. + +I was an onsite liaison to Gaia Gemfire Team. + +I went further in my understanding of multitenancy and orchestration. + +This knowledge and experience led to some wonderful, impromptu conversations at DjangoCon US with former Canonical employee, now new Django Fellow Natalia Bidart and a group of Red Hat employees I had the good fortune to sit with at lunch. + +## Quality, Standards, Inner source + +Throughout the year, I documented Python/Django standards and code quality tools. + +I shared my open source experience. I documented best-in-class open source and inner source governance resources and methods. + +I mentored an apprentice in doing so. + +In November, a co-worker and I co-presented about Advent of Code and increased the number of participants within our department. + +![](2023-recap/aoc-presentation.jpg) +Advent of Code Presentation + +## New Certifications + +Continuous learning is important to me. This year, I earned three new certifications. + +In May, I obtained an [AWS Cloud Practitioner Certification](https://aws.amazon.com/certification/certified-cloud-practitioner/). This certification has enabled me to better "speak" the common language of AWS. + +In July, I obtained CockroachDB [Introduction to Distributed SQL and CockroachDB](https://university.cockroachlabs.com/courses/course-v1:crl+intro-to-distributed-sql-and-cockroachdb+self-paced/about) and [Practical First Steps with CockroachDB](https://university.cockroachlabs.com/courses/course-v1:crl+practical-first-steps-with-crdb+self-paced/about) certifications. I really enjoyed [CockroachDB University](https://university.cockroachlabs.com/). The lessons were succint, yet very well communicated how CockroachDB works and what sets it apart from Postgres. + +## Tangential Learning + +I learned the term "tangential learning" from my colleague and friend Neetu Jain who also happens to be the DFW Women in Product Chapter Lead/Chair. + +Throughout the year, I attended JPMorgan Chase Product Ignite and DFW Women in Product events. The content was outstanding, and I thoroughly enjoyed the focus on user. + +During the second quarter, I took part in a five-part security competition and finished close to the top 10%. + +![](2023-recap/secure-code-swag.jpg) +Secure Code swag + +## PS Connect + +In July, I obtained sponsorship from a JPMorgan Chase Managing Director to start a monthly departmental meetup in Plano that became known as PS Connect. I have had the opportunity to work with tech leads across teams to execute a highly successful launch and continue to grow it into a fun, sustainable, and value adding event. + +I was invited to give a DjangoCon US Recap presentation at our PS Connect Christmas Party December 6. It was a great opportunity to do some public speaking and get to know my department colleagues better. + +![](2023-recap/christmas-party-presentation-1.jpg)
+Christmas Party presentation + +![](2023-recap/christmas-party-presentation-2.jpg)
+Christmas Party presentation + +I am looking forward to seeing the new connections yet to come. + +## Diversity and Inclusion + +During the second quarter, I completed a JPMorgan Chase [Women on the Move](https://www.jpmorganchase.com/impact/people/women-on-the-move) (WoTM) Career Development Program. This outstanding program featured high impact modules on subjects such as fixed versus growth mindset, skill inventory, and an outstanding negotiation workshop led by Kathryn Valentine of [Worthmore Strategies](https://worthmorestrategies.com/). + +Throughout the year, I had the opportunity to attend a number of powerful, internal WoTM and Take It Forward (TIF) events. + +In June, I took part in the JPMorgan Chase Innovation Week Global Hackathon with a project in the DE&I category. My teammates' backgrounds ranged from product to user experience and design. We participated in the finals. Although we did not win, it was a great experience, and I made some new friends. + +![](2023-recap/hackathon-team.jpg) +My wonderful hackathon Team... so talented and passionate! + +![](2023-recap/tif-cup.jpg) +Beautiful Take It Forward (TIF) Cup + +## DEFNA + +I served another year as a [DEFNA](https://www.defna.org/) Board Member. I challenged myself to do more "heavy lifting." + +During the first quarter, I helped oversee the [DjangoCon US](https://2023.djangocon.us/) website design by publishing our CfP, working to secure a web design contractor, and taking part in website design meetings. + +In May, I created a [DjangoCon US Talk Topics Inspiration List](https://github.com/KatherineMichel/portfolio/blob/master/conference-blog-posts/topic-ideas-djangocon-us-2023.md) that was widely shared among leaders in the Django community and undoubtedly contributed to the number of DjangoCon US talk proposals increasing from 158 the year before to 185. + +The list kickstarted a conversation that led to a talk by new Django Fellow Natalia Bidart: "[Inside Out: My Journey of Understanding Inclusion](https://www.youtube.com/watch?v=jYAeO37-420)." + +I went further in my understanding of our location/venue considerations, budget, and contract negotiations. + +I also identified an outstanding board candidate who later joined. + +## DjangoCon US + +In October, I attended DjangoCon US and made the most of the experience. + +In addition to being there as a DEFNA Board member, as an attendee, I made many new connections (including [Python Software Foundation (PSF) Executive Director Deb Nicholson](https://www.python.org/psf/records/staff/) and [Django Fellow Natalia Bidart](https://www.djangoproject.com/weblog/2023/mar/31/welcome-our-new-fellow-natalia-bidart/)), acquired new knowledge, and supported diversity and inclusion. + +See my [DjangoCon US Recap](https://github.com/KatherineMichel/portfolio/blob/master/conference-blog-posts/recap-of-djangocon-us-2023.md) for more info. + + + +## Django News Newsletter + +Django News Newsletter is a fabulous newsletter published every Friday and filled with all of the most important Django news. I was honored to be included twice this year, first in May for my [DjangoCon US Talk Topics Inspiration List](https://github.com/KatherineMichel/portfolio/blob/master/conference-blog-posts/topic-ideas-djangocon-us-2023.md) and second in November for my [DjangoCon US Recap](https://github.com/KatherineMichel/portfolio/blob/master/conference-blog-posts/recap-of-djangocon-us-2023.md). + +## Stanford Code in Place Article + +In April, Stanford Engineering featured me an article "[Stanford Engineering offers free online introductory programming course](https://engineering.stanford.edu/magazine/stanford-engineering-offers-free-online-introductory-programming-course)". I talked about my experience learning and teaching Python programming language as a Stanford Code in Place student in 2020 and section leader in 2021. It was an honor to be selected to take part from among thousands of participants. + +For more about my experience, check out my student recap "[Reflections on Stanford Code in Place](https://github.com/KatherineMichel/portfolio/blob/master/regular-blog-posts/reflections-on-stanford-code-in-place.md)" or my section leader [recap slides](https://github.com/KatherineMichel/stanford-code-in-place-section-leader). + +## Harvest Moon + +On September 29 at 7:14 am, I happened to be walking down the campus main street, which I don't normally do. I looked up and saw the harvest moon. I snapped this stunning photo. + +![](2023-recap/harvest-moon.jpg) +Harvest Moon + +## Travel, Food, and Fun + +Throughout the year, I enjoyed what Plano had to offer. Thank you to my Plano friends for some great times! See a few pics at the end of this post. + +In December, I took the Los Angeles trip that I've been dreaming of taking for years. I'd had this trip planned twice before and cancelled, once due to wild fires, and once due to the pandemic. It was the last major US city on my bucket list. With Santa Monica as my "home base," I spent 9 days seeing the city. I plan to do a separate write-up of the trip soon. Stay tuned! + +![](2023-recap/friends-set.jpg) +Me on the Friends set during Warner Brothers Studio Tour + +## Looking Ahead + +I look forward to taking on increasingly more leadership on my team. + +I look forward to empowering engineers, including me, to produce higher quality code, be more productive, and engage with the wider community. + +A co-worker has invited me to teach beginner/intermediate Django to our colleagues at JPMorgan Chase. I hope to finish the curriculum in early 2024 and teach multiple sessions throughout the year. This is in addition to an offer to teach Python. + +I plan to attend [PyTexas](https://www.pytexas.org/) in Austin in April. It's a stone's throw from Plano and a conference I have wanted to attend for quite a few years. The conference will have a stellar kickoff with keynotes by [Carol Willing and Lynn Root](https://www.pytexas.org/2024/schedule/keynotes/)! + +I have yet to determine which other conference(s) I will attend, if any. Other conferences on my radar: PyCon US, DjangoCon US, DjangoCon Europe, PyCon Africa, PyGotham. + +I hope to visit Europe. It's next on my bucket list. :) + +## Plano Fun + +![](2023-recap/brasao-1.jpg) +Brasão Brazilian Steakhouse + +![](2023-recap/brasao-2.jpg) +Brasão Brazilian Steakhouse... many tasty meats brought to your table and sliced for you + +![](2023-recap/brasao-3.jpg) +Brasão Brazilian Steakhouse... authentic Brazilian side dishes + +![](2023-recap/brasao-4.jpg) +Brasão Brazilian Steakhouse... forget about the meat, the grilled pineapple is to die for! + +![](2023-recap/rodeo-goat-1.jpg) +Rodeo Goat... Burger Battle + +![](2023-recap/rodeo-goat-2.jpg) +Rodeo Goat... yummy! + + + +![](2023-recap/mexican-sugar-1.jpg) +Mexican Sugar + +![](2023-recap/mexican-sugar-2.jpg) +Mexican Sugar... brunch! Yummy pork chop breakfast, including chips and their distinctive tasting salsa and pour over coffee + + + +![](2023-recap/dock-local-2.jpg) +Dock Local fish and chips... highly rated seafood counter in Legacy Town Hall + +![](2023-recap/main-street-bakery-1.jpg) +Main Street Bakery in Legacy Shops... lots of beautiful and tasty treats! + + + +![](2023-recap/bamboo-house-1.jpg) +Bamboo House + +![](2023-recap/bamboo-house-2.jpg) +Bamboo House Peking Duck... not my favorite food, but an interesting experience + +![](2023-recap/fowling.jpg) +Fowling (football bowling... more difficult than it looks!) diff --git a/_sources/2024-recap.md.txt b/_sources/2024-recap.md.txt new file mode 100644 index 00000000..92248825 --- /dev/null +++ b/_sources/2024-recap.md.txt @@ -0,0 +1,441 @@ +# 2024 Recap + +Disclaimer: the content of this post is a reflection of my life and career journey and not specific to my work at JPMorganChase. + +You can read my [2023 Recap](https://katherinemichel.github.io/portfolio/2023-recap.html) here. + +## This Year's Theme + +While writing this recap, I found myself thinking the words, "I finally got organized and" a number of times. I felt a sense of cumulative momentum this year that came from building on prior knowledge and experience. + +## Work + +I continued as a Python/Django software engineer doing task orchestration and distributed systems engineering. + +## January + +### Los Angeles 2023 Trip Recap + +The dream Los Angeles trip that I took in early December 2023 turned into a [dream recap](https://katherinemichel.github.io/portfolio/los-angeles-2023.html) filled with my favorite stories, photos, and videos. + +My most-viewed Los Angeles videos: +* [Universal Studios Tour- King Kong](https://youtu.be/d3wERBCZHEM?si=P2SAE4GQRgXkhKDI) +* [Santa Monica Pier Carousel](https://youtu.be/TVL2gUfgNGk?si=aJjKWFcPVtTA3YV1) +* [Santa Monica Pier at Night- Ferris Wheel](https://youtu.be/cnWdL9C4ucU?si=G7QbrVFGAfQuWI7a) +* [Universal Studios Tour- Jaws](https://youtu.be/evZHAcfSnqw?si=-1P7Dd3wRPQW3I8F) + +### Kinesis Advantage360 + +In 2020, I bought a Kinesis [Freestyle Pro](https://www.amazon.com/gp/product/B07J1ZJ6XR/) split keyboard. Although the keyboard itself was fairly traditional, I loved the 20'' separation cord and tenting. The unique Kinesis [Advantage2](https://kinesis-ergo.com/keyboards/advantage2-keyboard/) keyboard had long piqued my curiosity as well. When Kinesis came out with the [Advantage360](https://kinesis-ergo.com/keyboards/advantage360/) split version with tenting, I finally pulled the trigger. + +This keyboard is the most comfortable that I have ever used. The contoured shape shortens reach and the thumb presses heavily-used keys, instead of the pinky. + +Having said that, the layout is similar, but not exactly the same as a regular QWERTY, and I do not recommend using it if you have to "hunt and peck." Also, like the Freestyle Pro, it is one-size fits all, and slightly larger for a woman's smaller hands. + +![](2024-recap-images/advantage-360.jpg) +Kinesis Advantage360 + +### DjangoCon US 2023 Recap + + + +I published a [DjangoCon US Recap](https://katherinemichel.github.io/portfolio/djangocon-us-2023-recap.html) in October 2023. It was featured in [Django News Newsletter](https://django-news.com/issues/203#start). I learned in January that the recap had been Django News Newsletter's top article for months. + +## February + +### Board Games for My Nieces + +I want to start doing random, fun things for my nieces. I decided to buy them some board games. + +Games purchased: +* Guess Who? +* Candy Land +* Scrabble +* Clue + +I had countless hours of fun playing these when I was a kid. + +We FaceTimed while they opened the box. They immediately began playing and loved them. + + + +## March + +### DjangoCon US Talk Topics Inspiration List + +Every year, fellow DEFNA Board Member Jeff Triplett publishes a list of talk topics he'd like to learn more about at DjangoCon US. He also encourages other DEFNA Board Members to publish their own. + +Last year, I finally got organized and created a [Talk Topics Inspiration List for DjangoCon US 2023](https://katherinemichel.github.io/portfolio/djangocon-us-2023-recap.html). This year, I created a [Talk Topics List for DjangoCon US 2024](https://katherinemichel.github.io/portfolio/djangocon-us-2024-topics-inspiration-list.html). + +Our talk submission stats since I began publishing my list: +* 2022: 152 +* 2023: 189 +* 2024: 194 + +Given the popularity of my articles among the Python/Django community, I'm confident that my list played a major role in the increase in submissions. I am really proud of that! + +My list was featured in [Django News Newsletter](https://django-news.com/issues/222#start), along with [Jeff's list](https://micro.webology.dev/2024/04/28/djangocon-us-talks.html) and DjangoCon US Program Chair [Drew Winstel's list](https://winstel.dev/2024/03/01/talk-ideas-for-dcus-24/). + +### DjangoCon US Website Design + +As a DEFNA Board Member, I help oversee DjangoCon US, including the website design. I am also an avid photographer. + +During DjangoCon US 2023, I walked around downtown Durham and took some photos of the quirky artwork there. During the always-fun website design iteration process, I shared these photos with the website team. + +![](2024-recap-images/durham-downtown-snapshots.png) +Snapshots I took in downtown Durham + +I am super excited that my photos helped inspire this year's theme. The [website design](https://2024.djangocon.us/) makes me smile, and I hope it makes you smile too! + +![](2024-recap-images/joni-djangocon-us-website-post.png) +A shoutout from our amazing designer Joni Trythall of YupGup! + +### Conference Snapshots + +After years of collecting conference snapshots, I got organized and created a page of my [Favorite Conference Snapshots](https://katherinemichel.github.io/portfolio/favorite-conference-snapshots.html) and the stories behind them, as well as a page of [Speaker, Board, and Organizer Photos](https://katherinemichel.github.io/portfolio/speaker-board-and-organizer-photos.html). + +### Family Tragedy + +On April 15, 2022, my [Aunt Judy died](https://www.livingstonfh.com/obituary/judith-k-markel) of pancreatic cancer. On March 29 of this year, my Uncle Edward passed away too. He had been suffering from probable Lyme-disease induced dementia and took a fall, but ultimately, he died of a broken heart. + +A part of me never believed this day could happen, and I wished it never would. Uncle Edward and Aunt Judy were truly larger than life. + +![](2024-recap-images/better-times.jpg) +My aunt and uncle in better times + +His life was not so easy after Aunt Judy died. He missed his Judy. He died peacefully, and I am comforted by the fact that he had a smile on his face. + +You can learn more about him in his [obituary](https://www.livingstonfh.com/obituary/edward-a-markel) or the [replay of his funeral](https://www.facebook.com/prettyprairieumc/videos/1118062006180755). + +He was one-of-a-kind. He was a brilliant engineer and businessman and the best brother my mother could have ever asked for. + +My mom put her heart into providing the funeral music. He would have absolutely loved it. + +My uncle was an avid hunter. My cousin Andrea Markel Hastings organized [one last duck call](https://youtu.be/ARt_orgMi3U?si=oFeWc5Qw1Ph3PdDE) for him at the cemetery by a few of his fellow hunting buddies. + +There's something in my eye. + +![](2024-recap-images/defna-flowers.jpg) +Beautiful sympathy flowers from DEFNA... in a strange coincidence, my cousin pointed out that the roses were one of my uncle's favorite colors + +## April + +### Lemurs at Tanganyka Wildlife Park + +Because our DjangoCon US host city Durham, North Carolina has the largest population of lemurs outside of Madagascar, we featured a "friendly" lemur on our website last year. + +![](2024-recap-images/djangocon-us-2023-website-header.png) +A "friendly" lemur with a smile on its face + +After years of hearing about [Tanganyika Wildlife Park](https://twpark.com/) in Goddard, Kansas, mom and I decided to go. I had no idea until I got there that you can feed lemurs. They were so soft and gentle. I loved spending time with these real-life, friendly lemurs! + +![](2024-recap-images/lemurs-1.jpg) +Mom, me, and the lemurs! + +![](2024-recap-images/lemurs-2.jpg) +Me feeding a lemur a craisin out of my palm! It's holding my hand. + +### JPMorganChase Eclipse Watch Party + +On my way back to Plano after my uncle's funeral, I got stuck in eclipse travel. I arrived back in Plano in time for the eclipse, but hadn't had time to plan. Fortunately, JPMorganChase had me covered. Eclipse glasses were handed out around campus, and we convened outside for a watch party. It's hard to put into words what it was like to watch the eclipse with what must have been thousands of co-workers. + +Here is [a little taste of the fun](https://youtu.be/vvNfmo0zwDw?si=Tl2xj-TZ29j_Doed). This was a small portion of the crowd. Clouds intermittently covered the sun, but parted in time for the totality. The crowd cheered and Total Eclipse of the Heart played in the background. Super fun! + +### PyTexas 2024 + +[PyTexas 2024](https://www.pytexas.org/2024/) took place in Austin, Texas from April 19-21. + +PyTexas has been on my bucketlist for years, and I finally went. + + + +I met Jason Koo at DjangoCon US 2022 in San Diego where he generously helped as an organizer. It was great to see him again, and I look forward to learning more about Neo4j Graph Database! On the bright, sunny, second day of PyTexas, he invited me to be in this photo. + +![](2024-recap-images/jason-koo.jpg) +Nick, Dan, Jason, Josh, me, Carol + +It was a pleasure to get a snapshot next to my incredible friend Carol Willing. She had given an amazing keynote that morning. It is a must watch! I was also standing next to Josh Cannon who read the very clever Oh the (Methods) You Can (Make) book by Dunder Seuss. + +All of the videos are available on the [PyTexas Youtube channel](https://www.youtube.com/c/PyTexas). + +## May + +### Gym + +Last year, I'd never been in a gym before and was afraid to go. My friend DeAnna Troutman Anaya talked me into getting started. + +A few years ago, she found out that she was on her way to having debilitating illness. She was able to avoid it by getting fit. She regularly lifts weights and has an impressive physique. She is redefining what it means to be a grandmother. + +When I started using an elliptical, I limited myself to ~70 steps per minute. Otherwise, I would get winded. Now, I am regularly up to 120+ steps per minute, and when life gets busy for a short time, and I don't exercise regularly, I am able to get back to my top performance within just a few sessions. I would love to know the science behind it. + +![](2024-recap-images/one-day-too-many.png) +One day too many + +I returned to the gym regularly on May 2nd and added light weight lifting. In combination with aerobic activity, I've read that weight lifting has a number of benefits as we age: bone density, muscle mass, coordination and balance, general health. + +By June 1st, I'd already had a personal best on the elliptical and broke that record many times over throughout the year. + +![](2024-recap-images/felt-like-it.png) + + + +![](2024-recap-images/gym-rat.jpg) +Gym rat :) + +A chef friend Sheldon also encouraged me to get a personal trainer, which I have not done (yet). It has been life-changing for him in his life and work. + +### DjangoCon US Featured Post + +I was featured on DjangoCon US social media accounts, along with current Django Fellow Natalia Bidart and former and current DEFNA Board Members Drew Winstel, Tim Schilling, and Koji Idressa. + +![](2024-recap-images/djangocon-us-featured-post.png) + +### PyCon US 2024 + +PyCon US 2024 took place from May 15-23 in Pittsburgh, Pennsylvania. + +Thank you to Bernat Gabor for encouraging me to go! It was extremely worth it. + +After the conference, I did some "heavy lifting" from conference connections made. A few examples: +* Based on a conversation with Black Python Devs Founder K. Jay Miller, I liased with DEFNA to further the interests of Black Python Devs at DjangoCon US 2024 +* Based on a conversation with PyTexas Chair Mason Egger, I made PyTexas sponsorship pitches to interested parties +* Based on a conversation with Quansight Labs Co-director Tania Allard, I attempted to rekindle a prospective open source process within my network + +## June + +### PyCon US 2024 Recap + +I wrote a deep dive of my [PyCon US 2024](https://katherinemichel.github.io/portfolio/pycon-us-2024-recap.html) experience. + +As my recap reflects, as far as talks go, I was particularly interested in major new developments around free-threading, per GIL subinterpreters, and JIT compilation. + +Not long after I posted my PyCon US 2024 Recap on social media, I got a rave review from Kenneth Reitz, PSF Fellow and author of Requests Python package (#5 for PyPI downloads, over 10,500,00 downloads/day, depended on by over 2,900,000 repos). + +Unbeknownst to me, Neil Stoker, Senior Director of Ratings AI at Fitch Ratings, had [submitted the recap to Hacker News](https://news.ycombinator.com/item?id=40552621). + +He tweeted to me that it was trending there. It had reached #2! + +![](2024-recap-images/hacker-news-trending.png) +#2 on Hacker News... so close to #1. Beaten out by Tim Bray's sofa parable, lol + +![](2024-recap-images/hacker-news-rankings-stats.png) +#2 for nearly an hour + +![](2024-recap-images/hacker-news-rankings-expanded.png) +On the "front page" for about 12 hours + +It eventually reached 186 points and 91 comments + +While the recaps I have written of smaller Python/Django conferences have been widely shared in their own right, I believe that the universal appeal of PyCon US drove the massive popularity of this post. + +The new Python Release Manager Hugo van Kemenade whom I had the pleasure of meeting at the conference included my recap as the must read recap in his [conference recap roundup](https://dev.to/hugovk/pycon-us-2024-a-roundup-of-writeups-26hj). + +Validation of my work among the world's leading Python practitioners and global community means a lot to me. + +It was also featured in [Django News Newsletter](https://django-news.com/issues/236#start) and [pip Trends Newsletter](https://newsletter.piptrends.com/p/pycon-us-2024-recap-how-llms-work). + +![](2024-recap-images/lacey-kudo.png) +Thank you to the incredible Lacey for this sweet kudo! Can't wait to see you. :) + + + +### DFW Pythoneers + +After months of good intentions, I finally committed to attending [DFW Pythoneers](https://www.meetup.com/dfwpython/) meetup. It was a great time! I got to see Kevin Horn for the third time in two months and Broadus Jones for the second time in two months. :) + +I really enjoyed Jim Vogel's talk about Pydantic, MongoDB, Beanie, and FastAPI. + +### Summer Fun for My Nieces + +In keeping with my plan to do more random, fun things for my nieces, I asked my sister what I could buy them for summer. + +Based on her suggestion, I bought them: +* Four X-Shot fast-fill water blasters +* 24 reusable, magnetic, fast-fill water balloons + +### Innovation Week Global Hackathon + +It was an amazing Innovation Week at JPMorganChase. I attended presentations Monday, Tuesday, and Wednesday, then finished the week off by participating in the Global Hackathon for the second year in a row. + +My first project fell through. Feeling disheartened, Wednesday night, I looked through the projects again and saw a new one that was highly relevant to my work in the Databases Department. I reached out to the team and joined. It felt meant to be. My team was inspiring! I learned a lot and made some new friends. + +![](2024-recap-images/hackathon-team.jpg) +Here I am with my Plano-based hackathon teammates. + +## July + +### Wellness Screening + +Throughout July, August, and September, I took advantage of JPMorganChase employee health and finance benefits. + +JPMorganChase has an employee wellness program. Employees can complete wellness activities to earn money for their MRA (Medical Reimbursement Account) and lower their medical payroll costs. One of the activities is a wellness screening. During the screening, your blood pressure and body mass index (BMI) are calculated, and a fingerstick is used to calculate your blood sugar, cholesterol and triglycerides. + +I had my first wellness screening in November, 2023. I found out that both my good cholesterol and bad cholesterol were high. + +I made a few changes in my diet. By my second wellness screening in early July, my bad cholesterol had gone down 22 points. + +## August + +### Financial Advisor + +Using employee financial services benefits, I began working with a JPMorganChase personal advisor and private banker. + +What I learned from them has helped me understand the larger picture better, create a longterm financial strategy across all of my assets, and better leverage employee benefits. + +I also conveniently paid off my student loans. + +![](2024-recap-images/personal-banker.png) + +## September + +### Preventative Care + +Continuing with my wellness activities, I completed a full physical, mammogram, colon cancer screening, and got up-to-date with my vaccinations. + +### DjangoCon US + + + +## October + +## November + + + +## December + +## Parting Thoughts + +Thank you to each and everyone one of you, and there are many, who made my year special. + +![](2024-recap-images/still-reflecting.png) + +These are the "good old days." Live your best life. + +![](2024-recap-images/me-at-pycon-us.jpg) +Me at PyCon US + +## Favorite Snapshots Throughout The Year + + + +### JPMorganChase Plano Chinese Lunar New Year Celebration + +![](2024-recap-images/parade.jpg) +Parade + +![](2024-recap-images/cultural-attire.jpg) +Cultural attire + + + + + +### Tanganyka Wildlife Park + +![](2024-recap-images/tables-turned.jpg) +Mom turning the tables on me at Tanganyka + + + +### Clouds + +![](2024-recap-images/clouds.jpg) +Clouds in Legacy + +### McClaren Sports Cars + +McLaren Financial Services had an event at JPMC and brought in two McLaren cars. That is me standing with ~$750k worth of car. + +![](2024-recap-images/mclaren-artura.jpg) +A "lower-end" Artura + +![](2024-recap-images/me-with-mclaren-artura.jpg) +Me with the Artura + +![](2024-recap-images/mclaren-750s.jpg) +A 750S, the equivalent of an F1 car + +### Yoshi Shabu Shabu + +![](2024-recap-images/hotpot.jpg) +Japanese hotpot with tonkotsu, pork belly, ramen, and goma sesame peanut, citrus ponzu, and roasted garlic teriyaki sauces + +![](2024-recap-images/sake.jpg) +Mango sake + +### T Swirl Japanese Crepe + +![](2024-recap-images/crepe.jpg) +Strawberry banana crepe: sliced strawberries, sliced bananas, custard cream, whipped yogurt, chocolate pearls, crushed pistachios + + + +### Luci's Bakery + +![](2024-recap-images/lucis-bakery.jpg) +Venezuelan chicken empanada, rice, black beans, fried plantains + +### Pic with Julie + +![](2024-recap-images/me-with-julie.jpg) +Me and my wonderful co-worker Julie + +### Darna Mediterranean Eatery + + + +![](2024-recap-images/saffron-chicken.jpg) +Saffron chicken kebab and mocktail mojito with strawberry flavor + +### Employee Appreciation Week + +![](2024-recap-images/me-with-mascots.jpg) +Me with Dallas Mavs and Frisco RoughRiders mascots at the Employeer Appreciation Week street party + +![](2024-recap-images/floating-chase-logo.jpg) +Me lounging in a floating Chase logo... 3D street art by Jan Riggins + +![](2024-recap-images/longhorn.jpg) +Me overtaking a longhorn + +![](2024-recap-images/thank-you-memo.jpg) +Me sitting next to a life-size thank you memo diff --git a/_sources/about-me.md.txt b/_sources/about-me.md.txt new file mode 100644 index 00000000..a3d9bfd1 --- /dev/null +++ b/_sources/about-me.md.txt @@ -0,0 +1 @@ +# About Me diff --git a/_sources/building-a-taco-johns-scraper.md.txt b/_sources/building-a-taco-johns-scraper.md.txt new file mode 100644 index 00000000..9adeacb3 --- /dev/null +++ b/_sources/building-a-taco-johns-scraper.md.txt @@ -0,0 +1,334 @@ +# Building a Taco John's Scraper + +## Before I Begin + +I created this scraper as a fun programming exercise to solve a hypothetical problem. + +A couple of important things to know: + +* Scraping is sometimes considered controversial, and can have unintended consequences. For example, I recently read an article about a person being indefinitely locked out of their Google account due to their scraping activity! Be careful out there. + +* Some websites have been designed to have a built-in [API (Application Programming Interface)](https://en.wikipedia.org/wiki/API), which enables data to be obtained from the website database in a controlled way. Before scraping, you might want to see if an API exists and whether it serves your purpose. APIs are often well documented. Here are a couple of lists of APIs as examples: https://github.com/public-apis/public-apis and https://github.com/n0shake/Public-APIs + +## What is Scraping? + +Imagine that a website contains some structured data that you would like to obtain. For example, perhaps you are a data scientist who would like to do an analysis of a store's products, or you are a web developer who would like to create a website that aggregates product information. + +One way to obtain the data is to use a mouse to click through the pages of the website. But, depending on how much data you'd like to obtain, this might not only be inconvenient, it might not be humanly possible! + +Perhaps, sometime, while looking through the menu of your website browser, you've clicked on an option that says "View Source" and you've gotten a glimpse of some of the source code, that is normally hidden, that runs a website page. + +Clicking on "View Source" + +![](building-a-taco-johns-scraper-images/view-source.png) + +A source code snippet... this source code had been "minified" to improve website performance. I used a formatting tool to un-minify it. + +![](building-a-taco-johns-scraper-images/source-code-snippet.png) + +In addition to an official [standard library](https://docs.python.org/library/) that contains all of the commonly used features of the language, [Python](https://www.python.org/) programming language has a rich ecosystem of third-party tools that can be used to do powerful things. + +One of the third-party tools in the Python ecosystem is called [Scrapy](https://scrapy.org/). Scrapy can be used to create a Python program that can programatically follow a website's URLs (links) in the source code to obtain, or "scrape" the structured data you are in search of and output it in a form that you can save and use. + +Unlike a human being, a [scraper](https://en.wikipedia.org/wiki/Web_scraping) can hypothetically do this on a massive scale, in a short amount of time, and on a schedule. + +## Making a Scraper for Hacktoberfest + +[Hacktoberfest](https://hacktoberfest.digitalocean.com/), sponsored by [GitHub](https://github.com/) and Digital Ocean, is a month-long celebration of open-source code. If you submit four pull requests (proposed contributions) to participating open-source projects on GitHub during October, and the pull requests are considered valid and merged, you will receive a t-shirt or have a tree planted in your name, up to the first 70,000 people. + +If you are ever interested in getting involved in open source and don't know where to get started, I sometimes give a talk about it called "Get a Jumpstart on Collaboration and Code Review in GitHub." Check out my talk [slides and script](https://github.com/KatherineMichel/get-a-jumpstart-on-collaboration-and-code-review-in-github-pyladies-southwest-florida) in my GitHub account. + +While I was looking through GitHub repos (places where code is stored) to identify contributions I could make that would qualify for Hacktoberfest, I came across a repo called [All the Places](https://github.com/alltheplaces/alltheplaces/). All the Places project contains a collection of [Scrapy scripts](https://github.com/alltheplaces/alltheplaces/tree/master/locations/spiders) (a.k.a "spiders") that can be used to scrape business websites for location data. + +For a while now, I've been wanting to learn how to make a scraper, so I decided to make one of my own to contribute to the All the Places project for Hacktoberfest. + +## Considerations + +To begin with, I attempted to make scrapers for several different websites and learned by trial and error about the challenges. + +Firstly, because All the Places scrapers are intended to be used to collect geographical information, it's required that location latitude and longitude information be scraped from the website. But, even if the latitude and longitude information is contained within the website, it's not necessarily easily accessible. If the source code contains a Google Map URL that has the location latitude and longitude information within the URL, that information can be scraped directly. But, in one project I worked on, the Google Map URL contained the location address instead of its latitude and longitude, making that information much less straight forward to obtain. + +Google Map URL that contains latitude and longitude data + +```html +https://www.google.com/maps/place/Taco+John's/@38.9728434,-95.2478613,15z/data=!4m5!3m4!1s0x0:0x9ed745c4be038bd6!8m2!3d38.9728434!4d-95.2478613 +``` + +Google Map URL that contains an address + +```html +https://www.google.com/maps/dir/Taco+John's,+West+6th+Street,+Lawrence,+KS/ +``` + +Secondly, there is a lot of inconsistency in the way that websites are structured. In an "easier" scenario, the website structure and its URLs will progress in a predictable way. For example, maybe the relevant URLs in a page listing states will only lead to city pages and the URLs in the city pages will only lead to restaurant pages. Unfortunately, the URLs in the Taco John's website are inconsistent, which you'll learn about later. + +Thirdly, when scraping information from a page, you are at the mercy of the meticulousness of the developer who wrote the source code. Better structured and documented source code (for instance, that is structured using a [schema](https://schema.org/)) can make your life easier. + +Snippet of HTML structured using [PostalAddress Schema](https://schema.org/PostalAddress) + +```html +
1101 W 6th St Lawrence, KS 66044 US
+``` + +However... inconsistent website structure and poorly written source code can also strengthen your problem solving muscles. + +After a lot of experimentation with websites in the All the Places issues, I decided to identify a site on my own to scrape. I thought about restaurant chains in Kansas and Taco John's immediately came to mind. When I lived in Lawrence, Kansas, I often went through the drive-through of the Taco John's at 1626 W 23rd St (now closed) on Taco Tuesday, and picked up several tacos and an order of Potato Olés®. Yum. + +## How Location Pages Work on the Taco John's Website + +I set my Taco John's scraper up to begin "crawling" at the main Taco John's locations page. This locations page is an index of states where Taco John's restaurants are located. + +Taco John's locations page (https://locations.tacojohns.com/) + +![](building-a-taco-johns-scraper-images/locations-page.png) + +Clicking on a URL in the locations page will usually open up an index page showing the cities where Taco John's restaurants are located in the state. + +Taco John's state page example (https://locations.tacojohns.com/ks.html) + +![](building-a-taco-johns-scraper-images/state-page.png) + +If a city contains more than one Taco John's restaurant, clicking on the city URL will open an index page showing all of the restaurants in the city. + +Taco John's city page example (https://locations.tacojohns.com/ks/lawrence.html) + +![](building-a-taco-johns-scraper-images/city-page.png) + +Clicking on one of these URLs will open up the restaurant page. + +Taco John's restaurant page example (https://locations.tacojohns.com/ks/lawrence/1101-w-6th-st.html) + +![](building-a-taco-johns-scraper-images/restaurant-page.png) + +If a city contains only one Taco John's restaurant, clicking on the city URL will open up the restaurant page directly. + +## The Challenge + +I said that clicking on a link in the locations page will usually open up a state page showing the cities where Taco John's restaurants are located. But unfortunately, this is not *always* the case. + +State page links on locations page + +```html +https://locations.tacojohns.com/co.html +https://locations.tacojohns.com/id.html +https://locations.tacojohns.com/il.html +https://locations.tacojohns.com/in.html +https://locations.tacojohns.com/ia.html +https://locations.tacojohns.com/ks.html +https://locations.tacojohns.com/ky.html +https://locations.tacojohns.com/mn.html +https://locations.tacojohns.com/mo.html +https://locations.tacojohns.com/mt.html +https://locations.tacojohns.com/ne.html +https://locations.tacojohns.com/nd.html +https://locations.tacojohns.com/oh.html +https://locations.tacojohns.com/sd.html +https://locations.tacojohns.com/tn.html +https://locations.tacojohns.com/wa.html +https://locations.tacojohns.com/wi.html +https://locations.tacojohns.com/wy.html +``` + +Only one city in Arkansas (Russellville) has any Taco John's location and that city has two. So, a state page is not required, but a city page is. The program needs to skip to a city page, then parse the location pages. + +City page link on locations page + +```html +https://locations.tacojohns.com/ar/russellville.html +``` + +Three states (Michigan, Nevada, and New York), only have one restaurant in the state. So state and city pages are not required. The program needs to skip to a restaurant page. + +Restaurant page links on locations page + +```html +https://locations.tacojohns.com/mi/stevensville/4107-red-arrow-highway.html +https://locations.tacojohns.com/nv/reno/770-s-wells-ave.html +https://locations.tacojohns.com/ny/jamaica/john-f--kennedy-international-airport.html +``` + +As a result, most of the links on the locations page are for state pages, one is for a city page, and three are for restaurant pages. + +In programming, it's important to "catch" [exceptions](https://docs.python.org/3/tutorial/errors.html#exceptions), situations that differ from the norm, and plan for them in advance. Otherwise, the program might literally... not work. + +My Scrapy program has specific instructions for how to parse each type of page. If the program always goes in the same order, from location page to state page, to city page, to restaurants page, using the correct set of instructions to parse the correct page, there's no problem. + +But, if the program follows a city or restaurant page link, but is parsed using the instructions for parsing a state page, there's a problem. The program doesn't work right, because the instructions don't fit the page. + +The program needs to know what type of page it's parsing, so it can use the correct instructions. + +## The Solution + +My solution involves [regular expressions](https://en.wikipedia.org/wiki/Regular_expression) (regex). + +A regular expression is an abstract pattern that a program can use to identify a combination of letters, numbers, or symbols. + +Within the program, I've used regex to create a `state_pattern`, `city_pattern`, and `location_pattern`, to express the abstract patterns of the website state page, city page, and location page URLs. + +State, city, and location page URL regex patterns + +```python +state_pattern = re.compile("^[a-z]{2}(\.html)$") +city_pattern = re.compile("^[a-z]{2}\/.+(\.html)$") +location_pattern = re.compile("^[a-z]{2}\/.+\/.+(\.html)$") +``` + +As the program crawls the URLs in the source code page, it will compare each URL to each regex pattern until it matches one. In that way, the program will know if the URL belongs to a state, city, or restaurant page. + +The program will then call the function that contains the instructions for parsing that type of page. + +Instead of processing the pages in an order, the program processes the pages by page type. In that way, no matter what path the links take, however long or short, the program will end up at a location page, outputting the data from that page. + +## Regex Pattern Explanation + +Every location URL begins with ```https://locations.tacojohns.com/```. The `^` character lets the program know that that part of the URL doesn't matter to us. We are only interested in the unique part of each URL. + +The unique part of every URL starts with a state code. The regex pattern `[a-z]{2}` will match any two letters between a and z, inclusive. + +Every page ends with `.html`, which is a file ending. We can group this pattern together in parentheses. Because the `.` can be used in regex to match any character, we need to tell the program that we are matching a `.` literally. We can do that by putting a `\` in front of it, to "escape" it. The `$` after `(\.html)` indicates it's the end of the pattern. This pattern will be used in all the regex patterns. + +State pattern match example: https://locations.tacojohns.com/ks.html + +```python +state_pattern = re.compile("^[a-z]{2}(\.html)$") +``` + +In the city pattern, the state code is followed by a forward slash (`/`), then a group of characters for a city name. Because the `/` can also be used as a regex character, we need to make it literal by putting a `\` in front of it, to escape it. The `.` can be used to match any character and the `+` indicates that pattern can occur one or more times. + +City pattern match example: https://locations.tacojohns.com/ks/lawrence.html + +```python +city_pattern = re.compile("^[a-z]{2}\/.+(\.html)$") +``` + +The location pattern is similar to the city pattern, but the `\/.+` patterns happens twice, once for a `/` and a city name, and again for a `/` and the location name. + +Location pattern match example: https://locations.tacojohns.com/ks/lawrence/1101-w-6th-st.html + +```python +location_pattern = re.compile("^[a-z]{2}\/.+\/.+(\.html)$") +``` + +If you want to get better at Regex, I recommend doing [Regex Crosswords](https://regexcrossword.com/)! + +## Stepping Through the Program + +This blog post assumes that the Python programming environment required is already set up on the computer. + +You can see the public code here: https://github.com/alltheplaces/alltheplaces/blob/master/locations/spiders/taco_johns.py + +The Python Standard Library [regex module](https://docs.python.org/3/library/re.html) is imported from Python, as well as the Scrapy package, and a [`GeojsonPointItem()` class](https://github.com/alltheplaces/alltheplaces/blob/master/locations/items.py) that the data properties are passed into. + +```python +import re + +import scrapy + +from locations.items import GeojsonPointItem +``` + +The project is set up. Although not extremely relevant for our purposes, Scrapy uses object-oriented programming. `download_delay` is optional, but can make the program performance more consistent. + +```python +class TacoJohns(scrapy.Spider): + name = "taco_johns" + allowed_domains = ["tacojohns.com"] + download_delay = 0.2 + start_urls = ( + "https://locations.tacojohns.com/", + ) +``` + +The state page, city page, and location page URL patterns as regex. These patterns will be used throughout the program. + +```python + state_pattern = re.compile("^[a-z]{2}(\.html)$") + city_pattern = re.compile("^[a-z]{2}\/.+(\.html)$") + location_pattern = re.compile("^[a-z]{2}\/.+\/.+(\.html)$") +``` + +The program begins at the `start_url`, which is the main locations page. The program locates the URLs in the source code, and compares each one to the regex patterns. Depending on which regex pattern the URL matches, the program will call the `parse_state`, `parse_location`, or `parse_city` function next. + +```python + def parse(self, response): + urls = response.xpath('//li[@class="c-directory-list-content-item"]//@href').extract() + for url in urls: + if (self.state_pattern.match(url.strip())): + yield scrapy.Request(response.urljoin(url), callback=self.parse_state) + elif (self.location_pattern.match(url.strip())): + yield scrapy.Request(response.urljoin(url), callback=self.parse_location) + else: + yield scrapy.Request(response.urljoin(url), callback=self.parse_city) +``` + +If the URL matched the `state_pattern` regex pattern, the `parse_state` function has now been called. Because the entries on the state page can lead to either a city page or a location page, the URLs will be compared to the `city_pattern` and `location_pattern` and depending on which regex pattern the URL matches, the program will call the `parse_city` or `parse_location`function next. + +```python + def parse_state(self, response): + urls = response.xpath('//li[@class="c-directory-list-content-item"]//@href').extract() + for url in urls: + if (self.location_pattern.match(url.strip())): + yield scrapy.Request(response.urljoin(url), callback=self.parse_location) + else: + yield scrapy.Request(response.urljoin(url), callback=self.parse_city) +``` + +If the URL matched the `city_pattern` regex pattern, the `parse_city` function has now been called. These URLs will only lead to a location page, so the `parse_location` function is called. + +```python + def parse_city(self, response): + urls = response.xpath('//*[@class="c-location-grid-item-link page-link hidden-xs"]//@href').extract() + for url in urls: + yield scrapy.Request(response.urljoin(url), callback=self.parse_location) +``` + +All roads lead to the location page, which will contain the location details. + +See the All the Places project [`DATA_FORMAT`](https://github.com/alltheplaces/alltheplaces/blob/master/DATA_FORMAT.md) file for information about the types of data that can be collected. `properties` creates a structured model for the data and indicates where to find each piece of data within the source code. The scraped `properties` data will be passed into the imported [`GeojsonPointItem()` class](https://github.com/alltheplaces/alltheplaces/blob/master/locations/items.py) as a subclassed [`scrapy.Item`](https://docs.scrapy.org/en/latest/topics/items.html) parameter. The properties will be set as Scrapy fields and outputted in the terminal. + +The developers of this website formatted the source code using a [PostalAddress Schema](https://schema.org/PostalAddress), which made the data easier to locate and parse. + +```python + def parse_location(self, response): + + properties = { + 'ref': response.url, + 'name': response.xpath('//div[@itemprop="name"]//text()').extract_first(), + 'addr_full': response.xpath('normalize-space(//*[@itemprop="streetAddress"]//text())').extract_first(), + 'city': response.xpath('//span[@itemprop="addressLocality"]//text()').extract_first(), + 'state': response.xpath('//*[@itemprop="addressRegion"]//text()').extract_first(), + 'postcode': response.xpath('normalize-space(//span[@itemprop="postalCode"]//text())').extract_first(), + 'country': "USA", + 'phone': response.xpath('//span[@id="telephone"]//text()').extract_first(), + 'website': response.url, + 'lat': response.xpath('//*[@itemprop="latitude"]/@content').extract_first(), + 'lon': response.xpath('//*[@itemprop="longitude"]/@content').extract_first(), + } + + yield GeojsonPointItem(**properties) +``` + +One restaurant's data output in the terminal + +```javascript +2020-10-25 15:09:08 [scrapy.core.engine] DEBUG: Crawled (200) (referer: https://locations.tacojohns.com/ks/lawrence.html) +2020-10-25 15:09:08 [scrapy.core.scraper] DEBUG: Scraped from <200 https://locations.tacojohns.com/ks/lawrence/1101-w-6th-st.html> +{'addr_full': '1101 W 6th St', + 'city': 'Lawrence', + 'country': 'USA', + 'extras': {'@spider': 'taco_johns'}, + 'lat': '38.9728433610435', + 'lon': '-95.24786129593849', + 'name': "Taco John's", + 'phone': '(785) 843-0936', + 'postcode': '66044', + 'ref': 'https://locations.tacojohns.com/ks/lawrence/1101-w-6th-st.html', + 'state': 'KS', + 'website': 'https://locations.tacojohns.com/ks/lawrence/1101-w-6th-st.html'} +``` + +## Wrapping Up + +This was a lot of fun. I know I learned a lot about Scrapy and some new things about how websites work. I hope you learned something too. + +Happy scraping! :) diff --git a/_sources/djangocon-us-2019-recap.md.txt b/_sources/djangocon-us-2019-recap.md.txt new file mode 100644 index 00000000..c008c2ca --- /dev/null +++ b/_sources/djangocon-us-2019-recap.md.txt @@ -0,0 +1,300 @@ +# DjangoCon US 2019 Recap + +Published October 28, 2019 + +### Description + +DjangoCon US 2019 took place at Mission Valley Marriott in sunny San Diego from September 22-27. Eldarion’s Katherine Michel shared some insight into what that experience was like and what's on the horizon for Django! + +### Blog Post + +![](djangocon-us-2019-recap-images/conference-attendees.jpg) + +Conference attendees out by the pool; photo credit: Bartek Pawlik (https://bartpawlik.format.com/) + +For the second year in a row, [DjangoCon US](https://2019.djangocon.us/) took place in sunny San Diego and it was great to be back. San Diego is a thriving port city with palm trees, picturesque beaches, and perfect weather year-round. It's hard to imagine anyone not loving this fun location. The conference returned to the gorgeous Mission Valley Marriot, where attendees have a view of a sparkling blue pool in the courtyard surrounded by palm trees. + +The format for this year was similar to past years, with one day of tutorials, three days of talks, and two days of sprints, but with one notable difference. One two-track talk day was replaced with a one-track deep-dive day. + +The conference was a huge success. Tickets sold out for the second year in a row and the talk lineup was impressive. The deep-dive day in particular was a big hit. Attendees I spoke to enjoyed hearing from experts in the field. The sprint days were also well attended, including a "[How to Contribute to Django](https://2019.djangocon.us/how-to-contribute-django/)" workshop that resulted in quite a few people contributing to Django core. + +Also, like DjangoCon US 2018, DjangoCon US 2019 was visibly diverse, I believe the most diverse conference I have ever been to. There were many faces from underrepresented groups in the crowd and I was thrilled to find a line at the women's bathroom throughout the week. It's amazing to see the progress the PyCon US and DjangoCon US communities have made in drastically increasing diversity in just a few years. + +### Monday + +![](djangocon-us-2019-recap-images/kojo-idrissa.jpg) + +Kojo Idrissa kicking off DjangoCon with Orientation; photo credit: Bartek Pawlik (https://bartpawlik.format.com/) + +Monday kicked off with an [Orientation and Welcome](https://2019.djangocon.us/talk/orientation-and-welcome/) led by [DEFNA](https://www.defna.org/) North American Ambassador and DjangoCon Organizer [Kojo Idrissa](https://twitter.com/Transition). Notably, Kojo asked, what if the audience were primarily black women in their 40s to 60s? White men might start to wonder if they fit there. That is what underrepresented people are dealing with. All are welcome at DjangoCon US. + +[Matt Mitchell](https://twitter.com/geminiimatt), a security expert who specializes in working with marginalized groups around the world, gave the opening keynote, "[Building Community and Supporting Others](https://2019.djangocon.us/talk/keynote-matt-mitchelln/)." Matt compared community to the Model/Template/View paradigm (MTV), gave some examples of people and groups who dig deep to find inner strength, including Sheroes, Knowledge House, Torchbox, and Laura Tich of SheHacks, and challenged the audience to see the beauty in the community and be kind to each other. + +![](djangocon-us-2019-recap-images/matt-mitchell.jpg) + +Matt Mitchell; photo credit: Bartek Pawlik (https://bartpawlik.format.com/) + +A few other talks that resonated with me: + +In "[The Unspeakable Horror of Discovering You Didn't Write Tests](https://2019.djangocon.us/talks/the-unspeakable-horror-of-discovering-t/)," [Melanie Crutchfield](https://twitter.com/hellomelaniec) explained how she went from not even having one little digusting kale testing leaf in her app Five Up, to wanting to eat that disgusting testing vegetable for real. Yay! + +[Peter Baumgartner](https://twitter.com/ipmb) gave a detailed overview of hosting, configuration, web server, and asset options and tradeoffs in "[Prepping Your Project for Production](https://2019.djangocon.us/talks/prepping-your-project-for-production/)," using special slides by [Joni Trythall](https://twitter.com/JoniTrythall), our DjangoCon US Website Designer! + +[Casey Faist](https://twitter.com/cfactoid), Heroku's Python Platform Maintainer, gave a great talk, "[Everything you need to know but were afraid to ask about Data Classes](https://2019.djangocon.us/talks/everything-you-need-to-know-but-were-to/)" about the ins and outs of Python Data Classes. Heroku is special to me, as the first platform I ever deployed a Django app to. I'm thrilled that I had the chance to meet Casey at PyCon US and further chat at DjangoCon US! + +After a very popular DjangoCon US 2018 talk about [uncovering gender bias in Harry Potter](https://2018.djangocon.us/talk/a-bossy-sort-of-voice-uncovering-gender/), Eleanor Stribling followed up in 2019 with "[Think Like a Product Manager: Straightforward frameworks for building great products](https://2019.djangocon.us/talks/think-like-a-product-manager-frameworks/)," which provided a product management black box for non-product managers. + +Monday ended with an [Opening Reception](https://2019.djangocon.us/social-event/opening-reception/) that evening on the Marriott Lawn. Guests enjoyed drinks and food from buffet-style food stations... the mac and cheese bar was a huge hit! + +![](djangocon-us-2019-recap-images/opening-reception.jpg) + +Opening Reception; photo credit: Bartek Pawlik (https://bartpawlik.format.com/) + +### Your Web Framework Needs You + +At DjangoCon US 2018, [Carlton Gibson](https://twitter.com/carltongibson), Django Fellow, gave a talk "[Your Web Framework Needs You](https://2018.djangocon.us/talk/your-web-framework-needs-you/)." Carlton acknowleged that the community is more diverse than ever, but the core contributors have continued to be white guys, many of whom have been associated with Django for a very long time and are no longer even contributing. The talk was a call to action to community members to contribute to the Django core code. In short, there is not a quick fix, but change is a priority. + +As a side note, after DjangoCon US 2018, a [draft DEP dissolving Django Core](https://github.com/django/deps/pull/47/files) and creating a new model of governance was merged into the Django organization. This DEP is in part intended to fix some of the problems discussed by Carlton in his talk. [James Bennett](https://twitter.com/ubernostrum), the author of the DEP, explained the changes in his blog post "[Core no more](https://www.b-list.org/weblog/2018/nov/20/core/)." + +This year, Carlton gave a "[Framework Update](https://2019.djangocon.us/talk/framework-update-carlton-gibson/)." Progress is happening in Django core: the 1328 accepted tickets that existed last year were reduced to 1262 this year, with over 1000 new tickets opened; more than 1200 commits to master branch were made from 290 separate contributors, including new contributors and more contributors overall. Carlton gave examples of areas where individuals or self-organized groups could make improvements to Django core and its docs that could have a massive positive impact. Carlton again extended the invitation, "You're web framework still needs you! Come and join us." + +![](djangocon-us-2019-recap-images/carlton-gibson.jpg) + +Carlton Gibson; photo credit: Bartek Pawlik (https://bartpawlik.format.com/) + +### Tuesday + +[Jessica Rose](https://twitter.com/jesslynnrose) kicked off Tuesday with a keynote about a very important topic: "[Burnout and Balance](https://2019.djangocon.us/talk/keynote-jessica-rose/)." Using cognitive psychology and humor, she explained what occupational burnout is, the warning signs (based on the Mayo Clinic diagnostic survey for burnout), and strategies for preventing it or reducing the negative impact of it. I found these strategies very practical and plan to apply them in life. A few strategies in particular: take care of yourself first ("put on your own airmask before helping other people"), invest your energy selectively, and learn to say no. + +![](djangocon-us-2019-recap-images/jessica-rose.jpg) + +Jessica Rose giving a burnout demonstration; photo credit: Bartek Pawlik (https://bartpawlik.format.com/) + +A few other talks that resonated with me: + +In his talk "[Prefetching for Fun and Profit](https://2019.djangocon.us/talks/prefetching-for-fun-and-profit/)," [Mike Hansen](https://github.com/mwhansen/) walked us through what pre-fetching is, the problem it's trying to solve, and how it is implemented. In the process, Mike took a deep dive into the Django code. He suggested that people should dig into the Django internals more often and use their knowledge of it to improve their own code, instead of going directly to Stack Overflow. I like that. + +As a maintainer of [Pinax](https://github.com/pinax/), I'm always on the lookout for new ways to improve our process. [Luca Bezerra's](https://twitter.com/lucabezerra_) talk "[Pull Requests: Merging good practices into your project](https://2019.djangocon.us/talks/pull-requests-merging-good-practices/)" provided some good food for thought. Plus, the talk ended with one of Vinta's trademark checklists. I love a good checklist! + +### Thank You Dinner + +As a [DEFNA Board Member](https://www.defna.org/) and [DjangoCon US Website Chair](https://2019.djangocon.us/), I was treated to dinner on Tuesday evening at the nearby Yard House restaurant, along with speakers, emcees, patrons, and other organizers. It was a pleasure to attend. The atmosphere was warm and relaxed, filled with good conversation and laughs. I got to know my fellow-attendees better. + +![](djangocon-us-2019-recap-images/thank-you-dinner.jpg) + +Special "thank you" dinner; photo credit: Bartek Pawlik (https://bartpawlik.format.com/) + +Plates of appetizers were passed around the tables to share, filled with Wisconsin fried cheese curds, fried mac and cheese, jumbo Bavarian pretezel, fried calimari and poke nachos. I tried calimari, poke, and ahi for the first time. The mini chocolate soufflé cake topped with vanilla ice cream that I had for dessert was divine. + +After dinner, a cake was brought out for a special recognition of the longtime service of DjangoCon US volunteer [Ken Whitesell](https://twitter.com/KenWhitesell). Thank you, Ken! + +![](djangocon-us-2019-recap-images/ken-being-honored.jpg) + +Ken being honored; photo credit: Bartek Pawlik (https://bartpawlik.format.com/) + +### Deep-Dive Day + +![](djangocon-us-2019-recap-images/deep-dive-day.jpg) + +Deep-dive day; photo credit: Bartek Pawlik (https://bartpawlik.format.com/) + +Wednesday was the first ever DjangoCon US deep-dive day! + +The future of Python and Django has been on the minds of many lately. Community members have been asking how Python can remain relevant and vibrant, instead of becoming a legacy language. + +With the async and await keywords having been introduced in Python 3.5, Python is at a crossroads. +The new async model is much more efficient than the traditional sync threading model, and can provide functionality that makes Python and Django hugely scalable and more competitive with major players such as Node and Go. + +Unfortunately the sync and async models are largely incompatible. + +On the other hand, while sync is operating system managed and async is runtime managed, increasingly more code is being run in the browser. Could Python be run natively in the browser? + +What could be more timely than several deep-dive day talks grappling with these subjects? + +#### The Natural State of Computers + +[Amber Brown](https://twitter.com/hawkieowl), maintainer, and longest standing contributor of the asynchronous networking framework Twisted, started the day with her keynote "[The Natural State of Computers](https://2019.djangocon.us/talk/keynote-amber-brown/)." + +I was thrilled that morning when I met Amber at breakfast. + +![](djangocon-us-2019-recap-images/amber-brown.jpg) + +Amber Brown; photo credit: Bartek Pawlik (https://bartpawlik.format.com/) + +In her keynote, Amber gave a review of the computer architecture and performance landscape. Amber argued that computers are not getting faster and won't. All of the easy options have already been used to improve computer hardware performance. The alternative is to become more efficient, and async IO is far more efficient than traditional techniques that require blocking. + +Amber believes that computer performance is driving the async story. She said programming languages need a good async story, or they will lose users. async is nearly universally supported among operating systems and has been around for a long time. In the not so distant past, Node was similar to traditional Python, bound by single thread limits, until async support was added. Python then lost users to Node. + +The tide started turning when async was added to Node. Languages can no longer opt out of async support. While the Python GIL prevents the problems created by multi-threading, it also makes it difficult to use multi-threading in Python. Async is an alternative and can improve the Python async story. + +Amber gave a hat-tip to [Andrew Godwin](https://twitter.com/andrewgodwin) and other contributors who are bringing native async to Django. Amber said adding async to Django will bring async into the Python mainstream. The sky will be the limit. + +#### Async Django + +The Django community is embarking on one of the largest changes in Django's history: adding async support to Django core, led by [Andrew Godwin](https://twitter.com/andrewgodwin). + +Andrew's deep-dive day talk "[Just Add Await: Retrofitting Async Into Django](https://2019.djangocon.us/talks/just-add-await-retrofitting-async-into/)" was definitely a highlight of the week for me. + +Andrew has done extensive research about how to add async support into Django in a safe, backwards compatible way that maintains the familiarity of the Django API. His approach is detailed in [DEP 0009 (Async in Django)](https://github.com/django/deps/blob/master/accepted/0009-async.rst), which he authored. + +![](djangocon-us-2019-recap-images/django-async.jpg) + +Talk slide, current Django high-level architecture plus async + +Andrew explained the challenges and opportunities of adding async to Django and gave an update on the work that has been done and is planned for the future: + +* Phase One is complete. ASGI support was merged into Django 3.0 ([PR](https://github.com/django/django/pull/11209)), but can't do much yet other than speak to ASGI servers such as Daphne and Uvicorn +* Phase Two is in process. Andrew has async def views working in a branch right now ([branch](https://github.com/django/django/compare/master...andrewgodwin:async_views)), but performance is a struggle at the moment. Once async views are working, a lot of parallel work can begin in bringing async to other parts of Django. +* Phase Three, redefining the ORM for async, involves a lot of research, vision, and implementation work. + +Code development and maintenance are not cheap and an initiative of this scale needs to be properly organized and funded. If you are interesting in helping, Andrew has outlined some ways to help on the [Async Project Page](https://code.djangoproject.com/wiki/AsyncProject) + +Andrew had a "Thanks" slide at the end of his talk, but the community should be thanking Andrew for his hard work in bringing async to Django! + +In addition to Andrew's talk, I highly recommend watching [Tom Christie](https://twitter.com/_tomchristie)'s DjangoCon Europe 2019 talk, "[Sketching Out a Django Redesign](https://www.youtube.com/watch?v=u8GSFEg5lnU)." Tom contrasted sync and async, explained the benefits of async and why it matters to the longterm success of Django, gave an overview of the ASGI landscape, and praised Andrew's plan of progressively adding async into the Django stack as very achieveable. He believes that while nothing beats Python for productivity, by adding the performance provided by async, Python will hit its sweet spot. + +#### Python and WebAssembly + +In his talk "[WASM Matter](https://2019.djangocon.us/talks/wasm-matter/)," [Dr. Russell Keith-Magee](https://twitter.com/freakboy3742) talked about the emerging opportunity to use WebAssembly (WASM) to run Python code in the browser. + +Russell told the story of Java and JavaScript. In the mid-90s, Java promised to be the language you could write once and run everywhere, replacing all other programming languages. JavaScript was invented around the same time. Unlike Java, and Python, JavaScript didn't have a standardized byte code format or virtual machine that would make it cross platform. It just worked in the browser. Because of the importance of the browser, developers have tried to "reinvent the universe" using JavaScript. This might have given the appearance that JavaScript would one day become the universal language Java once promised to be. But rather than one language being universal, it might be that the JavaScript runtime becomes universal for programming languages through the use of WASM. + +Russell explained what WASM is and how it works. WASM can take code such as Python, that would normally be compiled and run in a virtual machine via a computer operating system, and instead compile it into a ready-to-use binary format that can be run in the browser. Russell gave a review of the landscape, starting with [emscripten](https://emscripten.org/), a tool for compiling code Clang can compile (such as C) into asm.js and WASM binary instead. + +Russell gave a few promising ways of using Python and WASM together + +* The [Pyodide](https://github.com/iodide-project/pyodide) project uses enscripten to compile the CPython source code to WASM. The result can be used to deploy a Python shell in the browser completely clientside, similarly to a Jupyter notebook session. Because it's big, the smaller implementation Micro Python could be used alternatively. +* Russell's own experiment is [Batavia](https://github.com/beeware/batavia), which implements a CPython virtual machine in pure Javascript, which provides a Python REPL in the browser. Bytecode is run directly, no parsing or compiling needed. + +Russell ended by mentioning the great organization [BeeWare](https://beeware.org/). + +For a view of the larger picture of the "Black Swan" challenges facing the Python ecosystem as a whole, I also highly recommend watching Russell's excellent [keynote](https://www.youtube.com/watch?v=ftP5BQh1-YM) from PyCon US 2019. + +#### Django Framework Deep-Dives + +In addition, several stellar talks further explained important aspects of the Django framework itself: + +* [Using Django as a Micro-Framework: Hacking on the HTTP handlers and middleware (for fun and profit)](https://2019.djangocon.us/talks/using-django-as-a-micro-framework-on-the/) by [Carlton Gibson](https://twitter.com/carltongibson) +* [The Ins and Outs of Model Inheritance](https://2019.djangocon.us/talks/the-ins-and-outs-of-model-inheritance/) by [Blythe J Dunham](https://github.com/blythedunham/) +* [Generic View? What is that and why would I use it?](https://2019.djangocon.us/talks/generic-view-what-is-that-and-why-would/) by [Felipe Lee](https://twitter.com/felipeleeg) +* [Understanding Django authentication](https://2019.djangocon.us/talks/understanding-django-authentication/) by [Renato Oliveira](https://twitter.com/_renatooliveira) + +#### Deep-Dive Day Wrap Up + +Deep-dive day ended with [Frank Wiles](https://twitter.com/fwiles) making a call to action for corporate sponsorship of [Django Software Foundation](https://www.djangoproject.com/foundation/). + +Conference Chair [Jessica Deatz](https://twitter.com/__deatz__) and Co-Chair [Sara Gore](https://twitter.com/saradgore) then gave the conference closing comments and were presented with special framed photos in appreciation for their hard work. + +![](djangocon-us-2019-recap-images/jessica-and-sara.jpg) + +Jessica and Sara closing out yet another wonderful conference; photo credit: Bartek Pawlik (https://bartpawlik.format.com/) + +### Sprints + +Sprints took place on Thursday and Friday + +On the first day of sprints, Carlton Gibson led a workshop "[How to Contribute to Django](https://2019.djangocon.us/how-to-contribute-django/)." More people than expected showed up and we had to move to a larger area. + +![](djangocon-us-2019-recap-images/carlton-gibson-and-sprinters.jpg) + +Carlton Gibson helping at a table of sprinters; photo credit: Bartek Pawlik (https://bartpawlik.format.com/) + +While we were installing Django, it was pointed out that a bug commonly occurs while installing Django on Mac OS. This bug can be circumvented by using the [django-docker-box](https://github.com/django/django-docker-box) tool. I went ahead and used django-docker-box, which probably sped up my installation process and saved me some frustration. It was great to see so many people sharing knowledge and trouble shooting together. + +Later in the day, I made [my first PR](https://github.com/django/django/pull/11838) to Django core. Yay! + +In the PR, I [added django-docker-box to the Django docs](https://docs.djangoproject.com/en/2.2/internals/contributing/writing-code/unit-tests/#running-tests-using-django-docker-box) as an installation option. Hopefully, drawing attention to this option will have a big impact in making the local setup process easier for others. + +Due to a sick computer and conference travel, Django Fellow [Mariusz Felisiak](https://twitter.com/MariuszFelisiak) assisted me in updating and merging this important PR. I'm proud to have left the campground better than I found it, as my friend Jeff would say. + +The [workshop notes](https://github.com/carltongibson/dcus2019sprints) are open source for anyone who would like to use them to contribute! + +A special shoutout to Django Core Dev [Chris Beaven](https://twitter.com/SmileyChris) of Lincoln Loop who personally assisted people at my table with troubleshooting. + +The Sprints also included an "[Intro to Contributing to Open Source](https://2019.djangocon.us/intro-contributing-open-source/)" workshop led by [Jeffrey Eliasen](https://twitter.com/jeffreyeliasen), as well as a Git Help Desk. + +### Sight Seeing + +If the conference wasn't amazing enough, I had time to do some spectacular sightseeing in San Diego. + +Here are some highlights: + +The night of my arrival, I enjoyed a simple, but magical evening in downtown San Diego's [Little Italy district](https://www.littleitalysd.com/). After eating delicious alfredo and zucchini pasta for supper at [Landini's Pizzeria](https://www.landinispizzeria.com/menu/), I wandered through the large, open-air [piazza](https://www.littleitalysd.com/explore/piazza-della-famiglia). People relaxed at tables, eating ice cream and Italian food, under the colorful lights strung overhead, amid the sound of accoustic guitar music and water flowing in a nearby fountain. + +![](djangocon-us-2019-recap-images/little-italy-piazza.jpg) + +Little Italy piazza; photo credit: Katherine Michel + +I happened to look down the street at the marina in the distance. For several breathtaking minutes, I gazed at the boats and water dramatically illuminated by a pastel sunset. Wow! + +![](djangocon-us-2019-recap-images/sunset-illuminating-the-marina.jpg) + +Looking down the street at the sunset illuminating the marina; photo credit: Katherine Michel + +In 2018, I traveled to Coronado Island by bus and got off at the [Hotel del Coronado](https://hoteldel.com/) bus stop in search of Coronado Beach. Having known nothing in advance about the location, I was gobsmacked to find a beach-front hotel that felt like a movie set. Walking around back, I found the greenest of manicured grass, palm trees rising high into the air, and in the distance, Coronado Beach glittering gold under the sun. It was a jawdropping moment that I'll never forget. + +This year, I wanted to see some other San Diego beaches, so I traveled to [Mission Beach](https://en.wikipedia.org/wiki/Mission_Beach,_San_Diego) and [Ocean Beach](https://en.wikipedia.org/wiki/Ocean_Beach,_San_Diego). + +Walking along Mission Beach boardwalk, for the first time, I experienced the quintessential California culture I had read about and seen on TV. On the strip, there were brightly painted taco, ice cream, and surf shops. The boardwalk was lined with cottages and palm trees. In the distance, beachgoers sunbathed, swam, made sand castles, ran along the water and played beach volleyball. Surfers in body suits carried their surfboards to and from the ocean. Rollerbladers deftly maneuvered through the crowds. + +![](djangocon-us-2019-recap-images/mission-beach.jpg) + +Mission Beach; photo credit: Katherine Michel + +At Ocean Beach, I walked to the end of the pier, the longest concrete pier on the west coast at 1,971 feet, for a panoramic view of the ocean and beach. + +![](djangocon-us-2019-recap-images/ocean-beach-pier.jpg) + +Walking to the end of Ocean Beach Pier; photo credit: Katherine Michel + +![](djangocon-us-2019-recap-images/ocean-beach-from-pier.jpg) + +Looking out at Ocean Beach from the pier; photo credit: Katherine Michel + +Afterward, I returned to San Diego proper and embarked on a tour of [Tijuana](https://en.wikipedia.org/wiki/Tijuana). For me, an important part of having the opportunity to travel is to learn about and enjoy the local culture and this was the perfect opportunity to do that. I was amazed to find out that the border between the US and Mexico can be reached from downtown San Diego in about 45 minutes by Trolley. Led by a tour guide who grew up Tijuana, we were issued one-day visas, then walked into Mexico. We went to the Tijuana Wax Museum, walked the downtown, ate tacos, and went to a club. + +![](djangocon-us-2019-recap-images/street-market-in-tijuana.jpg) + +Walking through a street market in Tijuana; photo credit: Katherine Michel + +Later in the week, I walked the [embarcadero](https://www.portofsandiego.org/where-to-go/embarcadero), went to the [Midway](https://www.midway.org/) museum, and took a cruise of the harbor. With a clear blue sky and water the gorgeous pictures practically take themselves at the embarcadero. The Midway museum was incredible. I particularly enjoying standing at the end of the deck on a walkway suspended above the ocean, then taking the Bridge Tour, which included the Flight Control, Chart Room, Navigation Bridge, and Admiral and Captain's Quarters. And the harbor cruise was a great way to relax at the end. The ship circled the bay with the Captain pointing out the notable sights. The California sea lions were a highlight for me, as well as the stunning San Diego skyline. + +![](djangocon-us-2019-recap-images/embarcadero.jpg) + +Beautiful view along the embarcadero; photo credit: Katherine Michel + +![](djangocon-us-2019-recap-images/midway-bridge-and-plane.jpg) + +Midway Bridge and plane; photo credit: Katherine Michel + +![](djangocon-us-2019-recap-images/midway-hangar-deck.jpg) + +View of the Midway Hangar Deck from the Navigation Bridge; photo credit: Katherine Michel + +![](djangocon-us-2019-recap-images/harbor-cruise.jpg) + +View of the San Diego skyline from harbor cruise; photo credit: Katherine Michel + +That night, I went to the [Taco Stand](http://downtown.letstaco.com/) where I enjoyed a Carne Asada Taco and Grilled Pescado Taco (Mahi Mahi). I had never had a fish taco before. The combination of grilled fish, cabbage, and chipotle sauce was delicious in a way I hadn't anticipated. Thank you to [Trey Hunner](https://twitter.com/treyhunner) for one of many great recommendations. + +![](djangocon-us-2019-recap-images/taco-stand.jpg) + +Yummy tacos at Taco Stand; photo credit: Katherine Michel + +Afterward, for dessert, I visited [Salt and Straw](https://saltandstraw.com/flavors/#sd) ice cream shop in Little Italy. Their ice cream cups are a familar sight in Little Italy. I am still dreaming of the Sea Salt with Caramel Ribbons ice cream I had there that night. Can't wait to go back sometime. + +![](djangocon-us-2019-recap-images/salt-and-straw-ice-cream.jpg) + +Delicious Salt and Straw ice cream; photo credit: Katherine Michel + +### Join Us? + +If you enjoyed this blog post, you might enjoy reading my [PyCon US 2019 blog post](https://eldarion.com/blog/2019/06/01/recap-pycon-us-2019/), or watching the replay of the DjangoCon US 2018 "[State of Django](https://2018.djangocon.us/talk/state-of-django-panel/)" panel, in which several DEFNA Board Members, including myself, and other community members talk about our efforts. + +My DjangoCon experience couldn't have been better. I learned a ton, networked with friends new and old, and had some once-in-a-lifetime sight seeing moments. Thank you to Chair [Jessica Deatz](https://twitter.com/__deatz__), Co-Chair [Sara Gore](https://twitter.com/saradgore), and all of the organizers, speakers, and attendees who made DjangoCon US 2019 a special conference. + +Join us next year... ? + +![](djangocon-us-2019-recap-images/organizers.jpg) + +Organizers, including me; photo credit: Bartek Pawlik (https://bartpawlik.format.com/) diff --git a/_sources/djangocon-us-2023-recap.md.txt b/_sources/djangocon-us-2023-recap.md.txt new file mode 100644 index 00000000..c8fbe5c0 --- /dev/null +++ b/_sources/djangocon-us-2023-recap.md.txt @@ -0,0 +1,1034 @@ +# DjangoCon US 2023 Recap + +Table of Contents +----------------- + +- [Intro](#intro) +- [Pre-Conference Activities](#pre-conference-activities) + - [DEFNA Board Dinner](#defna-board-dinner) + - [Django Girls Workshop](#django-girls-workshop) + - [Swag Stuffing](#swag-stuffing) + - [Django Social](#django-social) + - [Meeting the New PSF Executive Director Deb Nicholson](#meeting-the-new-psf-executive-director-deb-nicholson) + - [A Chance to Hang Out with Old Friends and Make New Friends](#a-chance-to-hang-out-with-old-friends-and-make-new-friends) +- [Monday](#monday) + - [Meeting the New Django Fellow Natalia Bidart](#meeting-the-new-django-fellow-natalia-bidart) + - [Kojo Idressa and Peter Grandstaff Kick Off the Conference](#kojo-idressa-and-peter-grandstaff-kick-off-the-conference) + - [Finding Purpose in Open Source Through Community Building](#finding-purpose-in-open-source-through-community-building) + - [HTML-ivating your Django web app's experience with HTMX, AlpineJS, and streaming HTML](#html-ivating-your-django-web-apps-experience-with-htmx-alpinejs-and-streaming-html) + - [Fried Green Tomatoes :)](#fried-green-tomatoes-) + - [What Can the DSF Do for Me? What Can I Do for the DSF?](#what-can-the-dsf-do-for-me-what-can-i-do-for-the-dsf) + - [Parts and Labor, The Parlour, and Back to the Hotel](#parts-and-labor-the-parlour-and-back-to-the-hotel) +- [Tuesday](#tuesday) + - [Hallway Track](#hallway-track) + - [Django Social T-Shirt](#django-social-t-shirt) + - [Coherence Demo](#coherence-demo) + - [Navigating Django's Future: Djangonaut Space](#navigating-djangos-future-djangonaut-space) + - [Don't Buy the "AI" Hype](#dont-buy-the-ai-hype) + - [An Approach to Lightweight Tenancy Management Using Django Rest Framework](#an-approach-to-lightweight-tenancy-management-using-django-rest-framework) + - [Speaker and Organizer Dinner](#speaker-and-organizer-dinner) +- [Wednesday](#wednesday) + - [Testing Modern Web Apps Like a Champion](#testing-modern-web-apps-like-a-champion) + - [Inside Out: My Journey of Understanding Inclusion](#inside-out-my-journey-of-understanding-inclusion) + - [DjangoCon Africa](#djangocon-africa) + - [Another Great Adventure](#another-great-adventure) + - [Conference Conclusion](#conference-conclusion) +- [Sight Seeing and More Food](#sight-seeing-and-more-food) + - [Sarah P. Duke Gardens](#sarah-p-duke-gardens) + - [Duke Chapel](#duke-chapel) + - [Museum of Life and Science](#museum-of-life-and-science) + - [Parizade](#parizade) + - [Loaf](#loaf) + - [Pizzeria Toro](#pizzeria-toro) + - [Simon Says Dip This](#simon-says-dip-this) + - [Press Coffee, Crepes, and Cocktails](#press-coffee-crepesand-cocktails) +- [In Closing](#in-closing) + +## Intro + +Disclaimer: the content of this post is a reflection of my career journey and not specific to my work at JPMorganChase. + +DjangoCon US 2023 took place from October 16-20 in Durham, North Carolina. It was the sixth DjangoCon US I've had the privilege of attending, and in my opinion, the best one yet. + +Attendees (photo credit: Bartek Pawlik (https://bartpawlik.format.com/)) +![](djangocon-us-2023-recap-images/attendee-photo.jpg) + +[**back to top**](#table-of-contents) + +## Pre-Conference Activities + +### DEFNA Board Dinner + +!["Thank you to our DEFNA President Peter Grandstaff and Two Rock Software for treating fellow DEFNA Board Members in Durham for DjangoCon US to a magical dinner last night at Parizade. The apple pie mezcal margarita, linguini and clams, cookie and ice cream dessert, and company were stellar."](djangocon-us-2023-recap-images/parizade-post.png) + +Things got off to a great start with a DEFNA Board dinner at [Parizade](https://www.parizadedurham.com/menus/) on Saturday night. + +According to every person I spoke to who had eaten there before, you can't go wrong. Everything is so good. I'd never eaten linguini and clams before, but it sounded really good. I decided to be adventurous and try it. If you won't do something new on the eve of DjangoCon US, when will you? I chose well. + +It was a rare opportunity to spend time in person with other board members and enjoy a perfect meal. + +Wow... +![](djangocon-us-2023-recap-images/parizade-dining-room.jpg) + +Apple Pie Mezcal Margarita ("Del Maguey Vida Mezcal, triple sec, lime juice, apple pie syrup, salted rim") +![](djangocon-us-2023-recap-images/parizade-apple-pie-mezcal-margarita.jpg) + +Linguini and clams ("chorizo, cherry tomatoes, toasted garlic, white wine sauce, tarragon bread crumbs") +![](djangocon-us-2023-recap-images/parizade-linguini-and-clams.jpg) + + + +DEFNA Board (photo credit: Bartek Pawlik (https://bartpawlik.format.com/)) +![](djangocon-us-2023-recap-images/defna-board.jpg) + +[**back to top**](#table-of-contents) + +### Django Girls Workshop + +I love a good cup of coffee. On Sunday, I ventured to nearby [Cocoa Cinnamon](https://littlewaves.coffee/pages/old-north-durham) coffee shop. I had a Dr. Durham Latte ([organizer recommended](https://2023.djangocon.us/venue/#places)). + +Cocoa Cinnamon Coffee Shop +![](djangocon-us-2023-recap-images/cocoa-cinnamon.jpg) + +Dr. Durham Latte ("House made vanilla bean syrup, maca root, and ginger topped with black lava salt") +![](djangocon-us-2023-recap-images/cocoa-cinnamon-dr-durham.jpg) + +With coffee in hand, I was looking for the [Durham Convention Center](https://www.durhamconventioncenter.com/) to help with organizing, got lost, and serendipitously stumbled upon the [Django Girls](https://djangogirls.org/en/durham/) Workshop hosted at the office of our wonderful, longtime partners [Caktus Group](https://www.caktusgroup.com/). I was reunited with my friends Dawn Wages, Jay Miller, Jason Judkins, Rebecca Conway, and Tim Allen. It was a great time at an event where lives are changed. The event featured a majority of Black participants! While at the workshop, I enjoyed food from [Neomonde Mediterranean](https://www.neomonde.com/mediterranean-restaurant-durham/) ([organizer recommended](https://2023.djangocon.us/venue/#places)), caught up with my friends, and picked up some swag! + +So good to be welcomed in by my friend Tim :) +![](djangocon-us-2023-recap-images/tim-welcome.jpg) + +Django Girls lunch from Neomonde Mediterranean +![](djangocon-us-2023-recap-images/django-girls-lunch.jpg) + +I've always wanted one of these shirts! +![](djangocon-us-2023-recap-images/django-girls-shirts.jpg) + +[**back to top**](#table-of-contents) + +### Swag Stuffing + +I eventually made it to the Durham Convention Center for swag stuffing! Many hands make light work. + +Swag stuffing operation (I spy a [DEFNA](https://www.defna.org/) sticker!) +![](djangocon-us-2023-recap-images/swag-stuffing.jpg) + +[**back to top**](#table-of-contents) + +### Django Social + +Later that night, I attended Django Social at [Ponysaurus](https://www.ponysaurusbrewing.com/taproom). The event was hosted by Jason Judkins, DjangoCon US Organizer, and Jon Gould of [Foxley Talent](https://foxleytalent.com/about/), DjangoCon US Sponsors. + +Jon and company have started a network of Django meetups in the UK called Django Social. Jason is starting a [Raleigh-Durham chapter](https://www.meetup.com/djangosocial-raleighdurham/) and this was the kickoff. + +Not being a fan of beer, I had a Ponysaurus signature [Beer Cocktail](https://www.ponysaurusbrewing.com/taproom-menu) called a Gosé Margarita (lime juice, triple sec, & tequila, topped with Gosé beer). + +Gosé Margarita +![](djangocon-us-2023-recap-images/ponysaurus-beer-cocktail.jpg) + +!["Thank you to Jason Judkins and Jon Gould for generously hosting a wonderful Django Social event tonight on the eve of DjangoCon US. I enjoyed meeting and getting to know the new Python Software Foundation Executive Director Deb Nicholson, spending time with two of my favorite Python/Django authors Eric Matthes and William Vincent, and catching up with my wonderful Revsys friends Frank and Jeff, among many interesting conversations."](djangocon-us-2023-recap-images/thank-you-to.png) + +[**back to top**](#table-of-contents) + +#### Meeting the New PSF Executive Director Deb Nicholson + +During the event, I happened to find myself having a conversation with a woman who really knew a lot about open source and events! It turned out to be the new [Python Software Foundation Executive Director Deb Nicholson](https://www.python.org/psf/records/staff/). Serendity strikes again. I love it when that happens. :) She was accessible throughout the conference, and it was a wonderful place to get to know her. Check out her Monday talk [Meet-ups: A Grand Vision for a Humble Endeavor](https://2023.djangocon.us/talks/meet-ups-a-grand-vision-for-a-humble-endeavor/). + +Me and PSF Executive Director Deb Nicholson later in the week +![](djangocon-us-2023-recap-images/me-and-deb.jpg) + +[**back to top**](#table-of-contents) + +#### A Chance to Hang Out with Old Friends and Make New Friends + +Hanging out with favorite Python/Django authors Eric Matthes and William Vincent, and my wonderful Revsys friend and fellow DEFNA Board Member Jeff Triplett +![](djangocon-us-2023-recap-images/jeff-eric-william.jpg) + +[**back to top**](#table-of-contents) + +## Monday + +### Meeting the New Django Fellow Natalia Bidart + +On Monday, I ate breakfast with our new [Django Fellow Natalia Bidart](https://www.djangoproject.com/weblog/2023/mar/31/welcome-our-new-fellow-natalia-bidart/). I was thrilled to meet her! We talked about our work, what her experience has been like so far as a Django Fellow, and she introduced me to the art of drinking [maté](https://en.wikipedia.org/wiki/Mate_(drink)). + +[**back to top**](#table-of-contents) + +### Kojo Idressa and Peter Grandstaff Kick Off the Conference + +DEFNA North America Ambassador Kojo Idressa kicked of the conference with the the kind of [Orientation and Welcome](https://2023.djangocon.us/talks/orientation-and-welcome/) that only he can deliver. + +Thank you Kojo for setting the stage for a wonderful conference. + +![“All of you are beyond welcome and we are thrilled you are here.”](djangocon-us-2023-recap-images/kojo-welcome.png) + +Kojo also educated the audience about the concept of a Self Care Sprint. It's important to take time for yourself, as needed. + +Self Care Sprint +![](djangocon-us-2023-recap-images/self-care-sprint.jpg) + +During the Opening Remarks, Conference Chair Peter Grandstaff asked everyone to be kind and make this conference a great place for everyone else. "If you see someone engaging in inappropriate behavior, here's a phrase you can use, 'Hey, we don't do that here.'" + +A powerful tool borrowed from PyCon Australia and written about by Eric Holscher of [Read the Docs](https://about.readthedocs.com/) and [Write the Docs](https://www.writethedocs.org/) for setting norms: "[Hey, we don't do that here.](https://www.ericholscher.com/blog/2023/feb/10/we-dont-do-that-here/)" +![](djangocon-us-2023-recap-images/hey-we-dont.jpg) + +[**back to top**](#table-of-contents) + +### Finding Purpose in Open Source Through Community Building + +Abigail Mesrenyame Dogbe delivered the keynote [Finding Purpose in Open Source Through Community Building](https://2023.djangocon.us/talks/keynote-finding-purpose-in-open-source-through-community-building/). + +When Abigail was young, she didn't like math, science, and computers. Her parents would show her how to do a chore, then leave her to do it herself. She credits them with having taught her how to bring people into open source. That is her purpose in life. + +In 2017, after her undergraduate studies, she took part in a Django Girls workshop with DjangoCon US Organizer Noah Alorwu as her mentor. She was encouraged to give back by teaching other women how to code. She went on to be an organizer or mentor at 25 events with 500+ participants in cities and and remote areas of Ghana. She was happy to be the first female mentor, but not satisfied. She encouraged other women to become involved. + +Only two years later, at PyCon Africa Django Girls workshop in Ghana, all of the coaches were women. It was a proud moment and a result of that effort. + +Abigail told the stories of six people she had met through her open source work. Some were shy or inexperienced. Others were more established. Some were coders, some weren't. Some had a passion. Others were trying to figure out where they could fit in. She was able to get to know them and see their potential. Like her parents, she taught them how to do tasks, then left them on their own to grow into leadership and perhaps find themselves in the process. She has been able to "10x" her impact this way. + +Abigail talked about some of the challenges faced: +* Lack of opportunities (especially for junior developers) +* Lack of paid open source work +* Lack of resources +* Travel and visa difficulties + +Abigail missed out on some high profile international speaking opportunities due to visa denials. Being a US grad student has opened doors. + +Abigail talked about organizers who have grown the Africa Python/Django community, looked out for her, and pushed her outside of her comfort zone. + +She is currently on a journey to become an open source program manager, using all of her lessons learned. Contributing to open source has helped her develop resilience, embrace discomfort, achieve personal growth, and find purpose. + +Her organizer resume is impressive: Django Girls, PyLadies Ghana, PyData Ghana, PyLadies Morovia, PyLadies Zambia and other PyLadies communities, PyLadies Global, PyCon Ghana 2018, PyCon Africa, PSF internship, Everything Open Research (a non-profit she started), and DE&I research + +She invited the audience to DjangoCon Africa in Zanzibar, Tanzania from November 6-11. Another PyCon Africa is also in the works. + +She asked the audience to consider how they are helping bring people into open source, especially people who do not necessarily love coding. She hopes her story will inspire others to give back to their local communities. + +Abigail and I have been following each other on social media for quite a while. I was really excited to meet her in person! + +Me and Abigail +![](djangocon-us-2023-recap-images/me-and-abigail.jpg) + +!["Don’t have stats, but this feels like the most diverse DjangoCon US I’ve ever been to. Particularly excited at how many Africans we have speaking and attending, starting with Abigail Mesrenyame Dogbe‘s inspiring keynote “Finding Purpose in Open Source Through Community Building.” #DjangoConUS"](djangocon-us-2023-recap-images/don't-have-stats.png) + +[**back to top**](#table-of-contents) + +### HTML-ivating your Django web app's experience with HTMX, AlpineJS, and streaming HTML + +Chris May has been a long-time appreciator of the Django community and wants to give back by elevating the experience of your Django app through his talk [HTML-ivating your Django web app's experience with HTMX, AlpineJS, and streaming HTML](https://2023.djangocon.us/talks/html-ivating-your-django-web-app-s-experience-with-htmx-alpinejs-and-streaming-html/). + + + +Chris began by talking about the prevalent architectural pattern of SPAs. +![](djangocon-us-2023-recap-images/chris-spas.png) + +Chris believes that better user experience drove their popularity. +![An initial page load downloads a JavaScript application that handles all interactions and uses APIs to communicate with servers. As the data changes, the page is updated with small payloads without reloading the page. Users enjoy dynamic and engaging interfaces.](djangocon-us-2023-recap-images/chris-experience-drove-spa-popularity.png) + +But, SPAs have been overused. +!["SPAs incur complexity that simply doesn't exist with traditional server-based websites: issues such as search engine optimization, browser history management, web analytics and first page load time all need to be addressed. Proper analysis and consideration of the trade-offs is required to determine if that complexity is warranted for business or user experience reasons. Too often teams are skipping that trade-off analysis, blindly accepting the complexity of SPAs by default even when business needs don't justify it. "](djangocon-us-2023-recap-images/chris-spa-thoughtworks.png) + + + +Spa user experience is no longer an advantage. + +Chris referred to a real life case study [Making the world’s fastest website, and other mistakes](https://dev.to/tigt/making-the-worlds-fastest-website-and-other-mistakes-56na) by Taylor Hunt, a developer at a supermarket chain. Taylor knew their web app needed a better experience and wanted to record what customers experienced. + +He bought several popular phones, gave them to people, and recorded them performing a task. He asked them to load either the production web app, super market chain native app, or the competitor amazon.com or walmart.com apps. Once loaded, search for eggs, add the first result to the shopping cart, and start the checkout process. + +Chris showed a video of the results. + +Each app takes a significant amount of time to accomplish the task, sometimes with a lag between the time the user touches the device and app response. The apps took between 59 seconds and 4 minutes to finish. + + + +Ranging from 59 seconds to 4 minutes to finish +![](djangocon-us-2023-recap-images/chris-demo-1.png) + +Taylor knew it could be better and had a vision: "Be so fast it’s fun on the worst devices and networks our customers use." + +He found some advice from 2017- for optimal website performance, establish a budget of 130 kb or less (first download- HTML, CSS, JavaScript). Due to the third party JavaScript data collection tools and use of ReactJS and Redux in the production app, he could not meet the budget as a SPA app. He decided to focus on HTML, with minimal CSS and laser-focused JavaScript that required complex interactivity. + +His demo app was the functional equivalent of the production app (using same phone, internet, server, APIs, data), with a drastically elevated experience. Much quicker to load and interact with, it finished in 20 seconds. + +20 seconds to finish! +![](djangocon-us-2023-recap-images/chris-demo-2.png) + +Due to the capabilities of new tools, Django websites can be just as friendly as SPAs and much easier to maintain. In the talk, Chris would show us how. + +Chris told the story of Caleb, a Laravel developer at Titan, one of the best PHP shops. He realized there was a significant cost and complexity to SPAs, so he decided to default to traditional web apps and only choose a SPA when needed. But, after starting to create a web app, he would always feel a gravitational pull back to SPA. He realized the seminal decision causing this would be when you decide to return JSON from the server. You need JavaScript on the page to receive the request. If you return HTML, you need much less JavaScript on the page to handle it. He created a framework called [Livewire](https://laravel-livewire.com/) for Laravel Developers. + + + +Python and Django devs have adopted a different framework called [HTMX](https://htmx.org/) that is growing in popularity. HTMX enables JavaScript-like functionality, without the use of JavaScript, such as re-rendering part of a page using AJAX at the cost of just 14 kb. + +Alpine was created to support Livewire. According to Chris, it's an incredible framework that can create rich interactions with very little JavaScript. Its focus is the in-page experience. You can use it to create mobile components, make dynamic forms. It is reactive, so any data on the page associated with HTML will updated when changed. + +HTMX and Alpine together can enable you to give your users a SPA-like experience for less than 30 kb. + +![Five components of elevated experiences: remove whole page refreshes for every interaction- accomplished with HTMX, use small pyaloads form the server to update the interface- accomplished with HTMX, update HTML as a result of changes in data- accomplished with Alpine, empower rich on-page interactions- accomplished with Alpine, be fast](djangocon-us-2023-recap-images/chris-components-of-elevated-experience.png) + + + +These two frameworks, along with Tailwind CSS have brought the joy of web dev back to his life. He hadn't realized how much it had faded over time. + +![Developer Experience boost: Both frameworks can use HTML attributes to control behavior, locality, remove your JS build system, write mostly Python and HTML, easier maintenance, faster iteration cycles](djangocon-us-2023-recap-images/chris-developer-experience-boost.png) + + + +Chris then wanted to focus on the "Be fast" component of elevated experience, which he said could trump the rest. + +SPAs using React and other JavaScript frameworks have a hidden cost- time to boot up. + + + +Chris went back to the production app and demonstrated that the JavaScript prep took so much phone resource that it caused the text input to lag. The eggs search was deleted and the app then attempted to find 360,000 items and summarize them on the page instead. The user would then have to research, taking over a minute and a half. + +In the demo app, the transaction happens very quickly, before the app has finished loading. As soo as the search bar appears, it is able to be used for a search. Critical elements are delivered as quickly as possible, and the user is not prevented from accomplishing their goal. + +Chris wants Python developers to be able to do this. + +Currently, Python will obtain all of the data, put it in the template, then send it in the response. This is ok, but can hurt user experience. + +Chris proposes that when the request comes in, we start sending the template as soon as we can and continue sending pieces of it as they become available, until it's done. This can be done using streaming HTML technology that has been around since 1997. Every browser is already optimized to use it. + + + +Chris created a recommendation engine and engineered it to take up to five seconds to load recommendations on the homepage. + + + +If the CSS container element does not have four items, the page will render the CSS skeleton elements shaped like the eventual content. This will prevent the page from jumping around as it renders. Each recommendation will be sent when it is ready. Meanwhile, the user can use the site. + + + +He demonstrated how to create the demo functionality in Django using Django 4.2's new `StreamingHttpResponse` async functionality. Unfortunately, as of the conference, this pattern only works with Jinja templates. + +He also showed some patterns that work with Django templates too. + +![Option 1: Split templates into parts, yield each one via Django 4.2's new async iteration in `StreamingHttpResponse`](djangocon-us-2023-recap-images/chris-option-1.png) + +![Option 2: Render a view, subscribe to HTMX Server-Side Events, send the slow parts to the page when they're ready](djangocon-us-2023-recap-images/chris-option-2.png) + + + +These are not the only options. Chris has created a [web-async-patterns repo](https://github.com/PyHAT-stack/web-async-patterns) in PyHAT-stack GitHub organization. He wants your contributions. He believes that the community can create better patterns that empower us and enable Django to do new things. + +Chris closed by summarizing what created an exception experience. +![Exceptional Experiences with Django: Using `StreamingHttpResponse` to stream critical elements to the user as quickly as possible, use HTML fragments to update parts of the page with HTMX, leverage scoped down frameworks like Alpine.js to power rich interactions](djangocon-us-2023-recap-images/chris-exceptional-experiences.png) + +[**back to top**](#table-of-contents) + +### Fried Green Tomatoes :) + +At lunch... trying a fried green tomato for the first time! +![](djangocon-us-2023-recap-images/marriott-fried-green-tomato.jpg) + +[**back to top**](#table-of-contents) + + + +### What Can the DSF Do for Me? What Can I Do for the DSF? + +Chaim Kirby, Django Software Foundation (DSF) President, asked [What Can the DSF Do for Me? What Can I Do for the DSF?](https://2023.djangocon.us/talks/what-can-the-dsf-i-do-for-me-the-dsf/) + +![](djangocon-us-2023-recap-images/what-can-the-dsf.jpg) + +What can the DSF do for me? He gave a report card: +* Support development of Django by sponsoring sprints, meetups, gatherings and community events: B +* Promote the use of Django among the World Wide Web development community: D +* Project the intellectual property and the framework's long-term viability: A +* Advance the state of the art in web development: no grade + +Chaim gave a special thanks to DSF Board Assistant Catherine Holmes: "Honestly, we could disappear and if Catherine sticks around, things keep going." + +What can I do for the DSF? + +Chaim announced two new initiatives: +* Change to DSF membership qualification +* DSF Working Groups + +In the past, DSF membership has been available to people who shared IP with the DSF- that is, literally wrote code or documentation. + +DSF membership will now go beyond code or documentation to recognize the myriad of ways that people support the Django community. It will be predicated on making meaningful contributions toward the purpose of the DSF. + +The DSF is also changing how its day-to-day work gets done by re-distributing power from the DSF Board to working groups. The working groups will be tracked in the [DSF Working Groups GitHub repo](https://github.com/django/dsf-working-groups). If you have an idea for how to better achieve a DSF goal, there is a process and template. You can nominate yourself to define a working group and the board will review, with the potential for a budget. + +Chaim gave a special thanks to Jacob Kaplan-Moss for taking the lead on the DSF Working Groups initiative. + +For more info, check out Jacob's blog post [Announcing DSF Working Groups](https://www.djangoproject.com/weblog/2023/oct/13/announcing-dsf-working-groups/). + +During the sprint, Jacob also submitted a [pull request](https://github.com/django/deps/pull/81) to update the Django Enhancement Process (DEP) process docs. + +Jacob talking to attendees about the new DSF Working Groups initiative +![](djangocon-us-2023-recap-images/jacob.jpg) + +It's great that the creators and early architects of Django continue to be engaged with and accessible to the community. Check out this DjangoCon 2008 [Schema Evolution Panel](https://fosstodon.org/@simon@simonwillison.net/111310910516740202) that Django Co-Creator Simon Willison recently unearthed featuring himself, Andrew Godwin, and Russell Keith-Magee. :) + +[**back to top**](#table-of-contents) + +### Parts and Labor, The Parlour, and Back to the Hotel + +That night, I walked with a group of fellow conference-goers to [Parts and Labor](https://partsnlabor.com/) for light food and drinks. + +Parts and Labor margarita +![](djangocon-us-2023-recap-images/parts-and-labor-margarita.jpg) + +Afterward, I had a scoop of chocolate ice cream from [The Parlour](https://theparlour.co/) ([organizer recommended](https://2023.djangocon.us/venue/#places)). + +The Parlour +![](djangocon-us-2023-recap-images/the-parlour.jpg) + +Parlour flavors +![](djangocon-us-2023-recap-images/the-parlour-flavors.jpg) + +Back at the hotel, a late night chat... great crew :) (© 2023 Paolo Melchiorre CC BY-SA 4.0) +![](djangocon-us-2023-recap-images/hotel-table.jpg) + +Incidentally, on the first sprint day, Paolo, along with Will Vincent, presented μDjango, a single file Django micro project. Read about its inception on [Paolo's blog](https://www.paulox.net/2023/10/26/udjango_micro_django/#history). + +[**back to top**](#table-of-contents) + +## Tuesday + +### Hallway track + +Ken Whitesell at the registration desk +![](djangocon-us-2023-recap-images/hallway.jpg) + +[**back to top**](#table-of-contents) + +#### Django Social T-Shirt + +On Monday, I was fortunate to come into the possession of one of Foxley Talent's Django Social T-shirts. :) + +!["Couldn’t resist wearing this super cute Django Social shirt from Jon and company. I’ve been to a Django Social in Durham now. Hoping to make it to one in the U.K. eventually!"](djangocon-us-2023-recap-images/couldn't-resist.png) + +Me wearing my Django Social T-shirt with Django Social Organizer and Foxley Talent Principal Jon Gould +![](djangocon-us-2023-recap-images/me-and-jon.jpg) + +[**back to top**](#table-of-contents) + +#### Coherence Demo + +Two members of our party at Parts and Labor had founded a startup called [Coherence](https://www.withcoherence.com/). + +On Tuesday, I stopped by their sponsor table for a demo. + +Coherence demo +![](djangocon-us-2023-recap-images/coherence-demo.jpg) + +Coherence is an alternative to traditional PaaS built on top of AWS and GCP that provides: +* Full-stack previews +* Build pipelines +* Static and production environments +* Cloud IDEs +* Hosted web-based SSH tools for secure & audited access to REPL or databases in each environment +* Polished UI for admin and deployments +* Infrastructure-as-code + +Check out the [docs](https://docs.withcoherence.com/)! + +Coherence brand +![](djangocon-us-2023-recap-images/coherence-table.jpg) + +[**back to top**](#table-of-contents) + + + +### Navigating Django's Future: Djangonaut Space + +It was at [DjangoCon US 2018](https://2018.djangocon.us/) that I personally first recall a growing sense of discontent being publicly expressed, for example in this talk that year by former Django Fellow Carlton Gibson, [Your Framework Needs You](https://youtu.be/1BFjg9XtptM?si=oUQr3y2monEzCoud). + +I wrote about it in this [DjangoCon US 2019 recap blog post](https://github.com/KatherineMichel/portfolio/blob/master/conference-blog-posts/recap-of-djangocon-us-2019.md#your-web-framework-needs-you). + +"Carlton acknowleged that the (Django) community is more diverse than ever, but the core contributors have continued to be white guys, many of whom have been associated with Django for a very long time and are no longer even contributing. The talk was a call to action to community members to contribute to the Django core code. In short, there is not a quick fix, but change is a priority." + +In the words of Carlton Gibson, "How do we get non-white blokes?" + +After DjangoCon US 2018, [DEP 10](https://github.com/django/deps/blob/main/final/0010-new-governance.rst) dissolving Django Core and creating a new model of governance was accepted. This DEP was in part intended to fix some of the problems discussed by Carlton in his talk. James Bennett, the author of the DEP, explained the changes in his blog post [Core no more](https://www.b-list.org/weblog/2018/nov/20/core/). Django project was not attracting enough new contributors to replace the ones becoming inactive and there was a lack of diversity among those new contributors. + +During the [DjangoCon US 2022 State of Django Panel](https://youtu.be/IumYtz0G5v0?si=J6G24BdVXIf-94ZS), this gap was still strongly felt. This was a topic that had come up many times before, but nothing had been done. Django Fellow Mariusz Felisiak said, "My hot take is that we need a mentorship program... for new Django Core Developers." + +Dawn Wages, PSF Chair, and Rachell Calhoun, Django Girls Trustee, knew this was a powerful idea and went to work. + +Also inspired by the DjangoCon US 2022 State of Django Panel, [DEP 12](https://github.com/django/deps/blob/main/final/0012-steering-council.rst) was an effort to encourage diversification of the Django Steering Committee, the governing body that determines the technical direction of Django, but this effort has fallen short in the most recent election. + +In their talk [Navigating Django's Future: Djangonaut Space](https://2023.djangocon.us/talks/navigating-djangos-future-djangonaut-space/), Dawn Wages, PSF Chair, and Rachell Calhoun, Django Girls Trustee, told how Djangonaut Space, an inclusive mentorship program for new Django Core contributors, was kickstarted. + +Dawn and Rachell killing it on stage and keeping it real :) +![](djangocon-us-2023-recap-images/dawn-and-rachell.jpg) + +Dawn and Rachell talked about their non-traditional paths to becoming Django developers and the huge impact Django Girls has had on their lives. Many Django careers have been started through [Django Girls](https://djangogirls.org/en/). + +Being connected with a Python user group got Dawn moving from analyst to developer. [DjangoCon US 2016](https://2016.djangocon.us/) in Philadelphia started her relationship with Django and that's why she is here. She fell in love with Django. Her story is also "not all highlights" and she would like to talk with you more about that. + +Through Rachell's involvement with Django Girls Seoul, she was pushed to become a leader of the organization. This connected her with the wider community and eventually DjangoCons. She was encouraged to submit a talk proposal and gave her first talk at DjangoCon US. Rachell never would have imagined that she could give a successful conference talk. + +This was a common a theme that came up throughout the conference that works: invite underrepresented people in, empower them, and encourage them to do things they might not think they are capable of doing. This helps them break their own boundaries. + +Rachell said, "Historically-excluded groups of people are just that. Excluded. And they often don't feel comfortable stepping up or making that first connection. If there's a mentorship program (you need) somebody to be like, 'hey why don't you try this?' or 'hey, you would be great at this!' and just bring them along and include them." + +She went on to say, "These policies and initiatives that focus on inclusivity, connection, sponsorship, and accountability are not just points to get. These initiatives... are really important in sustaining community, but also including people that might not have been included before and opening doors. They work, and I'm here and Dawn's here. A lot of people are here and becoming leaders in the community because of these kind of initiatives." + +The magic of Django Girls... Dawn and Rachell are alumnae +![](djangocon-us-2023-recap-images/celebration.jpg) + +The Djangonaut Space Organizers were able to take lessons from other mentorship programs that already exist, such as Google Summer of Code, Kubernetes, Underdog Devs, Django Girls, and Outreachy, and apply them to this new problem. + +The first flight was a "roaring success." It lasted 3 months. + +They found an active approach to inclusion to be more effective than a passive one. People will be more likely to participate if you reach out to them directly. + +They focused on high-touch, quality communication, and retention. They supported people with kindness and worked around their lives. + +Dawn and Rachell clarified that Djangonaut Space is not just for underrepresented people, but the goal is to make everyone comfortable. That inclusivity will benefit the entire group. + +They gave examples of accountability, connection, sponsorship, and inclusivity at work in the program: +* Acountability- regular catch ups and sharing +* Connection- although Django community doesn't "trade on celebrity" it was welcoming and empowering for participants to engage with people who have done "big things" +* Sponsorship- celebrate wins, give a talk, encourage someone to give a talk, make connections, share links and resources, "like" Djangonaut social media posts +* Inclusivity- creating representation in a safe space + +Stats +![](djangocon-us-2023-recap-images/djangonaut-space-stats.png) + +After the program: +* 80% feel more comfortable contributing to Django +* 80% feel more comfortable participating the Django community + +What does it take to be a Djangonaut? You don't have to be part of Djangonaut Space. You are doing it now: write, code, raise your hand, give feedback, comment on threads, organize events, speak at events, attend events + +Dawn and Rachel gave a call to action to contribute to Djangonaut Space: +* Be a participant +* Give a talk to future Djangonauts +* Connect your organization as a partner +* Initiate a collaborative session + +Djangonaut Space is now [accepting applications](https://www.djangoproject.com/weblog/2023/oct/19/djangonaut-space-now-accepting-applications/) for an eight week session in early 2024! The deadline is November 15. + +Spread the word :) + +[**back to top**](#table-of-contents) + +### Don't Buy the "AI" Hype + +While [DjangoCon US 2022 Chair Logan Kilpatrick](https://2022.djangocon.us/news/introducing-conference-chair-logan/), first DevRel hire at OpenAI, is busy getting OpenAI's first developer conference [OpenAI DevDay](https://openai.com/blog/announcing-openai-devday) off the ground, Tim Allen, gave an impassioned talk [Don't Buy the "AI" Hype](https://2023.djangocon.us/talks/dont-buy-the-ai-hype/) the he had put together at the last minute to fill an open slot. + +Tim has been writing code since 1980. Over the years, he has seen a lot of tech trends and hype, and has been involved in some of it. He has never seen anything like what he calls the "AI" hype cycle. According to Tim, it's next level. At the risk of sounding "like an old man yelling at kids to get off my lawn," he wants to provide a warning. + +Tim on stage +![](djangocon-us-2023-recap-images/tims-talk.jpg) + +Tim cited a KPMG report that says that 93% of senior business leaders believe that generative AI will provide value for their businesses. He does not dispute that. + +He compared the Gartner Hype Cycle for Emerging Trends 2023 with generative AI at the peak that he calls "Mount Hype" with the Dunning-Kruger effect curve. He believes the similarity is not a coincidence. + +Tim gave an entertaining rundown of technology trends over the past 25 years. They were all useful tools in the technology toolbox, but did not live up to the hype. According to Tim, the media builds the technology up to "Mount Hype" for clickbait, then tears it apart in its descent. By blinding the world with hype and fear, it's impossible to find the true utility of these new technologies and use them to improve the human condition. + +Tim told the story of the startup he built as a web portal for Second Life virtual world. Hyped to the max, Second life was the media's darling, then became its whipping boy. + +He says among generative AI companies, it's now an arms race, and the race to the bottom "is dangerous." He puts "AI" in quotation marks, because he says it's not AI, it's machine learning models, a subset of AI. "It's not artificial and it's not intelligent." It's dangerous to give these attributes to machine learning models. By saying that models "hallucinate" (a.k.a. make things up) we are removing the responsibility of the programmer and model trainer to be ethical. + +With these falsehoods becoming part of the permanent record, we risk the line of collective truth becoming so blurred, it's invisible. + +He believes that a large portion of our population have been left behind by the education system and are easily misled. He fears that we are unprepared for the effect of generative AI on future elections. + +He doesn't have an easy answer, but says that as technologists we must be responsible stewards and do better. + +"We've got to stop falling for it." + +[**back to top**](#table-of-contents) + +### An Approach to Lightweight Tenancy Management Using Django Rest Framework + +Having implemented multi-tenancy myself, I thought Eliana's talk [An Approach to Lightweight Tenancy Management Using Django Rest Framework](https://2023.djangocon.us/talks/an-approach-to-lightweight-tenancy-management-using-django-rest-framework/) would be an interesting one to attend, and it was. + +In a single-tenancy architecture, each tenant has its own application instance and its own database, physically isolated. + +In a multi-tenancy architecture, all tenants share the same database and application instance, but each tenant is isolated from the rest, and you have to implement the isolation. A user can belong to multiple tenants, but can only access resources from the tenants to which they belong. + +"Multitenancy is a software architecture where a single software instance can serve multiple, distinct user groups."- [Red Hat's definition](https://www.redhat.com/en/topics/cloud-computing/what-is-multitenancy#:~:text=Multitenancy%20is%20a%20software%20architecture,an%20example%20of%20multitenant%20architecture.) + +According to Eliana, multi-tenancy is more common when a company uses your product and will have its own users, not when you market directly to the end user. + +She referred to Slack as a possible example of multi-tenancy architecture: each workspace is a tenant, isolated from each other, and users can access multiple workspaces, but can only access workspaces to which they belong, and information does not cross from one workspace to another. + +Eliana showed an example app that was an abstraction of the requirements from a number of different multi-tenant websites that she and her colleagues had implemented. + +Example +* The tenants are represented as companies +* The resources are represented as company reports +* The user can access many companies (an example user is a fractional account who does accounting for multiple companies) + +Key points +* Effectively nest API routes so resources fall under the specific tenant +* Consistently restrict access to resources +* Centralize checks in a single place to avoid code duplication + +They used [drf-nested-routers](https://github.com/alanjds/drf-nested-routers) package to nest resources under a specific tenant. + +URL example: `tenant/` + +In order for this to work, a few lines of code need to be added to urls.py. + + + +If there is a `company_id` 23 associated with a report with `id` 1 and a `company_id` 5 associated with a report with `id` 2: + +A `GET` request to `companies/23/reports/1` will return a 200 HTTP status +A `GET` request to `companies/5/reports/1` will return a 404 HTTP status + +She then explained how they write a custom viewset and overrided the `initial()` method to implement tenancy check functionality to restrict user access to resources. + +First they check that the user is logged in and get the company primary key from the URL. If either is missing an exception is raised. They then get the user from the request. Instead of looking up the company using the primary key, they look for it within the user's set of companies. The company needs to exist and be among the user's set of companies in order for it to be returned. + +Eliana and her colleagues would occasionally forget to filter by company which would result in accidentally leaking information from other tenants. As a bonus, she demonstrated how they created a custom model manager to avoid this. + +They would override the `filter()` method and check if `company_id` or `company` is in the `kwargs`. If not, the `MissingCompanyException` is raised. If either exists, company is filtered like intended with the `kwarg`. + + + +[**back to top**](#table-of-contents) + +### Speaker and Organizer Dinner + +After the conference activities and group photo, I attended the complimentary speaker and organizer dinner at [The Pit](https://www.thepit-durham.com/). The food was really good! + +The Pit dining room +![](djangocon-us-2023-recap-images/the-pit-dining-room.jpg) + +Another delicious southern-style meal! +![](djangocon-us-2023-recap-images/the-pit-meal.jpg) + +A wonderful conference partner [Discover Durham](https://www.discoverdurham.com/) generously provided city guides for swag bags and gift boxes by [City Box Durham](https://cityboxdurham.com/) for organizers and speakers. + +City Box Durham gift boxes +![](djangocon-us-2023-recap-images/discover-durham-box-2.jpg) + +[**back to top**](#table-of-contents) + +## Wednesday + +### Testing Modern Web Apps Like a Champion + +My friend Andrew "Pandy" Knight delivered the Wednesday morning keynote [Testing Modern Web Apps Like a Champion](https://2023.djangocon.us/talks/keynote-testing-modern-web-apps-like-a-champion/). + +Andy is a local and learned development through Django. At DjangoCon US 2019, he gave a [Selenium tutorial](https://2019.djangocon.us/tutorials/hands-on-web-ui-testing/). It was special for him to be back four years later giving a keynote about testing. + +Andy introduced us to Suki, his French bulldog. He created [Bulldoggy Reminders app](https://github.com/AutomationPanda/bulldoggy-reminders-app) to help him take care of his dog. + +Users can log in. On the left side are the reminders lists they have created. On the right side are the items in a list. Users can dynamically add items to lists, rename lists, and delete lists. When an item is completed they can strike through it by clicking on it. + +The app was made with FastAPI, HTMX, and stores data in TinyDB. + +Bulldoggy app architecture +![](djangocon-us-2023-recap-images/andy-bulldoggy-app-architecture.png) + +Andy singing the praises of HTMX +!["Another high level endorsement of HTMX: “HTMX is a great way to democratize front-end development.” Andrew Knight"](djangocon-us-2023-recap-images/another-high-level.png) + +Testing is an art and a science, Andy said. Development and testing are two sides of the same coin. + +This talk was a bookend for a keynote Andy did at PyTexas that focused on the full-stack Python development of Bulldoggy Reminders app. + +In this talk, Andy would be talking about how to test the app. + +"Testing is hard." + +Testing Challenges +![](djangocon-us-2023-recap-images/andy-testing-challenges.png) + +Historically, testing strategy has been built around the Test Pyramid that has probably been around longer than Andy has been in a professional environment. :) + +According to the strategy, we want a lot of unit tests. They are white box, next to the code, low level, very fast, touching the Python methods. Moving up the pyramid, if we have UI, we want to test the widget library as components. Moving up the pyramid, we reach API testing. We make a request, get a response, verify a `200` code. They take a bit longer to run and there could be network issues, but they are ok. We reach UI tests. We want to do as few of them as possible. They are the most complex, longest, slowest, most brittle, most prone to flakiness, the riskiest. + +Test Pyramid Scheme +![](djangocon-us-2023-recap-images/andy-test-pyramid-scheme.png) + +"We have developed an entire testing strategy with this pyramid around presumptions that certain types of tests are good and bad. And I'm here to tell you today that's bull crap. Every type of test adds value in unique, special ways. To try to label some as good and bad is not healthy for us as we approach the quality of our applications. I could argue that UI tests are the valuable ones because they are the ones that are testing your application as a user would." + +Modern testing goals- let's break away from the pyramid and its preconceived notions +![](djangocon-us-2023-recap-images/andy-modern-testing-goals.png) + +While testing can be challenging, our approach to testing doesn't need to be. + +Writing good tests: follow the Arrange-Act-Assert method: +* *Arrange* things in the system +* *Act* on the target behavior +* *Assert* expected outcomes + +Arrange-Act-Assert works for all types of functional tests, whether they are unit, component, API, or UI. This pattern came up over and over again in the talk. + +Can't we just use pytest or unittest? Andy loves pytest. He is a pytest stan and thinks it is the best testing framework in any language, but... + +pytest and unnitest cannot test web apps or frameworks. They provide the structure for writing test cases. You need to add the "magic sauce" inside the test cases. pytest alone is not the answer. + +What about Django's testing support? Django has an awesome test client. Django testing support is probably some of the best Andy has seen in a Python web framework, but... + +You are going to be limited to "white box" testing of calling methods and functions directly from the code. You're not going to be able to test the app like a user by opening up a browser and clicking around or calling the API with a REST client. + +Andy pointed out the "white box" unit testing at the bottom of the pyramid and "black box" testing of the components above. + +Tools for black box testing... Cypress and Playwright can do all of these things +![](djangocon-us-2023-recap-images/andy-tools-for-black-box-testing.png) + +Focusing on open source tools, Andy went over how to do component, API, and UI testing, with examples and pitfalls from his own personal experience. + +Web Test Automation Tool Comparison +![](djangocon-us-2023-recap-images/andy-web-test-automation-tool-comparison.png) + +Tips for testing modern web apps like a champion +![](djangocon-us-2023-recap-images/andy-test-modern-web-apps.png) + +Afterw the talk, I had the chance to catch up with Andy. His talk has rekindled my desire to get better at testing and reminded me of what a great resource [Test Automation University](https://testautomationu.applitools.com/) is. He gave me a card resource too! + +A gift from my friend Andy +![](djangocon-us-2023-recap-images/test-card-from-andy.jpg) + +[**back to top**](#table-of-contents) + +### Inside Out: My Journey of Understanding Inclusion + +This year, along the lines of my fellow DEFNA board member Jeff Triplett's annual [DjangoCon US Talks I'd Like to See](https://jefftriplett.com/2023/djangocon-us-talks-i-d-like-to-see-2023-edition/) list, I created my own [Talk Topic Ideas List](https://github.com/KatherineMichel/portfolio/blob/master/conference-blog-posts/topic-ideas-djangocon-us-2023.md) and posted it on social media. + +!["The @djangocon US CfP closes May 15th. We'd LOVE to receive your talk proposal! If you need some inspiration, I've written up a list of possible topics. What topics would you like to learn more about? ❤️🐍"](djangocon-us-2023-recap-images/the-djangocon-us-cfp.png) + +Tim Schilling, who has done an incredible job of taking over my former role of DEFNA Corporate Secretary and driving a lot of improvement across DEFNA and DjangoCon US, tooted to me and Natalia in response. + +!["@kati @djangocon Oh, I really like this one on your list: > Learning more about our new fellow :) @nessita are you submitting a talk?!"](djangocon-us-2023-recap-images/oh-i-really-like-this.png) + +It kicked off a conversation that led to her giving the talk [Inside Out: My Journey of Understanding Inclusion](https://2023.djangocon.us/talks/inside-out-my-journey-of-understanding-inclusion) on Wednesday. + +!["@CodenameTim @kati @djangocon I've been thinking about this a lot, and I would be most thrilled to prepare a talk. Currently, one of the topics I'm feeling most passionate about is Diversity And Inclusion, so I'd be excited to share my view, thoughts and my experience on the matter. Would that be a talk you'd like to see/attend?"](djangocon-us-2023-recap-images/i've-been-thinking-about-this-a-lot.png) + +In her talk, Natalia gave some examples of prejudice that she has faced as a woman. Thank you Natalia for putting into words the type of that experiences I've also had, but have questioned. + +She explained what unconscious bias is and that we are unaware of it. Her hope is that we will reflect on our unconscious biases to improve the Django community as a whole. + +She then talked about the conflicting standards women are expected to meet. I personally found this to be a very powerful part of her talk. + +Double Bind +![](djangocon-us-2023-recap-images/double-bind.png) + +Double Bind Paradoxes +![](djangocon-us-2023-recap-images/double-bind-paradoxes.png) + +Double Bind from Barbie movie +![](djangocon-us-2023-recap-images/double-bind-barbie.png) + +Natalia went on to talk about cultural aspects too and recommended Ned Batchelder's PyCon US 2023 keynote [People: the API User's Guide](https://nedbatchelder.com/blog/202305/pycon_2023_keynote.html) and the book [The Culture Map](https://www.amazon.com/Culture-Map-Breaking-Invisible-Boundaries-ebook/dp/B00IHGVQ9I/ref=tmm_kin_swatch_0?_encoding=UTF8&qid=1698883387&sr=8-1) by Erin Meyer. + + + +Thank you to Natalia for embracing our community and generously asking for reflection about an important subject. I hope she found our conference to be very welcoming in return. + +![“I had to stand in line at the women's bathroom. I’ve never had to do that before at a conference.” Natalia Bidart at #DjangoConUS](djangocon-us-2023-recap-images/i-had-to-stand-in-line.png) + + + +I've chatted with women recently about the additional overhead women and other underrepresented people often have from doing extra work to change the system. It can be exhausting. I am looking forward to getting to know Natalia's development work. + +[**back to top**](#table-of-contents) + +### DjangoCon Africa + +Daniele Procida has been involved in organizing and attending African PyCons for nearly a decade now. He spoke of the special challenges, including questions of safety. + +Daniele said we should not just be asking these questions about African events. We should be asking them about events in all countries, including our own. Other countries need to come with safety warnings as well. + +African PyCons are creating safe spaces through codes of conduct. It's an investment in courage. "This is what we do and this is how we are." + +He also pointed out that African PyCons and DjangoCon operate on a shoestring budget. For example, PyCon Namibia's total conference budget was less than $7,000 USD. The conference finished with a balance of just over $100 USD. + +Daniele asked DjangoCon Africa Keynoter and Organizers to come up to the stage. + +Wonderful people I am proud to call friends: Daniele Procida, Kojo Idressa, Sheena O'Connell, Abigail Mesrenyame Dogbe, Dawn Wages, Noah Alorwu +![](djangocon-us-2023-recap-images/djangocon-africa.jpg) + +Daniele praised DjangoCon US for doing exactly the same work from another part of the world. "I haven't seen so many African and Black faces, non-white faces, as a proportion at an event outside Africa." + +[DjangoCon Africa 2023](https://2023.djangocon.africa/) will take place in Tanzania, Africa in November and [DjangoCon Europe 2024](https://www.djangoproject.com/weblog/2023/oct/14/djangocon-europe-2024/) will take place in Vigo, Spain in June 2024. + +I hope to go to both someday. + +One day at lunch, I had the pleasure of eating with a table of Africans: Richard Ackon, Abigail "Afi" Gbadago, Noah Alorwu, Ntale Geofrey, and Benedict Kofi Amofah. I learned that Ghanians are laid back and Ugandians are tribal. We had the chance to speak at length about our cultures. It was a really fun conversation! + +New friends... beautiful on the inside and out! (photo courtesy of Abigail Mesrenyame Dogbe) +![](djangocon-us-2023-recap-images/new-friends.jpg) + +Later in the week, a Black attendee told me that when he attends a conference in the U.S. or Europe, he is sometimes the only Black person in attendance. DjangoCon US was a very different and wonderful experience. + +By one organizer's count, we had around 10 Black speakers. + +Check out the Black Python Devs write-up about their [DjangoCon US experience](https://blackpythondevs.github.io/2023-10-20-djangoconus/). + +!["This makes me smile. ❤️ We are nowhere near where we want to be on diversity, but making big strides. I think this was the most fun DjangoCon US I've been to so far, and the growing diversity played a big part in that."](djangocon-us-2023-recap-images/this-makes-me-smile.png) + +[**back to top**](#table-of-contents) + +### Another Great Adventure + +After conference activities, as usual, hanging around in the lobby led to a great adventure. Hanging around in a lobby once led to me sitting next to Python creator and BDFL Guido van Rossum at an impromptu group dinner and chatting with him about the early days of Python. + +On this night, I ended up having dinner with Jacob Kaplan-Moss, Andrew Godwin (Django Core Dev, Django Async Architect, South creator, and the only person who has attended every DjangoCon US), Frank Wiles (Revsys Founder and Partner, and former DSF President), and Tim and and Charles of the Wharton School, my past client. + +We ate at a restaurant called [It's a Southern Thing](https://getsouthernfood.com/). The food was high quality and the service was great. I had the Crispy Catfish. + +Crispy Catfish ("Crispy cornmeal fried catfish served over a bed of red beans & rice; made with beef sausage, holy trinity, creole spices, finished with a creole mustard aioli") +![](djangocon-us-2023-recap-images/its-a-southern-thing-catfish.jpg) + +Our table after an incredible meal! +![](djangocon-us-2023-recap-images/its-a-southern-thing-table.jpg) + +Afterward, led by Tim, we had ice cream at a novel ice cream shop called [Simon Says Dip This](https://www.simonssaysdipthis.com/). Tim said he's never seen an ice cream shop like this anywhere else. Vanilla soft serve has a core, dip, and topping of your choice. + +Simon Says Dip This Counter +![](djangocon-us-2023-recap-images/simon-says-counter.jpg) + +Final product... wow! (chocolate core, bourbon dip, and strawberry topping) +![](djangocon-us-2023-recap-images/simon-says-ice-cream.jpg) + +[**back to top**](#table-of-contents) + +### Conference Conclusion + +I came away from Durham with many new friends, renewed optimism, and some amazing swag. + + + +Conference badge +![](djangocon-us-2023-recap-images/badge.jpg) + +Prized possessions +![](djangocon-us-2023-recap-images/trilogy.jpg) + +Proud to be a DEFNA Board Member and DjangoCon US Organizer +![](djangocon-us-2023-recap-images/organizers-slide.jpg) + +Standing ovation for organizers +![](djangocon-us-2023-recap-images/standing-ovation.jpg) + +DjangoCon US Organizers (photo credit: Bartek Pawlik (https://bartpawlik.format.com/)) +![](djangocon-us-2023-recap-images/djangocon-us-organizers.jpg) + +[**back to top**](#table-of-contents) + +## Sight Seeing and More Food! + +I consider getting to know the host city to be an important part of the conference experience. + +[**back to top**](#table-of-contents) + +### Sarah P. Duke Gardens + +After doing a bit of research, I chose the [Sarah P. Duke Gardens](https://gardens.duke.edu/) as my top priority for sight seeing. After spending time there, I can personally report that if you are in Durham, it is an absolute must see. Some of the scenes there were simply stunning! A local pointed out to me that it's a different garden every month depending on which plants are in bloom. + +Pink flowers +![](djangocon-us-2023-recap-images/duke-gardens-pink-flowers.jpg) + +Glorious nature +![](djangocon-us-2023-recap-images/duke-gardens-glorious-nature.jpg) + +H.L. Blomquist Garden of Native Plants Pavilion +![](djangocon-us-2023-recap-images/duke-gardens-blomquist-pavilion.jpg) + +Fish pool, historic terraces, and Cindy Brodhead Pergola +![](djangocon-us-2023-recap-images/duke-gardens-historic-terraces-fish-pool-and-cindy-brodhead-pergola.jpg) + +South Lawn +![](djangocon-us-2023-recap-images/duke-gardens-south-lawn.jpg) + +Red Bridge +![](djangocon-us-2023-recap-images/duke-gardens-red-bridge.jpg) + +Wooden Bridge +![](djangocon-us-2023-recap-images/duke-gardens-wooden-bridge.jpg) + +[**back to top**](#table-of-contents) + +### Duke Chapel + +After visiting the gardens, I made the quick walk over to the [Duke Chapel](https://chapel.duke.edu/). Not only was the chapel gorgeous, but the [Conference for North Carolina Chapter of the American Choral Directors Association](https://chapel.duke.edu/events/conference-north-carolina-chapter-american-choral-directors-association-1697169600) was taking place. A choir that must have been made up of elite children singers happened to be practicing. I've stumbled into some jaw-dropping experiences while traveling. This was another one. Together, the music and surroundings were magical. + +![](djangocon-us-2023-recap-images/duke-chapel-front.jpg) +![](djangocon-us-2023-recap-images/duke-chapel-altar.jpg) +![](djangocon-us-2023-recap-images/duke-chapel-side.jpg) +![](djangocon-us-2023-recap-images/duke-chapel-back.jpg) + +[**back to top**](#table-of-contents) + +### Museum of Life and Science + +I also visited the [Museum of Life and Science](https://www.lifeandscience.org/). The [Butterfly House](https://www.lifeandscience.org/explore/butterfly-house/) in particular was a really special experience. I was also happy to have a second change to see lemurs. Duke University has the largest population of lemurs in the world outside of Madagascar, but unfortunately, its tours were booked through the rest of the year. The Museum of Life and Science has a [Lemur Exhibit](https://www.lifeandscience.org/explore/lemurs-and-tortoises/). I enjoyed observing these beautiful animals. [The Farmyard](https://www.lifeandscience.org/explore/the-farmyard/), [Insectarium](https://www.lifeandscience.org/explore/insectarium/), and [Aerospace](https://www.lifeandscience.org/explore/aerospace/) exhibits were also really fun and interesting. + +Unfortunately, the [train](https://www.lifeandscience.org/explore/train/) that takes passengers around the museum's 84 acres was not in operation at the time of my visit. I know I would have really enjoyed it. + +Lemurs +![](djangocon-us-2023-recap-images/museum-of-life-and-science-lemurs.jpg) + +Lemur Exhibit +![](djangocon-us-2023-recap-images/museum-of-life-and-science-exhibit.jpg) + +Lemur +![](djangocon-us-2023-recap-images/museum-of-life-and-science-lemur.jpg) + +Butterfly House path +![](djangocon-us-2023-recap-images/museum-of-life-and-science-path.jpg) + +Butterfly House path +![](djangocon-us-2023-recap-images/museum-of-life-and-science-path-2.jpg) + +Butterfly House butterfly +![](djangocon-us-2023-recap-images/museum-of-life-and-science-butterfly-house-butterfly.jpg) + +Butterflies with "eyes" eating fruit +![](djangocon-us-2023-recap-images/museum-of-life-and-science-eye-butterflies.jpg) + +Insectarium- cockroaches +![](djangocon-us-2023-recap-images/museum-of-life-and-science-cockroaches.jpg) + +Insectarium- tarantula +![](djangocon-us-2023-recap-images/museum-of-life-and-science-tarantula.jpg) + +[**back to top**](#table-of-contents) + +### Parizade + +More pics from the incredible Parizade! + +Amazing ambiance +![](djangocon-us-2023-recap-images/parizade-walking-to-table.jpg) + +Cookie and ice cream desert +![](djangocon-us-2023-recap-images/parizade-cookie-and-ice-cream-dessert.jpg) + +[**back to top**](#table-of-contents) + +### Loaf + +After having read rave reviews about [Loaf](https://www.loafdurham.com/) bakery, I had to pay a visit. It did not disappoint. I ordered a ham and gruyere croissant, a walnut sea salt brownie, a pain au chocolat, and 5 pumpkin chocolate chip cookies. + +![](djangocon-us-2023-recap-images/loaf.jpg) + +![](djangocon-us-2023-recap-images/loaf-display-case.jpg) + +Ham and gruyere croissant +![](djangocon-us-2023-recap-images/loaf-ham-and-gruyere-croissant.jpg) + +Walnut sea salt brownie +![](djangocon-us-2023-recap-images/the-loaf-brownie.jpg) + +[**back to top**](#table-of-contents) + +### Pizzeria Toro + +For dinner one night, I ordered takeaway from [Pizzeria Toro](https://www.pizzeriatoro.com/), right around the corner from the Marriott. I had a mouthwatering red-sauce pizza with shredded mozzarella, black olives, mixed mushrooms, and fennel sausage. + +Cool atmosphere! +![](djangocon-us-2023-recap-images/pizzeria-toro.jpg) + +Yum! +![](djangocon-us-2023-recap-images/pizzeria-toro-pizza.jpg) + +[**back to top**](#table-of-contents) + +### Simon Says Dip This + +More pics from the amazing Simon Says Dip This! + +Dip being poured on +![](djangocon-us-2023-recap-images/simon-says-sauce.jpg) + +Toppings to choose from +![](djangocon-us-2023-recap-images/simon-says-toppings.jpg) + +[**back to top**](#table-of-contents) + +### Press Coffee, Crepes,and Cocktails + +After having read rave reviews about [Press Coffee, Crepes, and Cocktails](https://pressccc.com/locations/durham/) at the [American Tobacco Campus](https://americantobacco.co/), I simply had to visit. I was keen to have a seasonal Black Forest Latte. I finally had the opportunity on the first day of sprints. The atmosphere was bright and cute. The food was excellent. I think this was the first time that I've ever had a savory crepe. + +Coffee Bar +![](djangocon-us-2023-recap-images/press-crepes-coffee.jpg) + +Bar bar +![](djangocon-us-2023-recap-images/press-crepes-bar.jpg) + +Black Forest Latte... the foam was silky smooth. Delicious! ("a combination of our house-made chocolate-sauce and cherry syrup") +![](djangocon-us-2023-recap-images/press-crepes-silky-black-forest-latte.jpg) + +The Down Home breakfast crepe ("bacon with scrambled eggs and hoop cheese") +![](djangocon-us-2023-recap-images/press-crepes-crepe.jpg) + +The inside +![](djangocon-us-2023-recap-images/press-crepes-crepe-inside.jpg) + +[**back to top**](#table-of-contents) + +## In Closing + +The talk replays will be available on the [DjangoCon US YouTube channel](https://www.youtube.com/c/DjangoConUS) in a few weeks. + +Can't wait for next year! :) + +!["As usual, I've tried to squeeze every last bit of experience out of DjangoCon US and have done about as much as I humanly can. 🤣 Today is a day for relaxed sprinting, catching up with a few more people, and flying back to Plano. I'll write up a proper blog post soon with thoughts about talks, the people I met, sightseeing, and food. For the moment, suffice it to say, this conference just gets better every year and that is because of the people. Everyone is welcome and everyone makes it a better place. This community is changing the world for the better through shared humanity and technology. And, it's not a coincidence that it started in wonderful Lawrence, Kansas."](djangocon-us-2023-recap-images/as-usual.png) + +djurham +![](djangocon-us-2023-recap-images/djurham.jpg) + +[**back to top**](#table-of-contents) diff --git a/_sources/djangocon-us-2023-topics-inspiration-list.md.txt b/_sources/djangocon-us-2023-topics-inspiration-list.md.txt new file mode 100644 index 00000000..c1e6cd02 --- /dev/null +++ b/_sources/djangocon-us-2023-topics-inspiration-list.md.txt @@ -0,0 +1,68 @@ +# DjangoCon US 2023 Topics Inspiration List + +Published May 6, 2023 + +New Features and Future Outlook +* New Django features +* New Python features of interest to Django devs +* Django retrospective (where it has been, where it is now, is it in a good place relative to itself and other web dev frameworks?) +* What's on the horizon or could/should be on the roadmap + +Opinionated Django +* Django deployment options and tradeoffs in 2023 +* Different ways of doing things in Django and when to use which option +* The best tools/packages to have in your Django toolbox in 2023 +* Favorite workflows, Git, CI/CD, GitHub Actions, local/prod, developer experience tools, etc.  + +How to Raise Your Game +* Practical async (going beyond the docs and a few tutorials to using day to day) +* Security (OWASP 10 and Django) +* Testing (pytest, Playwright, Selenium, etc).  +* Type hinting +* Lesser known, but highly useful Django features +* Database optimization +* Website optimization + +Python Packaging and Open Source +* New developments in Python/Django packaging +* Adventures in open source Django development +* How to get started with open source, Django open source, packaging + +Novel uses for Django +* Experimental apps +* Historically relevant apps +* Your interesting Django story/adventure +* Lessons from managing/scaling Django in a unique or difficult way in your company +* Prototyping with Django for fun and profit + +New-ish or Experimental Technologies +* Co-Pilot, ChatGPT, etc. for Django devs  +* PyScript +* WASM +* React/HTMX debate +* Using JavaScript and Django together: Alpine, Svelte, etc.  +* Tailwind +* Datasette +* What tools I haven't heard about, but would want to know about + +How to Use/Better Use Popular Add On Tools (Admin, API, etc.) +* Wagtail +* Butter CMS +* Django Rest Framework +* Fast API + +Team, Leadership, Building, Learning +* Product management (features, prioritization, OKRs, teamwork, etc.) +* Lessons from software engineering management +* Interesting mental models, productivity methods, learning approaches, the counter-intuitive +* Educators/authors in our community (their experiences and thoughts about how to learn effectively) + +Django Fellows +* Getting to know what they do, how core works +* Contributing to Django +* Learning more about our new fellow :) + +Addressing Hard Topics/Making New Progress +* How to bring more diversity to: our steering council, core dev, contributor base, community + +For even more ideas, see my fellow DEFNA Board Member Jeff Triplett's [list](https://jefftriplett.com/2023/djangocon-us-talks-i-d-like-to-see-2023-edition/). diff --git a/_sources/djangocon-us-2024-recap.md.txt b/_sources/djangocon-us-2024-recap.md.txt new file mode 100644 index 00000000..caf10b52 --- /dev/null +++ b/_sources/djangocon-us-2024-recap.md.txt @@ -0,0 +1,924 @@ +# DjangoCon US 2024 Recap + +Table of Contents +----------------- + +- [Intro](#intro) + - [Venue Selection](#venue-selection) + - [DjangoCon US Website and Design](#djangocon-us-website-and-design) +- [Pre-Conference Activities](#pre-conference-activities) + - [Sightseeing and Some Great Meals](#sightseeing-and-some-great-meals) + - [Black Python Devs Leadership Summit](#black-python-devs-leadership-summit) + - [Rooftop View of Durham](#rooftop-view-of-durham) + - [Swag Stuffing](#swag-stuffing) + - [Django Social](#django-social) +- [Monday](#monday) + - [Keynote - Power to the People who Teach the People by Sheena O'Connell](#keynote---power-to-the-people-who-teach-the-people-by-sheena-oconnell) + - [Choosing Wisely: SPA vs. HTMX for Your Next Web Project by Chris May](#choosing-wisely-spa-vs-htmx-for-your-next-web-project-by-chris-may) + - [Error Culture by Ryan Cheley](#error-culture-by-ryan-cheley) + - [Shrimp and Grits](#shrimp-and-grits) + - [Troubleshooting is a Lifestyle 😎 by Jack Linke](#troubleshooting-is-a-lifestyle--by-jack-linke) + - [A Related Matter: Optimizing your webapp by using django-debug-toolbar, select_related(), and prefetch_related() by Christopher Adams](#a-related-matter-optimizing-your-webapp-by-using-django-debug-toolbar-select_related-and-prefetch_related-by-christopher-adams) + - [Unlocking Performance: Benchmarking and profiling Django for Maximum Efficiency by Ron Maravanyika](#unlocking-performance-benchmarking-and-profiling-django-for-maximum-efficiency-by-ron-maravanyika) + - [DEFNA Board Dinner](#defna-board-dinner) +- [Tuesday](#tuesday) + - [Keynote - How To Be A Developer and Other Lies We Tell Ourselves by Mario Munoz](#keynote---how-to-be-a-developer-and-other-lies-we-tell-ourselves-by-mario-munoz) + - [PostgreSQL Beyond Django: Strategies to Get Max Performance by Álvaro Justen](#postgresql-beyond-django-strategies-to-get-max-performance-by-álvaro-justen) + - [If We Had $1,000,000: What Could The DSF Do With 4x Its Budget? by Jacob Kaplan-Moss](#if-we-had-1000000-what-could-the-dsf-do-with-4x-its-budget-by-jacob-kaplan-moss) + - [Faster, leaner, greener: 10x lower website carbon emissions by Thibaud Colas](#faster-leaner-greener-10x-lower-website-carbon-emissions-by-thibaud-colas) + - [Meeting Lorenzo](#meeting-lorenzo) + - [Speaker and Organizer Dinner](#speaker-and-organizer-dinner) + - [The Boxcar Bar and Arcade](#the-boxcar-bar-and-arcade) +- [Wednesday](#wednesday) + + - [Lightning Talk Cameo](#lightning-talk-cameo) + + - [Panel Discussion: Open, friendly, and welcoming: on the history and future of mentoring in Django](#panel-discussion-open-friendly-and-welcoming-on-the-history-and-future-of-mentoring-in-django) + - [Queeny's](#queenys) +- [Hallway Track](#hallway-track) + - [Connections Made](#connections-made) + - [Swag](#swag) + - [Django Social T-Shirt](#django-social-t-shirt) + - [Visa Frustration](#visa-frustration) +- [Thursday](#thursday) + - [Sprints](#sprints) +- [Another Great Adventure](#another-great-adventure) +- [More Sight Seeing and Food](#more-sight-seeing-and-food) + - [Sarah P. Duke Gardens](#sarah-p-duke-gardens) + - [Cocoa Cinnamon](#cocoa-cinnamon) + - [The Can Opener](#the-can-opener) + - [21c Museum Hotel](#21c-museum-hotel) + - [The Durham Hotel](#the-durham-hotel) + - [Mother and Sons](#mother-and-sons) + - [Durham Food Hall](#durham-food-hall) + - [Press Coffee, Crepes, and Cocktails](#press-coffee-crepesand-cocktails) + - [Centerfest](#centerfest) + - [Durham Market Culture](#durham-market-culture) + - [Cousins Maine Lobster](#cousins-maine-lobster) + - [Unscripted Rooftop Pool](#unscripted-rooftop-pool) + - [The Parlour](#the-parlour) + +## Intro + +Disclaimer: the content of this post is a reflection of my career journey and not specific to my work at JPMorganChase. + +DjangoCon US 2024 took place from September 22-27 in Durham, North Carolina at the Durhan Convention Center. It was the seventh DjangoCon US I've had the privilege of attending and an absolute blast! + +Attendees (photo credit: Bartek Pawlik (https://bartpawlik.format.com/)) +![](djangocon-us-2024-recap-images/attendees-photo.jpg) + +[**back to top**](#table-of-contents) + +### Venue Selection + +If you want to bring DjangoCon US to your city or volunteer, we want to hear from you! + +My fellow DEFNA Board Member Adam Fast gave a lightning talk about our search for a venue for 2025 and beyond. Cost continues to be a challenge and our sponsorship is down. + +As they say in open source, "Given enough eyeballs, all bugs are shallow." Perhaps with the eyeballs of the entire community, we can find an acceptable course of action. + + + +[**back to top**](#table-of-contents) + +### DjangoCon US Website and Design + +A number of people have commented that they've really loved the t-shirt and bag this year. + +Our wonderful designer Joni Trythall of YupGup did a [DjangoCon US Design Reflection](https://jonitrythall.com/dcus-design-reflection) featuring all of our designs since 2018. + +As a DEFNA Board Member, I've had the pleasure of collaborating with Joni in bringing all of these designs to life. They are so beautiful! + +Thank you to Joni for a special shoutout at the end of her post. + +In addition, we did a refactor of our DjangoCon US website backend this year. It's easier to get up and running and has a well documented style guide. + +Feel free to fork it and use it in line with the license. + +## Pre-Conference Activities + +### Sightseeing and Some Great Meals + +I feel privileged to be able to travel. I make the most of every opportunity to get to know a place better: seeing the unique sights, experiencing what makes the culture special, and enjoying the celebrated local cuisine. + +In Durham, I had the chance to revisit the incredible Sarah P. Duke Gardens and see a few other attractions for the first time. Also, although most of my meals were provided through the conference, I enjoyed some outstanding meals in downtown Durham restaurants. + +Here are a few of my favorite moments from the trip. See more photos and anecdotes later in this post. + +Sarah P. Duke Gardens Red Bridge... jaw dropping scenes +![](djangocon-us-2024-recap-images/sarah-p-duke-gardens-red-bridge.jpg) + +21c Museum Hotel... the bathroom window is transparent until you turn the lock, then it becomes opaque +![](djangocon-us-2024-recap-images/21c-museum-hotel-bathroom.jpg) + +The Durham Hotel lobby... wow! +![](djangocon-us-2024-recap-images/the-durham-hotel-lobby.jpg) + +Mother and Sons... Squid Ink Tonnarelli, NC Shrimp, uni, fennel, scallions +![](djangocon-us-2024-recap-images/mother-and-sons-squid-ink-pasta.jpg) + +Press Coffee, Crepes, and Cocktails... oh my, this berries crepe was absolutely delicious. I had a banana bread latte too that was chef's kiss. +![](djangocon-us-2024-recap-images/press-crepe-company-berries.jpg) + +I've always wanted one of these! A nice visual metaphor taken along the side of the conference hotel during Centerfest Fine Art Festival. +![](djangocon-us-2024-recap-images/butterfly.jpg) + +Unscripted rooftop pool +![](djangocon-us-2024-recap-images/unscripted-rooftop-pool.jpg) + +### Black Python Devs Leadership Summit + +It was an honor to have been invited to attend the [Black Python Devs Leadership Summit](https://blackpythondevs.com/leadership-summit-2024/) as a distinguished guest. + +The event took place at the Caktus office. I attended the afternoon session. + +The session kicked off with a keynote by Wesley Faulkner. + +Wesley gave some sobering stats, then gave practical advice for how to observe, predict, and improve your surroundings, the benefits and risks. + +![](djangocon-us-2024-recap-images/tech-sector-stats-1.png) +![](djangocon-us-2024-recap-images/tech-sector-stats-2.png) + +Interactive speakers +* Loren Crary (filling in for Tim Schilling): PSF +* Afi Gbadago: BPD Open Source Program +* Kudzayi Bamhare: Creating ecosystems- conducting a beginner Python workshop in Zimbabwe in partnership with Uncommon teaching hub + +BPD Vice-Executor Velda Kiara led a panel with with community leaders about topics concerning Black Leaders in Python. + +Panel participants Benedict Koji Amofah, Jeff Triplett, Loren Crary, Monica Oyugi, and host Velda Kiara +![](djangocon-us-2024-recap-images/black-python-devs-summit-panel.jpg) + +After the panel, we took part in breakout sessions. My group had a thoughtful and spirited conversation about newcomer psychological safety moderated by Alex Oladele and Paul Everitt. + +The event ended with a fun happy hour. + +Me, Abigail Afi Gbadago, and Velda Kiara after the summit! +![](djangocon-us-2024-recap-images/black-python-devs-summit-me-afi-velda.jpg) + +I am so proud of them for the role they played in organizing an outstanding event. It had a lot of heart. + +BPD Founder Jay Miller announced that the next leadership summit will be somewhere in Africa. + +The morning and afternoon replays are available on the info page. + +### Rooftop View of Durham + +After the summit, a DjangoCon US attendee who lives at One City Center took a group of us up to the 28th floor for an incredible view of the Durham skyline. + +[Video of the skyline](https://youtu.be/8w3ubfRBK5I) + +One City Center rooftop pool +![](djangocon-us-2024-recap-images/one-city-center-roof.jpg) + +[**back to top**](#table-of-contents) + +### Swag Stuffing + +On Sunday, I continued my tradition of swag stuffing. Conference pro-tip: it's a great opportunity to meet people! + +[**back to top**](#table-of-contents) + +### Django Social + +For the second year in a row, Foxley Talent spearheaded a Django Social event at [Ponysaurus Brewing Company](https://www.ponysaurusbrewing.com/). Thank you to REVSYS for sponsoring as well. + +A sign of a fantastic event: it was over before I knew it. I had the chance to catch up with "old" friends and meet new ones. + +Djangonauts at Ponysaurus +![](djangocon-us-2024-recap-images/django-social.jpg) + +[**back to top**](#table-of-contents) + +## Monday + +Orientation Chair Kojo Idressa and Conference Chair and DEFNA President Peter Grandstaff kicked off the conference. + +### Keynote - Power to the People who Teach the People by Sheena O'Connell + +Sheena has been an educator since childhood and began working for an education non-profit called Umuzi in 2018. She is interested in [metacognition](https://en.wikipedia.org/wiki/Metacognition), how people learn. + +She began her talk by describing the education status quo: common learning anti-patterns, what a normal classroom looks like, and normal success distribution. + +She introduced [Bloom's 2 Sigma Problem](https://en.wikipedia.org/wiki/Bloom%27s_2_sigma_problem). "The average student tutored one-to-one using mastery learning techniques performed two standard deviations better than students educated in a classroom environment." + +Mastery learning techniques +![](djangocon-us-2024-recap-images/sheena-mastery-learning-techniques.png) + +A few advantages of mastery-based learning: +* Social contract- students are more motivated due to buy-in +* It helps students develop a growth mindset +* It helps the teacher master teaching ("did I do a good job of teaching?") + +A few thoughts on learning +* The power of compounding over time +* If you teach one person, it can impact many others +* Struggle is good, teach students how to learn +* Some teaching techniques are more powerful than others +* "Trust no one" +* "You can't teach a person to ride a bicycle by riding a bicycle for them." + +"Education is not the filling of a pail, but the lighting of a fire." + +Sheena has started [The Guild of Educators](https://www.sheenaoc.com/articles/2024-09-12-introducing-goe). + +More useful to me resources +* [Make it Stick](https://www.amazon.com/Make-Stick-Science-Successful-Learning/dp/0674729013) book +* [Huberman Lab Podcast](https://www.hubermanlab.com/podcast) +* [Retrieval practice](https://www.retrievalpractice.org/why-it-works) +* [The Protégé Effect](https://www.growthengineering.co.uk/protege-effect) +* [Stereotype threat](https://en.wikipedia.org/wiki/Stereotype_threat)… sense of belonging + +[**back to top**](#table-of-contents) + +### Choosing Wisely: SPA vs. HTMX for Your Next Web Project by Chris May + +Last year, in his talk HTML-ivating your Django web app’s experience with HTMX, AlpineJS, and streaming HTML, Chris introduced the idea that you can have a SPA-like exerience in Django without using SPA tools. + +I wrote about it in my [DjangoCon US 2023 Recap](https://katherinemichel.github.io/portfolio/djangocon-us-2023-recap.html#html-ivating-your-django-web-app-s-experience-with-htmx-alpinejs-and-streaming-html). + +In that talk, he referenced a Thoughtworks article [SPA by Default](https://www.thoughtworks.com/en-us/radar/techniques/spa-by-default) and Tayor Hunt's [Making the World's Fastest Website and Other Mistakes](https://dev.to/tigt/making-the-worlds-fastest-website-and-other-mistakes-56na) + +According to Thoughtworks, "Too often teams are skipping [that] trade-off analysis, blindly accepting the complexity of SPAs by default even when business needs don't justify it." + +Taylor Hunt refactored a React/Redux grocery store SPA app for a much improved experience by using just HTML, CSS, and laser-focused JavaScript. + +Chris started this year's talk off by asking some questions: Are you using a SPA? What would make you change? When do you think you should use a SPA? Why would you want to use HTMX versus SPA? What tools are you favorite tools? Are you using them well? + +SPA downsides +* Slow startup time +* Bad user experience on slow devices +* "A massive investment in controlling complexity is the only way to scale JS-driven frontends." Alex Russell in [The Market for Lemons](https://infrequently.org/2023/02/the-market-for-lemons/) +* "Not only does JavaScript cost 3x more in processing power, byte-for-byte, than HTML and CSS, but it also removes the browser's ability to parallelise page loading." Alex Russell in [Caprock](https://infrequently.org/2024/08/caprock/) +* "When using JavaScript you pay a performance tax no less than four times." Tim Kadlec in [The Cost of JavaScript Frameworks](https://timkadlec.com/remembers/2020-04-21-the-cost-of-javascript-frameworks) + +How the front-end is coping +![](djangocon-us-2024-recap-images/chris-how-the-frontend-is-coping.png) + +When SPAs could be worth their weight (Alex Russell in [Caprock](https://infrequently.org/2024/08/caprock/)) +![](djangocon-us-2024-recap-images/chris-when-spas-could-be-worth-their-weight.png) + +When or when-not to SPA (Alex Russell in [Caprock](https://infrequently.org/2024/08/caprock/)) +![](djangocon-us-2024-recap-images/chris-specrum.png) + +Chris pointed out [Katie Sylor-Miller's "Component Islands" pattern](https://jasonformat.com/islands-architecture/) as showing promise. "Removing the need for a root JavaScript component greatly reduces complexity." The brower can handle most things without JavaScript." + +Streamed HTML Components +![](djangocon-us-2024-recap-images/chris-streamed-html-components.png) + +Chris introduced tools that can be used to create a SPA-like experience +* CSS view transitions +* [Django Unicorn](https://www.django-unicorn.com/) +* HTMX +* Alpine.js +* [django-template-partials](https://github.com/carltongibson/django-template-partials) +* [django-components](https://pypi.org/project/django-components/) +* [Datastar](https://datastar.fly.dev/) +* [Unpoly](https://unpoly.com/) + +Three HTMX success stories +* [Umuzi](https://www.sheenaoc.com/articles/2024-06-30-htmx) +* [contexte](https://david.guillot.me/en/posts/tech/following-up-mother-of-all-htmx-demos/) +* [OpenUnited](https://www.linkedin.com/feed/update/urn:li:activity:7109116330770878464/) + +Notably, OpenUnited developer velocity improved by at least 500% after switching to HTMX. + +Chris will follow up with a blog post with more info about streaming HTML components. + +[**back to top**](#table-of-contents) + +### Error Culture by Ryan Cheley + +Ryan defined Error Culture: workers ignore automated email alerts, creating a culture of reactive firefighting. + +Why does it happen? Lack of understanding, error/alert fatigue, hero culture. + +If an alert is not important: don't just delete the alert. Delete the mechanism that created the alert. + +Make sure an alert is... actionable, important, sent to the right people +![](djangocon-us-2024-recap-images/ryan-venn-diagram.png) + +What, why, who, verb +![](djangocon-us-2024-recap-images/ryan-best-example.png) + +More useful to me resources +* [Chesterton's Fence](https://fs.blog/chestertons-fence/) + +[**back to top**](#table-of-contents) + +### Shrimp and Grits + +I tried grits as a kid and didn't like them. I've recently been told by friends that I just haven't had the right grits. + +When I saw grits on the DjangoCon US lunch buffet, I had to try them. I still don't like them, but it was an experience! + +North Carolina-inspired lunch +![](djangocon-us-2024-recap-images/shrimp-and-grits.jpg) + +[**back to top**](#table-of-contents) + +### Troubleshooting is a Lifestyle 😎 by Jack Linke + +Jack started off the talk with a quote and described indicator categories. + +"If your only tool is a hammer then everything looks like a nail." Abraham Maslow + +Jack started with some Django built-in troubleshooting tools +* Django template error pages +* Django error reporting by email +* Django system checks framework (it's extensible- dj-stripe is an example) +* Django console and logging (for extra context and use verbosity settings 1-3) + +Django System Checks Framework +![](djangocon-us-2024-recap-images/jack-django-systems-check-framework.png) + +He then moved on to some third-party packages and tools +* django-debug-toolbar (also extensible) +* django-silk performance profiler +* Error tracking and performance monitoring- Sentry, Rollbar, Newrelic, Honeybadger, Bugsnag, Raygun +* He gave a demo of Sentry dashboard with error page, error message, tags +* django-health-check package (can add Celery, Redis, Postgres) +* django-watchman + +He gave an exemple of extending the Django admin by adding checks. He had an issue with Celery- too few tasks were processed. He put a panel into the admin to capture the last 24 hours of tasks processed through Celery. + +Strategies for dissecting complex issues +![](djangocon-us-2024-recap-images/jack-strategies-for-dissecting-complex-issues.png) + +He then gave some general tips for troubleshooting +* Use the power of isolating variables and narrowing scope +* Be like Frances Elizabeth Holberton- "break the execution- does the system work up to this point." Similarly, Python Debugger (PDB) can be used to create breakpoints to step through the code to find the issue. +* Avoid tunnel vision- seek broad pespectives and alternative approaches + +Troushooting often involves stating the problem and asking for help +* "A problem well stated is a problem half solved." John Dewey +* Rubber duck debugging +* Know when to seek assistance +* Asking for help is a strategy. Learn how to ask for help effectively +* Learn how to create a Minimum Reproducible Example (MRE) to increase your odds of getting help + +How to effectively ask for help +![](djangocon-us-2024-recap-images/jack-how-to-effectively-ask-for-help.png) + +Oh no +![](djangocon-us-2024-recap-images/jack-oh-no.png) + +Yep! +![](djangocon-us-2024-recap-images/jack-yep.png) + +Where to get help +![](djangocon-us-2024-recap-images/jack-where-to-get-help.png) + +Jack gave a shout out to Ken Whitesell for his prolific question-answering in the Django Forum! + +Jack encouraged the audience to document your process. +![](djangocon-us-2024-recap-images/jack-write-down-your-troubleshooting-process.png) + +[**back to top**](#table-of-contents) + +### A Related Matter: Optimizing your webapp by using django-debug-toolbar, select_related(), and prefetch_related() by Christopher Adams + +Because I am already familiar with diagnosing and fixing N+1 problems, I watched Christopher's talk for new ideas. + +A few reminders +* Querysets are immutable +* Querysets are lazy (they do not hit the database until they are evaluated). Chris showed examples. + +A few ways to profile SQL queries +* Set Django logging to debug and stream results +* DB all-statement logging (caution- this will fill up the logs, so perhaps run it for a minute or so in staging, not prod) +* [django-debug-toolbar](https://django-debug-toolbar.readthedocs.io/en/latest/) (install conditionally) + +Good points about select_related() and prefetch_related() +* Database transaction latency is increased if the data is in another datacenter +* Prefetch returns another queryset and this can be more efficient than if the database does it +* People in the 90th percentile who have a slow machine can benefit + +Other django-debug-toolbar uses +![](djangocon-us-2024-recap-images/christopher-ddt-other-uses.png) + +[Code samples](https://github.com/adamsc64/a-related-matter) + +[**back to top**](#table-of-contents) + +### Unlocking Performance: Benchmarking and profiling Django for Maximum Efficiency by Ron Maravanyika + +[Unlocking Performance: Benchmarking and profiling Django for Maximum Efficiency](https://2024.djangocon.us/talks/unlocking-performance-benchmarking-and-profiling-django-for-maximum-efficiency/) by Ron Maravanyika + +Ron said that firstly, we need to define efficiency. + +Benchmarking is looking at time. Profiling is looking at resource usage. + +Process to Follow +![](djangocon-us-2024-recap-images/ron-process-to-follow.png) + +Ron explained some possible tools and gave demos +* Unix time command: real, user, sys +* Python timeit module +* [pytest-benchmark](https://pytest-benchmark.readthedocs.io/en/latest/) and benchmark_weave, aspectlib +* Python profile module +* Python cprofile module +* Live profiling tool [django-silk](https://github.com/jazzband/django-silk) +* django-silk profiler and binary version can be used to create an image that shows parallel functions running +* django-silk decorator method and context manager method can be used to profile small blocks of code +* django-silk [Dynamic profiling](https://github.com/jazzband/django-silk?tab=readme-ov-file#dynamic-profiling) can be used to profile something you don't have access to + +Summary +![](djangocon-us-2024-recap-images/ron-summary.png) + +[**back to top**](#table-of-contents) + +### DEFNA Board Dinner + +DEFNA had a board dinner to discuss business. It was a pleasure to be treated to a gourmet meal at 21c Museum Hotel [Counting House](https://countinghousenc.com/) restaurant. It was an unforgettable experience. + +I had oysters for the first time and particularly enjoyed the scallops and smoked trout dip. + +The DEFNA Board... wonderful people! +![](djangocon-us-2024-recap-images/defna-board.jpg) + +Oysters on the half, blood orange mignonette, cocktail sauce +![](djangocon-us-2024-recap-images/21c-museum-hotel-oysters.jpg) + +Smoked trout dip, bread & butter pickle, butter-fried saltine +![](djangocon-us-2024-recap-images/21c-museum-hotel-trout-dip.jpg) + +Diver scallops, pecorino english pea puree, radish & snow pea orzo salad, pea tendrils; Sherry Berry lifts me up, lustau sherry, capelleti, strawberry, aromatic bitters, tonic +![](djangocon-us-2024-recap-images/21c-museum-hotel-scallops.jpg) + +Chocolate cremieux, dark chocolate, hazelnut, Italian meringue, decaf coffee +![](djangocon-us-2024-recap-images/21c-museum-hotel-dessert.jpg) + +[**back to top**](#table-of-contents) + +## Tuesday + +### Keynote - How To Be A Developer and Other Lies We Tell Ourselves by Mario Munoz + +Mario started off his keynote by introducing himself. "I am a person." He went on to talk about the diverse experiences that have contributed to who he is today. + +Mario's talk was philosophical. He acknowledged, "We all know philosophy and software engineering are the same thing." Both are involve abstract thinking, making models of intangible things, trying to apply them to real world scenarios. + +He talked about The Mirror Stage, a concept in Jacques Lacan's psychoanalytic theory. It refers to the time when a child identifies their own image. + +Mario then used a Person/Ality personality simulator. Images, as though from the subconscious, appeared on the screen as he talked about experiences he'd had as a developer. Afterward, he analyzed each experience. + +![](djangocon-us-2024-recap-images/mario-withdrawn-mood-self-absorbed.png) + +Throughout the talk, he reflected +* "Being a developer should in no way rob you of who you are and your own identity." +* "The biggest lie that we can tell ourselves is that these objects of representation that are outside of us are synonymous with who we are." +* "Everything we tell ourselves about ourselves is always a little bit inadequate." +* Our strengths can be our biggest weakness and our weaknesses can be turned into our strengths. + +At the end, he revealed, "I am a community. We are a community... The community is my biggest asset." + +"How to be a better developer... be a better person to others." + +[**back to top**](#table-of-contents) + +### PostgreSQL Beyond Django: Strategies to Get Max Performance by Álvaro Justen + +Alvaro showed some lesser known ways to improve the performance of PostgreSQL. + +He explained each method, including profiling results, then ran a demo. + +Some of his suggested methods +* Use UUID field as primary key field and avoid creating two columns. You do not need a sequential ID, because of the UUID hash. You can index UUID. +* Starting at Django 3.2, the ID of each field went from 4 to 8 bytes. In settings use the default AutoField instead of BigAutoField. +* Alvaro prefers to create his own ID. See urlid.org for his methodology. +* Use SQL min/max to check the size of table values. Use SmallIntegerField instead of IntegerField. +* Column order can affect space used. Use fixed-size columns (bigger, then smaller), then variable-size. See [Data alignment in Postgres](https://www.enterprisedb.com/postgres-tutorials/data-alignment-postgresql). +* Full text search and search vector field scenarios +* Trigger- perform operations inside of the database more quickly than in the app. Don't put much business logic in the trigger. + +[Code](https://github.com/PythonicCafe/djpg-example) + +[**back to top**](#table-of-contents) + +### If We Had $1,000,000: What Could The DSF Do With 4x Its Budget? by Jacob Kaplan-Moss + +Jacob is a retired Django BDFL and current DSF Treasurer. He showed the curent $255,000 DSF budget breakdown. Most of the budget goes to the salary for fellows (health of project) and admin (health of foundation). + +If the budget were quadrupled to 1,000,000, he has a personal wishlist. +![](djangocon-us-2024-recap-images/jacob-my-wishlist.png) + +How do we get there? We probably need to target major donors versus many-small funders, and that's probably ok. + +Major donors are: +* Corporations +* High-net worth individuals +* Government grants +* Private foundation grants + +TL;DR hire experts (executive director, grant writer, etc.) and pay them to get the money. + +Easy +![](djangocon-us-2024-recap-images/jacob-easy.png) + +Medium +![](djangocon-us-2024-recap-images/jacob-medium.png) + +Hard +![](djangocon-us-2024-recap-images/jacob-hard.png) + +If you take action and get a "no", Jacob would like to know why. Email him. + +More useful to me resources +* Sue Gardner's [What's Really Wrong With Non-Profits and How We Can Fix It?](https://suegardner.org/2013/10/20/whats-really-wrong-with-nonprofits-and-how-we-can-fix-it/) + +[**back to top**](#table-of-contents) + + +### Faster, leaner, greener: 10x lower website carbon emissions by Thibaud Colas + +My points of interest +* Wagtail developer, DSF Board Member +* wagtail.org/10x-lower +* + +[**back to top**](#table-of-contents) + +### Meeting Lorenzo + +After years of following each other on social media, Lorenzo Peña and I had the chance to meet in person! I was thrilled that he had the chance to present a talk [The art of (not) redirecting](https://2024.djangocon.us/talks/the-art-of-not-redirecting/) and attend the speaker/organizer dinner too. + +A dream come true +![](djangocon-us-2024-recap-images/lorenzo-post.png) + +Me and Lorenzo +![](djangocon-us-2024-recap-images/me-and-lorenzo.jpg) + +[**back to top**](#table-of-contents) + +### Speaker and Organizer Dinner + +On Tuesday night, I attended the speaker/organizer dinner at [Greer Street Garden](https://geerstreetgarden.com/about). + +It was a chance to relax, enjoy some good food and conversation. + +Sitting next to Simon Willison, co-creator of Django, I couldn't resist getting a photo! + +I wrote about Simon's PyCon US 2024 talk about Imitation Intelligence in my [PyCon US Recap](https://katherinemichel.github.io/portfolio/pycon-us-2024-recap.html#simon-willison-keynote). + +Me and Simon (photo credit: Django Fellow Natalia Bidart) +![](djangocon-us-2024-recap-images/me-and-simon.jpg) + +[**back to top**](#table-of-contents) + +### The Boxcar Bar and Arcade + +After the speaker/organizer dinner, [Six Feet Up](https://www.sixfeetup.com/) hosted a Mario Kart competition across the street at [The Boxcar Bar and Arcade](https://theboxcarbar.com/). + +I spotted a few favorite old school games too: Super Pac-Man, Ms. Pac-Man, Donkey Kong, BurgerTime, Frogger. + +[Video of Boxcar Arcade](https://youtu.be/gO1CcdgQ9II) + +Super Pac-Man +![](djangocon-us-2024-recap-images/boxcar-arcade-super-pac-man.jpg) + +Me standing in front of the bar at Boxcar +![](djangocon-us-2024-recap-images/boxcar-arcade.jpg) + +[**back to top**](#table-of-contents) + +## Wednesday + +Wednesday was deep dive day. + +### Keynote - The Fellowship of the Pony by Natalia Bidart + +My points of interest +* + +[**back to top**](#table-of-contents) + +### Hidden gems of Django 5.x by Sarah Boyce + +My points of interest +* + + + +[**back to top**](#table-of-contents) + +### Lightning Talk Cameo + +It's no secret that I've been using social media for networking for many years now. Foxley Talent's Jon Gould and I had a conversation about it. Jon was inspired to create a lightning talk about the subject entitled Coffee Break Career Hacks and featured my social media engagement. It was an honor to be included! + +Jon during his lightning talk +![](djangocon-us-2024-recap-images/jon-lightning-talk.jpg) + +[**back to top**](#table-of-contents) + +[API Maybe: Bootstrapping a Web Application circa 2024](https://2024.djangocon.us/talks/api-maybe-bootstrapping-a-web-application-circa-2024/) by Carlton Gibson + + + +[**back to top**](#table-of-contents) + +### Panel Discussion: Open, friendly, and welcoming: on the history and future of mentoring in Django + +Our conference ended with a panel of five women, including three women of color, and Carlton Gibson. They owned that stage and the crowd was totally absorbed with what they had to say. I'm proud to be part of a community that is making substantial progress and quickly at that. + +Carlton Gibson, Keanya Phelps, Velda Kiara, Afi Maame Dufie, Sarah Boyce, and host Lacey Henschel +![](djangocon-us-2024-recap-images/closing-panel.jpg) + +[**back to top**](#table-of-contents) + +### Queeny's + +After the conference had ended, I joined a group of Wagtail developers and conference speaker Eva Nanyonga and walked the short distance to [Queeny's](https://www.queenysdurham.com/), a DjangoCon US institution. No one ever seems to turn down dinner at Queeny's. :) + +Group pic! +![](djangocon-us-2024-recap-images/queenys.jpg) + +[**back to top**](#table-of-contents) + +## Hallway track + +[**back to top**](#table-of-contents) + +### Connections Made + +I chatted with Thibaud Colas about his sustainability talk and got some tips from him. + +I listened in on a conversation with Lee Trout and Adam Fast and learned about some new tools. + +I pointed out Chris May's HTMX talk to Philip, a UI developer. He didn't know about HTMX and found it very enlightening. + +I chatted with Jay Miller about how DEFNA could better serve Black Python Devs and reported feedback. + +I found out from Frank Wiles that there is some early talk about a possible Lawrence Django event. + +I chatted with Simon Willison about some of my work duties, and he identified them as senior level. He told me about his excitement for his upcoming trip to see the [V & E Simonetti Historic Tuba Collection](https://www.atlasobscura.com/places/v-e-simonetti-historic-tuba-collection). + +I spent some much needed quality time with Lacey Henschel. She told me that I can learn anything. :) + +I met Django Fellow Sarah Boyce for the first time. We chatted about her work and DjangoCon Europe. In addition to her DjangoCon US talk, Sarah recently gave an excellent talk [Django Core Demystified](https://youtu.be/8rIylYYCmSI?si=8RsuP6VX41mVS0p6). + +I connected Thibaud with myself, Nicole, and Peter to talk about DjangoCon US website improvements and using it for other conference sites. + + + +[**back to top**](#table-of-contents) + + +### Swag + +Velda and John showing off John's DjangoCon US tote bag... "famous" people signed it, including me! +![](djangocon-us-2024-recap-images/velda-and-john-with-swag-bag-signed-by-famous-people.jpg) + +Black Python Devs Leadership Summit bead lanyard made by an artisan in Kenya (procured by Velda), African bracelet (gift from Velda), Kenyan coffee made with beans from Velda's family's farm (gift from Velda), PostgreSQL hat, Valkey sticker, DjangoCon US shirt, Caktus shirt +![](djangocon-us-2024-recap-images/swag.jpg) + +[**back to top**](#table-of-contents) + +### Django Social T-Shirt + +In 2023, Foxley Talent gifted me a Django Social t-shirt. Foxley Talent Recruiter Jon Gould and I took a photo with me wearing it. We recreated the photo! + +Me and Jon +![](djangocon-us-2024-recap-images/me-and-jon.jpeg) + +[**back to top**](#table-of-contents) + +### Visa Frustration + +As our conference becomes more diverse, a common frustration has emerged: difficulty getting a visa to enter the US. People from multiple countries have voiced their frustration about this to me. Django community member Julius Boakye poured his heart into a must-read post about it: [Breaking Barriers: A Tech Speaker’s Plea for Fair Visa Policies](https://medium.com/@theflyboy/breaking-barriers-a-tech-speakers-plea-for-fair-visa-policies-621b5909e496). + +[**back to top**](#table-of-contents) + +## Thursday + +### Sprints + +Caktus office around the corner from the Marriott is the perfect sprint venue. + +Me and Carlton +![](djangocon-us-2024-recap-images/me-and-carlton.jpg) + +I was racking my brain to figure out what to eat for lunch. I joined a group and walked the short distance to [Pie Pushers](https://www.piepushers.com/). + +A slice of Italian sausage and a simple house salad really hit the spot! It was the best tasting pizza I've had in quite a while. + +Italian sausage and a simple house salad +![](djangocon-us-2024-recap-images/pie-pushers.jpg) + +[**back to top**](#table-of-contents) + +## Another Great Adventure + +Thank you to my fellow DEFNA Board Members, volunteers, and everyone who made this another wonderful event! + +Thank you card +![](djangocon-us-2024-recap-images/thank-you-card.jpg) + +The talk replays will be available on the [DjangoCon US YouTube channel](https://www.youtube.com/c/DjangoConUS) in a few weeks. + +Keep scrolling for more sightseeing and food! + +[**back to top**](#table-of-contents) + +## More Sight Seeing and Food! + +[**back to top**](#table-of-contents) + +### Sarah P. Duke Gardens + +For months, I had been looking forward to making it back to the [Sarah P. Duke Gardens](https://gardens.duke.edu/). It is "the Cadillac" of botanical gardens with jaw dropping scenes everywhere. It's also said to be a different garden with every new season or even new month. I'd visit Durham again just to go back. + +[Video of historic terraces, fish pool, and Cindy Brodhead Pergola](https://youtu.be/ueDuFR4WnS8) + +[Video from the Red Bridge](https://youtu.be/CH6c_sWGb84) + +[Video of the South Lawn](https://youtu.be/E14VYIGEyS4) + +Fish pool, historic terraces, and Cindy Brodhead Pergola +![](djangocon-us-2024-recap-images/sarah-p-duke-gardens-overlook.jpg) + +Ducks at the Red Bridge +![](djangocon-us-2024-recap-images/sarah-p-duke-gardens-ducks.jpg) + +South Lawn +![](djangocon-us-2024-recap-images/sarah-p-duke-gardens-grass-for-days.jpg) + +[**back to top**](#table-of-contents) + +### Cocoa Cinnamon + +I love [Cocoa Cinnamon](https://littlewaves.coffee/pages/old-north-durham) coffee shop. I first tried it last year and went back several times during DjangoCon US 2024. I don't just love it for the coffee, which is amazing, by the way. On my first visit this year, I was offered a free Chai Latte. As I sat drinking it, they offered a free coffee that was redeemed by a student sitting studying. According to their menu, they also offer reduced price coffees as a service to the community. It's nice to patronize a business that shows kindness. + +Drinks had: +* Chai Latte: "Housemade chai blend of cinnamon, cardamon, ginger, rose, anise, & black pepper served unsweetened or with honey or vanilla syrup" +* Caramelo: "Sweet & creamy latte with with dulce de leche named for Sandra Cisneros' novel" +* Al Mohka: "Latte with 70% single origin housemade chocolate sauce & cinnamon. Reference to first ever coffee port" + +Cocoa Cinnamon... a short walk from the convention center +![](djangocon-us-2024-recap-images/cocoa-cinnamon.jpg) + +Yum! +![](djangocon-us-2024-recap-images/cocoa-cinnamon-coffee.jpg) + +[**back to top**](#table-of-contents) + +### The Can Opener + +I acted on a tip from fellow DEFNA Board Member Drew Winstel and visited The Can Opener. + +Built in the 1940s when vehicles weren't as large, [The Can Opener](https://www.atlasobscura.com/places/truck-decapitating-bridge), a railroad trestle bridge, was a mere 11 feet, 8 inches tall until 8 inches were added in 2019. Even with this improvement and warning signs well in advance, the bridge continues to peel the tops off trucks. + +The Can Opener +![](djangocon-us-2024-recap-images/the-can-opener.jpg) + +[**back to top**](#table-of-contents) + +### 21c Museum Hotel + +Last year, I didn't make it to the [21c Museum Hotel](https://www.21cmuseumhotels.com/) to see the hotel's signature artwork, so I thought it would be a fun experience this year. I was particularly taken by the see-into bathrooms. Also, the bank vault was a fun throwback to the hotel's past as a bank. + +[Video of 21c Museum Hotel See Into Bathroom](https://youtu.be/yeOEAycUvIQ) + +Bank vault entry +![](djangocon-us-2024-recap-images/21c-museum-hotel-bank-vault-entry.jpg) + +Bank vault- first room +![](djangocon-us-2024-recap-images/21c-museum-hotel-bank-vault-first-room.jpg) + +Bank vault- inner room +![](djangocon-us-2024-recap-images/21c-museum-hotel-bank-vault-inner-room.jpg) + +[**back to top**](#table-of-contents) + +### The Durham Hotel + +I went to [The Durham Hotel](https://www.thedurham.com/roof/), because I heard it has the best public view of the Durham skyline in town. I later had a much higher view of the skyline from the private 28th floor of One City Center, but The Durham Hotel architecture and interior design were well worth a visit in their own right. + +Skyline left +![](djangocon-us-2024-recap-images/the-durham-hotel-roof-left.jpg) + +Skyline right +![](djangocon-us-2024-recap-images/the-durham-hotel-roof-right.jpg) + +[**back to top**](#table-of-contents) + +### Mother and Sons + +I'd been hungry for good Italian food for a while. [Mother and Sons](https://www.mothersandsonsnc.com/) had very high ratings, so I decided to give it a try. + +I'd planned to play it safe and order the potato gnocchi. I asked the waiter if there was a particular dish that was very popular. He said the squid ink tonnarelli. I told him I'd always wondered what squid ink pasta tasted like, but had been afraid to order it. He said that the squid ink taste was mild. So, I ordered it, and it delicious. It had a lemon-butter shrimp taste. + +[**back to top**](#table-of-contents) + +### Durham Food Hall + +I'd already eaten, but joined a few attendees to walk over to the [Durham Food Hall](https://durhamfoodhall.com/) so they could eat. It was a thriving place with a lot of great options. + +Looking down at the first floor of the food hall +![](djangocon-us-2024-recap-images/durham-food-hall.jpg) + +[**back to top**](#table-of-contents) + +### Press Coffee, Crepes, and Cocktails + +I love [Press Coffee, Crepes, and Cocktails](https://pressccc.com/). It's a short walk south of the downtown and well worth it. It's a coffeehouse specializing in savory and sweet crepes. The space has a bright, energectic vibe and the food and coffee are very high quality. + +First time eating avocado toast... I went big! This was gourmet quality, for sure. The seasonal salted pistachio mocha latte was to die for. +![](djangocon-us-2024-recap-images/press-crepe-company-avocado-toast.jpg) + +[**back to top**](#table-of-contents) + +### Centerfest + +Serendipitiously, an art festival called [Centerfest](https://durhamarts.org/centerfest/) was taking place on Saturday and Sunday. + +I wandered through the art booths, then stumbled upon one of many musical acts. It was called Heart of Carolina A Capella. It was fun! + +[Video of Heart of Carolina A Capella singing Sweet Caroline](https://youtu.be/89tf1KyUjGs) + +[Video of Heart of Carolina A Capella singing Seven Bridges Road](https://youtu.be/_cReCxdjVYk) + +[**back to top**](#table-of-contents) + +### Durham Market Culture + +It's wonderful to see Durham's thriving market and festival culture. In addition to Centerfest, I stumbled upon the [Durham Farmers' Market](https://www.durhamfarmersmarket.com/), [Durham Craft Market](https://durhamcentralpark.org/events/durham-craft-market/), and [Durham Underground Market](https://makrs.com/durham-underground-market) all in the same weekend. + +On Sunday, I was looking for a quick, tasty lunch and decided to try the fare of a [Durham Underground Market](https://makrs.com/durham-underground-market) food truck. + +[Cousins Maine Lobster](https://www.cousinsmainelobster.com/) piqued my interest. According to the truck, the founders had appeared on Shark Tank. + +I ordered a lobster tail, but they were out, so they upgraded me to a lobster roll and tots. It was my first time eating a lobster roll. It was tasty! + +This was the moment when I realized my low cholesterol diet was officially suspended +![](djangocon-us-2024-recap-images/cousins-maine-lobster.jpg) + +[**back to top**](#table-of-contents) + +### Unscripted Rooftop Pool + +I had the chance to spend time at the [Unscripted Hotel](https://www.unscriptedhotels.com/). The rooftop overlooks the downtown and features a pool, bar, and DJ. It was an unforgettable atmosphere. + +[Video of the Unscripted rooftop pool](https://youtu.be/_5-08ssL8Wk) + +[**back to top**](#table-of-contents) + +### The Parlour + +I made a trip to [The Parlour](https://theparlour.co/) for the second year in a row. Last year, I had chocolate and was underwhelmed. This year, I had their most popular flavor- Salted Butter Caramel. It was truly incredible. I hope to make it back to Durham someday and visit The Parlour again! + +Salted Butter Caramel +![](djangocon-us-2024-recap-images/the-parlour.jpg) + +[**back to top**](#table-of-contents) diff --git a/_sources/djangocon-us-2024-topics-inspiration-list.md.txt b/_sources/djangocon-us-2024-topics-inspiration-list.md.txt new file mode 100644 index 00000000..5729363d --- /dev/null +++ b/_sources/djangocon-us-2024-topics-inspiration-list.md.txt @@ -0,0 +1,94 @@ +# DjangoCon US 2024 Topics Inspiration List + +Published March 3, 2024 + +New Features and Future Outlook +* New Django features +* New Python features of interest to Django devs +* Django Roadmap and Workshop conversation (see [Tim Schilling's Roadmap Ideas](https://www.better-simple.com/django/2024/01/25/informal-django-roadmap/), [Paolo's Roadmap Ideas](https://www.paulox.net/2024/01/19/my-django-roadmap-ideas/), and Thibaud's call for an [Informal Roadmap and Retrospective Workshop](https://forum.djangoproject.com/t/informal-roadmap-retrospective-workshops-for-django/26835 )) +* Web development framework retrospective/landscape + +Django Core +* Learning more about our new fellow :) +* Contributing to Django +* Update on [Accessibility Team work](https://www.djangoproject.com/weblog/2024/feb/10/django-accessibility-in-2023-and-beyond/) + +Django Software Foundation +* Update on new [workgroups structure](https://github.com/django/dsf-working-groups) and progress +* Update on [definition of DSF membership](https://www.djangoproject.com/weblog/2024/jan/10/dsf-membership/) + +Diversity +* Where we stand in bringing more diversity to: our steering council, core dev, contributor base, community +* Update on Djangonaut Space +* New initiatives: [Hidden Figures of Python Podcast](https://pypodcats.live/) (women make up "only 17% of invited guests among the popular podcast series") + +Python Packaging and Open Source +* New developments in Python/Django packaging landscape, including [uv package manager](https://github.com/astral-sh/uv) + +How to Raise Your Game +* Lesser known, but highly useful Django features +* Practical Django profiling, optimization +* Security (OWASP 10 and Django, how Django does security) +* Testing (pytest, Playwright, Selenium, etc).  +* Type hinting +* Patterns and architectures +* Practical async (going beyond the docs and a few tutorials to using day to day) + +New-ish or Experimental Technologies +* React/HTMX debate (see Chris May's great talk last year about using [HTMX, Alpine.js, and Streaming HTML](https://youtu.be/kYV8K71pY64?si=JQLO3HGPo87Sef41) and the work to be done) +* Using JavaScript and Django together: Alpine, Svelte, etc.  +* Tailwind +* WASM +* PyScript +* Co-Pilot, ChatGPT, etc. for Django devs  +* What tools I haven't heard about, but would want to know about + +Alternative Django Use Cases +* Orchestration/workflows +* Multi-tenancy + +Database +* Database/Django performance tuning at scale +* Database tradeoffs: Postgres, CockroachDB, SQL, etc. +* Datasette + +Opinionated Django +* Django deployment options and tradeoffs in 2024 +* Different ways of doing things in Django and when to use which option +* The best tools/packages to have in your Django toolbox in 2024 +* Favorite workflows, Git, CI/CD, GitHub Actions, local/prod, developer experience tools, etc.  + +API +* Django Ninja compared to Django Rest Framework +* Fast API + +How to Use/Better Popular CMS +* Wagtail +* Butter CMS + +Learning +* Flexing your problem solving chops +* Recursion (looking at you, [Al Sweigart](https://nostarch.com/recursive-book-recursion)) +* Great learning resources and the people who created them +* Strategies for effective learning + +Novel Uses for Django +* Experimental apps +* Prototyping with Django for fun and profit +* Historically relevant apps +* Your interesting Django story/adventure +* Lessons from managing/scaling Django in a unique or difficult way in your company +* Using Django for social good + +Team, Leadership, Building +* Product management (features, prioritization, OKRs, teamwork, etc.) +* Lessons from software engineering management +* Interesting mental models, productivity methods, learning approaches, the counter-intuitive + +Python/Django and Open Source +* Adventures in open source Django development +* How to get started with open source, Django open source, packaging + + diff --git a/_sources/favorite-conference-snapshots.md.txt b/_sources/favorite-conference-snapshots.md.txt new file mode 100644 index 00000000..af0122f4 --- /dev/null +++ b/_sources/favorite-conference-snapshots.md.txt @@ -0,0 +1,223 @@ +# Favorite Conference Snapshots + +Although these snapshots do not include all of the people who are special to me, they give a taste of the fun and serendipity of my conference travels over the years. In the Python community, as they say, the world is your oyster. A huge thank you to everyone who has made these incredible experiences possible over the years. + +## DjangoCon US 2024 + +September 22-27, Durham, North Carolina + +![](favorite-conference-snapshots/djangocon-us-2024-me-and-carlton.jpg) +Me and Carlton Gibson, former Django Fellow, at the first day of sprints + +![](favorite-conference-snapshots/djangocon-us-2024-queenys.jpg) +After the conference had ended, I joined a group of Wagtail developers and conference speaker Eva Nanyonga for dinner at nearby Queeny’s. + +![](favorite-conference-snapshots/djangocon-us-2024-me-and-simon.jpg) +Sitting next to Simon Willison, co-creator of Django, at the speaker/organizer dinner, I couldn’t resist getting a photo! I wrote about Simon's PyCon US 2024 talk about Imitation Intelligence in my [PyCon US Recap](https://katherinemichel.github.io/portfolio/pycon-us-2024-recap.html#simon-willison-keynote). (photo credit: Django Fellow Natalia Bidart) + +![](favorite-conference-snapshots/djangocon-us-2024-me-and-lorenzo.jpg) +After years of following each other on social media, Lorenzo Peña and I had the chance to meet in person! I was thrilled that he had the chance to present a talk and attend the speaker/organizer dinner too. It was a dream come true for him. Stories like that make my day! + +![](favorite-conference-snapshots/djangocon-us-2024-defna-board.jpg) +Wonderful people... the DEFNA Board dinner at 21c Museum Hotel Counting House. An unforgettable meal. + +![](favorite-conference-snapshots/djangocon-us-2024-black-python-devs-summit-me-afi-velda.jpg) +Me, Abigail Afi Gbadago, and Velda Kiara after Black Python Devs Leadership Summit! I am so proud of them for the role they played in organizing an outstanding event. It had a lot of heart. + +![](favorite-conference-snapshots/djangocon-us-2024-butterfly.jpg) +I've always wanted one of these! A nice visual metaphor taken along the side of the conference hotel during Centerfest Fine Art Festival. + +## PyCon US 2024 + +May 15-20, Pittsburgh, Pennsylvania + +![](favorite-conference-snapshots/pycon-us-2024-sunday-night.jpeg) +After the conference ended on Sunday night, I found myself chatting with a group of old friends and new friends. They invited me to dinner, and I decided to join. It was a wonderful time, as you can tell from the photo. :) Pictured: Tammy Do, Velda Kiara, Jim Anderson, Ngazetungue Muheue, Kudzayi Bamhare, Benedict Kofi Amofah, me, Afi Gbagado, and Catherine Devlin + +![](favorite-conference-snapshots/pycon-us-2024-me-and-jackie.jpeg) +Me and Jackie Kazil :) + +![](favorite-conference-snapshots/pycon-us-2024-me-juggling.png) +Not only does Ned Batchelder maintain a powerful Python package and give popular conference talks, he is also a juggling enthusiast. When I saw his juggling open space in progress, I couldn't resist stopping. I juggled for the first time in probably decades! + +![](favorite-conference-snapshots/pycon-us-2024-me-by-melanie.jpg) +My friend Melanie Arbor takes great profile pics. At DjangoCon US 2017, she took my pic, and I loved it. I've used it as my social media profile pic since then, but it's getting a bit dated. I saw her at PyCon US and asked her if she would be willing to take a new profile pic of me. It turned out that she had already created a "Profile Pic Palooza" open space for Saturday at 3 pm. As a bonus, I got to catch up with Chalmer Lowe for the first time since PyCon 2019. + +![](favorite-conference-snapshots/pycon-us-2024-me-and-benedict.jpg) +When I create this page of favorite conference snapshots, Benedict Kofi Amofah tweeted to me that he'd be in the gallery soon. I took him up on it. :) + +![](favorite-conference-snapshots/pycon-us-2024-black-python-devs-durham.png) +Although not a typical snapshot, this screenshot from K. Jay Miller's keynote about Black Python Devs is special to me. They are snapshots from DjangoCon US 2023 in Durham, North Carolina. Jay highlighted DjangoCon US as a place where Black Python Devs were empowered. + +![](favorite-conference-snapshots/pycon-us-2024-me-and-abigail.jpg) +Me and Abigail Mesrenyame Dogbe + +## PyTexas 2024 + +April 19-21, Austin, Texas + +![](favorite-conference-snapshots/pytexas-2024-jason-koo.jpg) +I met Jason Koo at DjangoCon US 2022 in San Diego where he generously helped as an organizer. It was great to see him again, and I look forward to learning more about Neo4j Graph Database! On the bright, sunny, second day of PyTexas, he invited me to be in this photo. It was a pleasure to get a snapshot next to my incredible friend Carol Willing. She had given an amazing keynote that morning. It is a must watch! I was also standing next to Josh Cannon who read the very clever Oh the (Methods) You Can (Make) book by Dunder Seuss. + +## DjangoCon US 2024 + +September 22-27, 2024, Durham, North Carolina + +![](favorite-conference-snapshots/djangocon-us-2024-lemur-1.jpg) +As a DEFNA Board Member, I help oversee DjangoCon US, including the website design. Because our host city Durham, North Carolina has the largest population of lemurs outside of Madagascar, we featured a "friendly" lemur on our website last year. After years of hearing about Tanganyika Wildlife Park in Goddard, Kansas, mom and I decided to go on April 6. I had no idea until I got there that you can feed lemurs. They were so soft and gentle. I loved spending time with these real-life, friendly lemurs! + +![](favorite-conference-snapshots/djangocon-us-2024-lemur-2.jpg) +A lemur holding hold my hand while it eats a Craisin out of my palm! + +## DjangoCon US 2023 + +October 16-20, Durham, North Carolina + +![](favorite-conference-snapshots/djangocon-us-2023-organizers-outside.jpg) +Wonderful people... DjangoCon US Organizers; photo credit: Bartek Pawlik (https://bartpawlik.format.com/) + +![](favorite-conference-snapshots/djangocon-us-2023-standing-ovation.jpg) +Standing ovation for organizers during the final remarks... one of many standing ovations over the years. Always a nice feeling. Photo credit: Bartek Pawlik (https://bartpawlik.format.com/) + +![](favorite-conference-snapshots/djangocon-us-2023-me-and-deb.jpg) +Me and Deb Nicholson, new PSF Executive Director... I met Deb unexpectedly at the pre-conference Django Social. It was a pleasure to get the chance to hang out with her throughout the week! I hope to do it again soon. + +![](favorite-conference-snapshots/djangocon-us-2023-me-and-abigail.jpg) +Me and Abigail Mesrenyame Dogbe. She is bringing open source to Ghana in a big way. + +![](favorite-conference-snapshots/djangocon-us-2023-me-and-jon.jpg) +Me with Jon Gould of Foxley Talent. I was lucky to be gifted this Django Social t-shirt by Jon. + +![](favorite-conference-snapshots/djangocon-us-2023-hotel-table.jpg) +Hanging out with some amazing attendees late into the evening, including fellow DjangoCon US Organizer Drew Winstel and favorite Python/Django authors Eric Matthes and William Vincent. Photo credit: Paolo Melchiorre + +![](favorite-conference-snapshots/djangocon-us-2023-board-dinner.jpg) +DEFNA Board Dinner at the incredible Parizade with Peter Grandstaff and Nichole Dominguez... a perfect evening. + +## DjangoCon US 2022 + +October 16-21, San Diego, California + +![](favorite-conference-snapshots/djangocon-us-2022-me-and-craig-bruce.jpg) +One night while I was having dinner with favorite author Eric Matthes and now DEFNA Board Member Tim Schilling, former DEFNA Board Member Craig Bruce showed up unexpectedly. What a wonderful surprise! During all of the time that we'd been fellow board members, we'd never actually met in person. As usual, I'd been to the beach earlier in the week and gotten a bit too much sun. :) + +![](favorite-conference-snapshots/djangocon-us-2022-me-outside.jpg) +Me captured through the window enjoying the "hallway track" standing next to Eric Holscher of Read the Docs and Write the Docs; photo credit: Bartek Pawlik (https://bartpawlik.format.com/) + +![](favorite-conference-snapshots/djangocon-us-2022-me-with-noah.jpg) +Me with wonderful fellow organizer Noah Alorwu; photo credit: Bartek Pawlik (https://bartpawlik.format.com/) + +## DjangoCon US 2021 + +October 21-23, online + +![](favorite-conference-snapshots/djangocon-us-2021-get-a-jumpstart-english.png) +Following in the footsteps of PyCon US and with multiple Spanish-speakers on our DEFNA Board, we decided to have a Charlas track. Giving a talk in Spanish had been on my bucket list for quite some time. I decided to submit a proposal and it was accepted. I ended up recording the talk in both Spanish and English, and they were both played simultaneously. My pre-recorded talk Get a Jumpstart on Collaboration and Code Review in GitHub playing in English. + +![](favorite-conference-snapshots/djangocon-us-2021-get-a-jumpstart-spanish.png) +My pre-recorded talk Get a Jumpstart on Collaboration and Code Review in GitHub playing in Spanish + +## PyCascades 2020 + +February 8-9, Portland, Oregon + +![](favorite-conference-snapshots/pycascades-2020-dinner-with-guido.jpg) +At the end of a conference day, I was hanging out in the lobby among other stragglers and was invited to dinner by my friends Vicky Tuite and Jonan Scheffler. Python creator and BDFL Guido van Rossum happened to be in attendance. What a magical evening! + +![](favorite-conference-snapshots/pycascades-2020-sprints-hanging-out-with-guido.jpg) +Hanging out with Guido at the sprints + +## GitHub Universe 2019 + +November 13-14, San Francisco, California + +![](favorite-conference-snapshots/github-universe-2019-nat.JPG) +After Nat Friedman, then GitHub CEO, tweeted to me that he'd love meet, I had the chance to talk to him briefly. It was super fun to hear from him in person. Love open source! + +![](favorite-conference-snapshots/github-universe-2019-github-hq-tour.JPG) +At PyGotham 2019, within just a few hours of time, attendee Jigyasa Grover invited me to tour Twitter, Froi Irizarry Rivera invited me to tour GitHub, and Casey Faist invited me to Salesforce Tower. During GitHub Universe 2019, I toured Twitter and GitHub. Unfortunately, Casey was ill, so I didn't tour the tower. Here I am at GitHub in front of the iconic Octocat statue. + +![](favorite-conference-snapshots/github-universe-2019-lunch-with-jigyasa-at-twitter-hq.jpg) +Me and Jigyasa Grover, machine learning engineer, having tea after lunch at Twitter + +![](favorite-conference-snapshots/github-universe-2019-twitter-hq-1.jpg) +Me at Twitter + +![](favorite-conference-snapshots/github-universe-2019-twitter-hq-2.jpg) +Me at Twitter + +## DjangoCon US 2019 + +September 22-27, San Diego, California + +![](favorite-conference-snapshots/djangocon-us-2019-me.jpg) +Happy times!; photo credit: Bartek Pawlik (https://bartpawlik.format.com/) + +![](favorite-conference-snapshots/djangocon-us-2019-with-ken-whitesell.jpg) +Selfie with our wonderful Ken Whitesell. For years, he has been the face that welcomes attendee to DjangoCon US and is a recipient of the Malcolm Tredinnick Memorial Prize. + +## Strange Loop 2019 + +September 13-14, Saint Louis, Missouri + +![](favorite-conference-snapshots/strange-loop-2019-me-with-marcia.JPG) +My longtime Twitter friend Marcia Dorsey was volunteering at an event outside the Strange Loop venue. I couldn't pass up an opportunity to take a break from the conference and meet her in person. I told her how fun it had been to meet her son Twitter and Square co-founder Jack Dorsey at a tweet up the year before! I tried to get her to set me up on a date with him, but it didn't happen, lol. + +## PyCon US 2019 + +May 1-9, Cleveland, Ohio + +![](favorite-conference-snapshots/pycon-us-2019-me-and-mariatta.jpg) +Me with one of my Python besties Mariatta (PyCon US 2023/2024 Chair and CPython Core Dev) :) + +![](favorite-conference-snapshots/pycon-us-2019-pylatam.jpg) +Proud to have represented DEFNA Board at PyCon Charlas (Spanish talks). Here I am with Joel Rivera and the PyLatam logo! + +## DjangoCon US 2018 + +October 14-19, San Diego, California + +![](favorite-conference-snapshots/djangocon-us-2018-state-of-django-panel-me-speaking.jpg) +Taking part in the State of Django Panel; photo credit: Bartek Pawlik (https://bartpawlik.format.com/) + +![](favorite-conference-snapshots/djangocon-us-2018-me.jpg) +Happy times! Me front row, left. Photo credit: Bartek Pawlik (https://bartpawlik.format.com/) + +![](favorite-conference-snapshots/djangocon-us-2018-meeting-betty-junod-at-docker-hq.jpg) +After the conference, I flew to San Francisco. I visited my friend Betty Junod at Docker Headquarters. Fun! + +![](favorite-conference-snapshots/djangocon-us-2018-meeting-jack-at-a-tweet-up.jpg) +Before I went to Docker, Jack Dorsey tweeted that there would be a tweet up in San Francisco later in the day. When I left Docker, I went to the tweet up at Tacolicious. I met Jack, Twitter co-founder Biz Stone, and a bunch of other Twitter, Inc principals, including then CFO Ned Segal, Head of Product Kayvon Beykpour, early investor Bijan Sabet, and Recode journalist Kurt Wagner. Amazing night! When I walked up to the gaggle around Jack, he was shockingly nice. Later, I took a pic with him. + +## PyGotham 2018 + +October 5-6, New York, New York + +![](favorite-conference-snapshots/pygotham-2018-han-dynasty.jpg) +Incredibly, the day before the conference started, I was walking around mid-town Manhattan alone and saw my friend Tim! What are the odds? He invited me to dinner at one of his favorite restaurants. Here I am with Trey Hunner, Tim Allen, Kenneth Love (DjangoCon US 2018 Co-Chair), and Lindsey Dragun. A treasured memory. + +![](favorite-conference-snapshots/pygotham-2018-me-and-lacey.jpg) +Me with the incredible Lacey Williams Henschel (DjangoCon US 2017 Chair). She was giving a talk What if Jane Austen had been an engineer? :) + +![](favorite-conference-snapshots/pygotham-2018-me-lindsey-trey-nic.jpg) +Me with Lindsey Dragun, Trey Hunner, and Nicholle James (DjangoCon US 2018 Co-Chair) during the conference + +## PyGotham 2017 + +October 6-7, New York, New York + +![](favorite-conference-snapshots/pygotham-2017-dinner.jpg) +My second ever conference, treated to dinner by local attendees who wanted to make new friends and thank out-of-towners for coming. + +## DjangoCon US 2017 + +August 13-18, Spokane, Washington + +![](favorite-conference-snapshots/djangocon-us-2017-on-stage.jpg) +Me giving my talk Get a Jumpstart on Collaboration and Code Review in GitHub. I gave my first conference talk at the first conference that I ever attended. I practiced using the AV system at a local church. I realized later that I had a lot of room for improvement (the speaker ahead of me was a veteran public speaker and technologist and watching her made me see how well it could be done), but it was a start. DjangoCon US loves to be the place where people get their start giving talks. :) Photo credit: Adam Gregory (https://atomimages509.wixsite.com/atom) + +![](favorite-conference-snapshots/djangocon-us-2017-speaker-photo.jpg) +Speaker photo... representing Lawrence, Kansas, the birthplace of Django with a KU Basketball t-shirt; photo credit: Adam Gregory (https://atomimages509.wixsite.com/atom) + +![](favorite-conference-snapshots/djangocon-us-2017-headshot-by-melanie-arbor.jpg) +A treasured head shot taken by my friend Melanie Arbor during the sprints diff --git a/_sources/hacktoberfest-prs-2020.md.txt b/_sources/hacktoberfest-prs-2020.md.txt new file mode 100644 index 00000000..c95e1694 --- /dev/null +++ b/_sources/hacktoberfest-prs-2020.md.txt @@ -0,0 +1,256 @@ +# Hacktoberfest PRs- 2020 + +In the spirit of building in public and using accountability to improve, I decided to write a brief summary of my Hacktoberfest PRs. + +## pugdebug PyPI Package + +I learned a great deal about packaging recently while overseeing a Pinax release. It was a fun exercise to use some of that knowledge to create the packaging configs for an app called [pugdebug](https://github.com/Mte90/pugdebug/) and test publish and install it. The project was fairly straight forward, which meant that the script could be relatively simple. Based on a [tweet](https://twitter.com/di_codes/status/1306234847812354050) by Dustin Ingram, I used the official PyPA Sample Project as a starting point. Check out the [setup.py](https://github.com/pypa/sampleproject/blob/master/setup.py) file in that project to see some of the other commonly used, optional arguments. :) + +* Issue: https://github.com/Mte90/pugdebug/issues/9 +* PR: https://github.com/Mte90/pugdebug/pull/13 + +Action taken: +* Created a setup.py file +* Based on the project docs and PyPA docs, created the relevant packaging configs +* Test published the package to the PyPI test instance +* Test installed the package using the PyPA packaging tutorial + +New setup.py + +```python +from setuptools import setup, find_packages +import pathlib + +here = pathlib.Path(__file__).parent.resolve() + +long_description = (here / 'README.md').read_text(encoding='utf-8') + +setup( + name='pugdebug', + version='1.1.0', + description='A standalone debugging client for PHP applications', + long_description=long_description, + long_description_content_type='text/markdown', + url='https://github.com/Mte90/pugdebug', + classifiers=[ + 'Intended Audience :: Developers', + 'Topic :: Software Development :: Debuggers', + 'Operating System :: OS Independent', + 'License :: OSI Approved :: GNU General Public License v3 (GPLv3)', + 'Programming Language :: Python :: 3 :: Only', + 'Programming Language :: Python :: 3.7', + ], + python_requires='>=3.7', + install_requires=['sip', 'PyQt5'] +) +``` + +A few useful resources: +* PyPA Sample Project: https://github.com/pypa/sampleproject +* PyPA Packaging Python Projects tutorial: https://packaging.python.org/tutorials/packaging-projects/ +* Real Python "How to Publish an Open-Source Python Package to PyPI" tutorial: https://realpython.com/pypi-publish-python-package/ +* PyPI classifiers list: https://pypi.org/classifiers/ +* PyPI test instance: https://test.pypi.org/ + +## All the Places Scraper + +For a while now, I've been wanting to learn how to make a scraper, so, when I came across the [All the Places](https://github.com/alltheplaces/) project, which contains a collection of Scrapy scripts (a.k.a "spiders") that can be used to scrape business websites for location data, I decided to make one of my own to contribute to the All the Places project for Hacktoberfest. + +I learned so much from this exercise, that I created a blog post about it, "[Building a Taco John's Scraper](https://github.com/KatherineMichel/portfolio/blob/master/regular-blog-posts/building-a-taco-johns-scraper.md)." Check it out if you want an insight into my learning process and how the script works. + +Now that I've created a working scraper, I can build on that knowledge by using it in a more complex project. + +* PR #1: https://github.com/alltheplaces/alltheplaces/pull/1634 +* PR #2: https://github.com/alltheplaces/alltheplaces/pull/1639 + +Action taken: +* Studied scraper scripts and websites they scrape to see different approaches +* Created a script that would follow CSS classes and elements to identify location page URLs and crawl them +* Tested the script locally to verify that the script returns the scraped data + +My Scrapy script + +```python +import re + +import scrapy + +from locations.items import GeojsonPointItem + + +class TacoJohns(scrapy.Spider): + name = "taco_johns" + allowed_domains = ["tacojohns.com"] + download_delay = 0.2 + start_urls = ( + "https://locations.tacojohns.com/", + ) + + state_pattern = re.compile("^[a-z]{2}(\.html)$") + city_pattern = re.compile("^[a-z]{2}\/.+(\.html)$") + location_pattern = re.compile("^[a-z]{2}\/.+\/.+(\.html)$") + + def parse(self, response): + urls = response.xpath('//li[@class="c-directory-list-content-item"]//@href').extract() + for url in urls: + if (self.state_pattern.match(url.strip())): + yield scrapy.Request(response.urljoin(url), callback=self.parse_state) + elif (self.location_pattern.match(url.strip())): + yield scrapy.Request(response.urljoin(url), callback=self.parse_location) + else: + yield scrapy.Request(response.urljoin(url), callback=self.parse_city) + + def parse_state(self, response): + urls = response.xpath('//li[@class="c-directory-list-content-item"]//@href').extract() + for url in urls: + if (self.location_pattern.match(url.strip())): + yield scrapy.Request(response.urljoin(url), callback=self.parse_location) + else: + yield scrapy.Request(response.urljoin(url), callback=self.parse_city) + + def parse_city(self, response): + urls = response.xpath('//*[@class="c-location-grid-item-link page-link hidden-xs"]//@href').extract() + for url in urls: + yield scrapy.Request(response.urljoin(url), callback=self.parse_location) + + def parse_location(self, response): + + properties = { + 'ref': response.url, + 'name': response.xpath('//div[@itemprop="name"]//text()').extract_first(), + 'addr_full': response.xpath('normalize-space(//*[@itemprop="streetAddress"]//text())').extract_first(), + 'city': response.xpath('//span[@itemprop="addressLocality"]//text()').extract_first(), + 'state': response.xpath('//*[@itemprop="addressRegion"]//text()').extract_first(), + 'postcode': response.xpath('normalize-space(//span[@itemprop="postalCode"]//text())').extract_first(), + 'country': "USA", + 'phone': response.xpath('//span[@id="telephone"]//text()').extract_first(), + 'website': response.url, + 'lat': response.xpath('//*[@itemprop="latitude"]/@content').extract_first(), + 'lon': response.xpath('//*[@itemprop="longitude"]/@content').extract_first(), + } + + yield GeojsonPointItem(**properties) +``` + +A few useful resources: +* "All The Places Data Format": https://github.com/alltheplaces/alltheplaces/blob/master/DATA_FORMAT.md +* Scrapy docs: https://docs.scrapy.org/en/latest/ +* Beautiful Soup docs: https://www.crummy.com/software/BeautifulSoup/bs4/doc/ +* Mozilla Web docs: https://developer.mozilla.org/en-US/ +* JSON docs: https://www.json.org/json-en.html +* Schema docs: https://schema.org/ + +## YT Higher Lower + +While I was looking through Hacktoberfest issues, the [YT Higher Lower](https://github.com/Jack1q/yt-higher-lower/) project piqued my interest. This was admittedly an easy PR. However, it provided a real benefit to a project and gave me the opportunity to try out a Python "game" script made based on a well-known product, and understand how it works. + +* Issue: https://github.com/Jack1q/yt-higher-lower/issues/1 +* PR: https://github.com/Jack1q/yt-higher-lower/pull/26 + +Action taken: +* Looked for common YouTube terms and added them to `terms.txt` + +Terms I added to `terms.txt` + +```txt +tutorial +funniest +talk show +late night +snl +makeup +tech +classics +jimmy fallon +``` + +A few useful resources: +* The original "Higher Lower Game" website: http://www.higherlowergame.com/ +* The original "Higher Lower Game" Android app: https://play.google.com/store/apps/details?id=com.codecomputerlove.higherlowergame +* The original "Higher Lower Game" iPhone/iPad/iPod app: https://apps.apple.com/us/app/the-higher-lower-game/id1130297669 + +## Django/React Template README.md Improvement + +I didn't intend to submit a PR of this type this year, because it would be a smaller step change in learning for me in comparison to some other contributions. However, when I came across this project's README, I couldn't resist submitting a PR to give it a more polished look! + +Unfortunately, this PR ended up not counting. Even though the repo owner created an issue welcoming general Hacktoberfest contributions and seemed to happily accept this PR, neither the repo itself nor the PR was ever properly labeled to qualify for Hacktoberfest. Regardless, I ended up with five other qualifying PRs, including two PRs for my All the Places scraper, and a PR improving another project README. + +I mainly included this, because it demonstrates an important type of contribution that repo owners tend to be happy to receive, solicited or unsolicited, that can be great for a newcomer to open source who is looking for a way to get started. + +* PR: https://github.com/lfsando/django-drf-typescript-react-redux-template/pull/6 + +Action taken: +* Created a table of contents +* Replaced markdown text quote with language-specific code fencing +* Added features category +* Better organized installation instructions + +Snippet from README.md before improvement + +```python +## Django + Django Rest Framework + Typescript + React + Redux Template + +- Django API (DRF) Backend +- Typescript, React, Redux Frontend + +### Install + +#### Frontend + +> npm i +> +> ###### Production: +> +> npm run build +> +> ###### Development: +> +> npm run dev + +# More of the same +``` + +Snippet from README.md after improvement + +```python +# Django + Django Rest Framework + Typescript + React + Redux Template + +Table of Contents +----------------- + +- [Features](#features) +- [Getting Started](#getting-started) + - [Frontend](#frontend) + - [Backend](#backend) +- [Todo](#todo) + +## Features + +Backend +* Django Rest Framework +* Django Rest Knox +* PyLint + +Frontend +* Webpack +* React +* Redux +* TypeScript +* Prettier + +## Getting Started + +### Frontend + +```javascript +npm i +```\ + +# More of the same (by the way, I included the \ to escape the code somehow!) +``` + +A few useful resources: +* GitHub Open Source Survey 2017 results (insights about documentation): https://opensourcesurvey.org/2017/#insights +* Pinax sample README.md: https://github.com/pinax/pinax-announcements/blob/master/README.md +* GitHub docs "Basic writing and formatting syntax": https://docs.github.com/en/free-pro-team@latest/github/writing-on-github/basic-writing-and-formatting-syntax +* GitHub docs "Creating and Highlighting Code Blocks": https://docs.github.com/en/free-pro-team@latest/github/writing-on-github/creating-and-highlighting-code-blocks diff --git a/_sources/index.rst.txt b/_sources/index.rst.txt new file mode 100644 index 00000000..345c81bf --- /dev/null +++ b/_sources/index.rst.txt @@ -0,0 +1,55 @@ +.. Example documentation master file, created by + sphinx-quickstart on Sat Sep 23 20:35:12 2023. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Welcome to Kati's Portfolio! +=================================== + +.. toctree:: + :maxdepth: 2 + :caption: Table of Contents: + +.. toctree:: + :maxdepth: 2 + :caption: About: + + speaker-board-and-organizer-photos.md + favorite-conference-snapshots.md + +.. toctree:: + :maxdepth: 2 + :caption: Annual Reviews: + + 2023-recap.md + 2020-year-in-review.md + +.. toctree:: + :maxdepth: 2 + :caption: My Craft: + + what-i-am-paying-attention-to-in-2024.md + reflections-on-stanford-code-in-place.md + +.. toctree:: + :maxdepth: 2 + :caption: DjangoCon US Talk Topic Inspiration Lists: + + djangocon-us-2024-topics-inspiration-list.md + djangocon-us-2023-topics-inspiration-list.md + +.. toctree:: + :maxdepth: 2 + :caption: Conferences Recaps: + + pycon-us-2024-recap.md + djangocon-us-2023-recap.md + pygotham-2019-recap.md + djangocon-us-2019-recap.md + pycon-us-2019-recap.md + +.. toctree:: + :maxdepth: 2 + :caption: Travel: + + los-angeles-2023.md diff --git a/_sources/los-angeles-2023.md.txt b/_sources/los-angeles-2023.md.txt new file mode 100644 index 00000000..55c8740b --- /dev/null +++ b/_sources/los-angeles-2023.md.txt @@ -0,0 +1,887 @@ +# Los Angeles 2023 + + + + + + + +Table of Contents +----------------- + +- [Intro](#intro) +- [My Top Picks](#my-top-picks) +- [Wednesday](#wednesday) + - [Travel Serendipity](#travel-serendipity) + - [Santa Monica Pier at Night](#santa-monica-pier-at-night) + - [North Italia](#north-italia) +- [Thursday](#thursday) + - [Blue Daisy](#blue-daisy) + - [Santa Monica and Venice Beaches](#santa-monica-and-venice-beaches) +- [Friday](#friday) + - [Warner Brothers Studio Tour](#warner-brothers-studio-tour) + - [Hollywood Walk of Fame, TCL Theatre, Hollywood Sign, Dolby Theater](#hollywood-walk-of-fame-tcl-theatre-hollywood-sign-dolby-theater) + - [Dolby Theater Tour](#dolby-theater-tour) + - [Santa Monica Beach at Sunset and Pier Burger](#santa-monica-beach-at-sunset-and-pier-burger) +- [Saturday](#saturday) + - [Republique](#republique) + - [Academy Museum of Motion Pictures](#academy-museum-of-motion-pictures) + - [Petersen Automotive Museum](#petersen-automotive-museum) +- [Sunday](#sunday) + - [The Getty Center](#the-getty-center) + - [Tacos 1986 and Santa Monica Beach at Sunset](#tacos-1986-and-santa-monica-beach-at-sunset) +- [Monday](#monday) + - [Republique](#id1) + - [The Grammy Museum](#the-grammy-museum) + - [The Cecil Hotel](#the-cecil-hotel) + - [Downtown Los Angeles](#downtown-los-angeles) + - [Los Angeles City Hall Observation Deck](#los-angeles-city-hall-observation-deck) + - [Bruno's Ristorante Italiano](#brunos-ristorante-italiano) +- [Tuesday](#tuesday) + - [Universal Theme Park](#universal-theme-park) + - [The Griffith Observatory](#the-griffith-observatory) + - [Comedy in English](#comedy-in-english) +- [Wednesday](#id2) + - [Hollywood Walk of Fame](#hollywood-walk-of-fame) + - [Celebrity Homes Bus Tour](#celebrity-homes-bus-tour) + - [Rodeo Drive](#rodeo-drive) + - [Via Alloro](#via-alloro) + - [Bruno's Ristorante Italiano](#brunos-ristorante-italiano-1) +- [Thursday](#id4) + - [Ice at Santa Monica](#ice-at-santa-monica) + - [Mel's Drive-In](#mel-s-drive-in) + - [End of Santa Monica Pier at Sunset](#end-of-santa-monica-pier-at-sunset) + - [Santa Monica Pier Carousel](#santa-monica-pier-carousel) + - [Santa Monica Promenade](#santa-monica-promenade) +- [Friday](#id5) + - [Back to Kansas for Christmas](#back-to-kansas-for-christmas) +- [Takeaways](#takeaways) +- [Warner Brothers Studio Tour versus Universal Studios Tour](#warner-brothers-studio-tour-versus-universal-studios-tour) + - [What Warner Brothers Had Going For It](#what-warner-brothers-had-going-for-it) + - [What Universal Studios Tour Had Going For It](#what-universal-studios-tour-had-going-for-it) + +## Intro + +I finished my work year with a successful presentation to my department (see my [2023 Recap](https://katherinemichel.github.io/portfolio/2023-recap.html) for a review of my year!). A few hours later, I arrived at LAX. With Santa Monica as my "home base," I spent 9 days seeing the city. It was the first non-business trip that I'd taken in years. I had a general idea of the things I wanted to do, but hadn't done much planning. I played it by ear, and it worked. + +## My Top Picks + +TL;DR + +Hollywood experience +* [Dolby Theater Tour](https://dolbytheatre.com/tours/tour-information/) +* [Warner Brothers Studio Tour](https://www.wbstudiotour.com/tickets/) +* [Universal Studios Tour](https://www.universalstudioshollywood.com/web/en/us/things-to-do/rides-and-attractions/the-world-famous-studio-tour) +* [Academy Museum of Motion Pictures](https://www.academymuseum.org/en) +* [Celebrity Homes Bus Tour](http://hollywoodbustours.com/) +* [Via Alloro](https://www.viaalloro.com/) + +Great views, artwork, and science +* [The Getty Center](https://www.getty.edu/visit/center/) +* [The Griffith Observatory](https://griffithobservatory.org/) + +Beach fun +* [Santa Monica](https://www.santamonica.com/things-to-do/santa-monica-beach/) and [Venice Beaches](https://www.visitveniceca.com/), [Santa Monica Pier](https://www.santamonicapier.org/) (day and night) + +Fascinating +* [Petersen Automotive Museum](petersen.org) + +Good food +* [Bruno's Ristorante Italiano](https://brunossantamonica.com/) +* [République](https://republiquela.com/) + +[**back to top**](#table-of-contents) + +## Wednesday + +### Travel Serendipity + +I've had a lot of what I call travel serendipity. My trip kicked off with some incredible entertainment business serendipity! + +Immediately upon arriving in Los Angeles, I had the good fortune to randomly meet award show producer Charnise Love Jones! She has worked on the Daytime Emmys, Children and Family Emmys, Grammys, BET Awards, Soultrain Awards, Stellar Awards, NAACP Image Awards, American Music Awards, and many other fun productions. Wow! + +We've connected on LinkedIn, and I can't wait to get to know her work better and follow her adventures! Check out her [Instagram](https://www.instagram.com/lovejonesproduction/) and [YouTube](https://www.youtube.com/@Lovejonesproductions/videos) channel. + +[**back to top**](#table-of-contents) + +### Santa Monica Pier at Night + +I arrived in Santa Monica after dark. I was staying about a block from the pier, so I walked there to get a good look at it at night. It was magical! + +![](los-angeles-2023-images/santa-monica-pier-at-night.jpg) +Santa Monica Pier at night + +![](los-angeles-2023-images/santa-monica-pier-at-night-pacific-park.jpg) +Pacific Park Amusement Park + +![](los-angeles-2023-images/santa-monica-pier-at-night-pacific-park-ferris-wheel.jpg) +Pacific Park ferris wheel overlooking the ocean waves... + +[Video](https://youtu.be/GP4Td4SUH0M?si=XDPxScs8KR0mg2fj) of walking along Santa Monica Pier + +[Video](https://youtu.be/_KTMAmlOzqQ?si=6b8YhK7_jpLKBhiN) of Santa Monica Pier looking east + +[Video](https://youtu.be/cnWdL9C4ucU?si=_5bCR2RdHMWjLTbO) of ferris wheel and roller coaster + +[Video](https://youtu.be/08xtEKQ8Yjg?si=oVrTxLtU4tAqe9FC) of north of the Santa Monica Pier + +[Video](https://youtu.be/53oLr76JxuY?si=W2jQtuxPaf7SNMy5) of south of the Santa Monica Pier + +[**back to top**](#table-of-contents) + +### North Italia + +I was looking for a convenient, but decent place to eat dinner. I stumbled upon [North Italia](https://www.northitalia.com/) while walking down the street. The food is handmade with the best ingredients, and it was good, but a bit high falutin' Italian for my taste. Later in the week, I discovered another Italian restaurant nearby called [Bruno's Ristorante Italiano](https://brunossantamonica.com/). North Italia did not compare to the simple, delicious authenticity of Bruno's. Bruno's perfectly hit the spot for me. Sorry, North Italia. + +![](los-angeles-2023-images/north-italia.jpg) +North Italia Crushed Meatball Ragu: beef meatball, porchetta, blistered onion, wild oregano, bucatini, pecorino + +[**back to top**](#table-of-contents) + +## Thursday + +### Blue Daisy + +On Thursday, I ate breakfast at [Blue Daisy](https://www.bluedaisycafe.com/brunch-santa-monica/). I picked it on the spur of the moment, because it was nearby and the reviews I read were positive. The staff were wonderful, but the food was underwhelming. + +I had 3 eggs scrambled with mushroom, which came with zucchini hash and a plain crepe with jam. + +![](los-angeles-2023-images/blue-daisy-breakfast.jpg) +Breakfast... + +I asked the waiter if the zucchini hash came from another culture. He laughed and said it's something the chef invented to make breakfast healthier. Sounds like an Los Angeles thing. I don't know if I want my breakfast to be that healthy. + +The best part of the meal was a delicious Turkish Latte ("creamy and a touch of sweetness"). + +![](los-angeles-2023-images/blue-daisy-latte.jpg) +Turkish latte... beautiful and yummy! + +[**back to top**](#table-of-contents) + +### Santa Monica and Venice Beaches + +Perhaps because I have spent most of my life in a landlocked state, when I arrive in a city on the coast, I can't wait to get to the ocean. + +On my first full day in Los Angeles, I walked from Santa Monica Pier to Venice Beach Pier via the boardwalk, then back to Santa Monica Pier via the ocean. + +The San Diego beaches that I've been to have been more breathtaking (south of La Jolla Cove) and more California-y (Pacific and Ocean Beaches Boardwalks), but it was great to be near the ocean again. + +![](los-angeles-2023-images/venice-beach-boardwalk.jpg) +Venice Beach Boardwalk + +![](los-angeles-2023-images/venice-beach-skateboarding-park.jpg) +Venice Beach Skateboard Park, near the Muscle Gym + + + +![](los-angeles-2023-images/venice-beach-pier.jpg) +Venice Beach Pier... love the sight of a sailboat! + +![](los-angeles-2023-images/venice-beach-waves-crashing-1.jpg) +Venice Beach waves crashing + +![](los-angeles-2023-images/venice-beach-waves-crashing-2.jpg) +Venice Beach waves crashing + +![](los-angeles-2023-images/venice-beach-santa-monica-pier.jpg) +Santa Monica Beach looked toward the pier + +![](los-angeles-2023-images/venice-beach-santa-monica-pier-sun.jpg) +Santa Monica Pier... the sun is going down. + +[Video](https://youtu.be/WtmDbIY2Ieo?si=Ceo0xQmuELsoQAQ) of birds flying around Santa Monica Beach + +[Video](https://youtu.be/KwIrQjfX-V4?si=4_Ry7O-1ObcdP_bx) of walking along Santa Monica Pier + +[Video](https://youtu.be/svqLyz8D2uM?si=_0ziKygwuCW4jcWS) of Venice Beach Boardwalk + +[Video](https://youtu.be/AUqmrRV7teE?si=ZBpTh3dFF_Y0ivTc) of Venice Beach Skatepark + +[Video](https://youtu.be/TLsb7qy8kyY?si=EOogWOqHwtV2SGFw) of a bird flying above Venice Beach Pier + +[Video](https://youtu.be/cJEZFFnFlng?si=rQCBZOJ3st627zSB) of a sailboat at Venice Beach Pier + +[Video](https://youtu.be/MAdhUKSJbbg?si=E43wzKHu5W-n3QDG) of Venice Beach north of the pier + +[Video](https://youtu.be/aZfZ09UInL8?si=V_2mktPdKua1GsRd) of Venice Beach south of the pier + +[Video](https://youtu.be/qO44Inr0C48?si=DVb-wguV6vt81JGV) of Venice Beach sand pipers + +[Video](https://youtu.be/oFwZHgMXFIc?si=4F8TWCy2DFphuYnd) of good waves at Venice/Santa Monica Beaches + +[Video](https://youtu.be/kQFnozP3w_I?si=YTc9aYrPt0YRq4ez) of a dog running along Santa Monica Beach + +[Video](https://youtu.be/WFSL7NGoi8w?si=oZu2eSMt4OWFLY4D) of Santa Monica Beach with a view of the pier + +[Video](https://youtu.be/Fzv0tZ1zzQU?si=AmMmtc6kuHH13b7N) of Santa Monica Pier at sunset + +[**back to top**](#table-of-contents) + +## Friday + +### Warner Brothers Studio Tour + +See the end of this blog post for a comparison between Warner Brothers Studio Tour and Universal Studios Tour. + +After some quick research, I settled on [Warner Brothers Studio Tour](https://www.wbstudiotour.com/tour/studio/) as a top priority. It was an incredible, in-depth experience. + +Because I hadn't read up on the details of the tour ahead of time, I had no idea what I would see. + +Having my photo taken on the real Friends was a really fun surprise and gave me a feeling of childlike delight. What a great way to kick off my Hollywood sightseeing. + +In addition to a tour of city and town backlots, the Friends soundstage, and a photo in front of the Friends fountain, there were multiple large exhibits packed full of costumes, props, vehicles, and interactive experiences from Superman, Wonder Woman, Justice League, Batman, Game of Thrones, Harry Potter, Gilmore Girls, Big Bang Theory, My Fair Lady, Casablanca, and many others. + +![](los-angeles-2023-images/warner-brothers-friends-set.jpg) +Me on the real Friends set... I don't usually buy these, but couldn't resist this time! + +![](los-angeles-2023-images/warner-brothers-friends-couch.jpg) +Me sitting in front of the real Friends fountain... the sofa looks soft, but was actually hard as a rock. The fountain was also used in Wonder Woman (Lynda Carter leapt over it) and the Bewitched pilot. + +![](los-angeles-2023-images/warner-brothers-community-backlot.jpg) +Town backlot with gazebo + +![](los-angeles-2023-images/warner-brothers-harry-potter-spells.jpg) +Harry Potter spells + +![](los-angeles-2023-images/warner-brothers-mr-freeze-joker-oz-riddler-costumes.jpg) +Mr. Freeze, Joker, Oz, and Riddler costumes in front of the Arkham Asylum gates + +![](los-angeles-2023-images/warner-brothers-awards.jpg) +Warner Brothers Studio awards + +[Video](https://youtu.be/4aTxOa3chcs?si=r4nBfIcyBcqmhqzs) of Friends set + +[Video](https://youtu.be/wNWcuESAZDE?si=_4TjbCbo0CUcXOPE) of the Friends fountain + +[Video](https://youtu.be/iL-cWXCyAsE?si=vg80ZuUTMV5A59Vg) of casting spells in Wizarding World + +[**back to top**](#table-of-contents) + +### Hollywood Walk of Fame, TCL Theatre, Hollywood Sign, Dolby Theater + +After the Warner Brothers Studio Tour, I traveled over to Hollywood Boulevard and walked around. + +![](los-angeles-2023-images/hollywood-boulevard-sidewalk.jpg) +Hollywood Boulevard + +![](los-angeles-2023-images/hollywood-boulevard-tcl-chinese-theater.jpg) +[TCL Chinese Theater](https://www.tclchinesetheatres.com/) + +![](los-angeles-2023-images/hollywood-boulevard-michael-jackson-handprints.jpg) +Michael Jackson's handprints, glove prints, and footprints + +![](los-angeles-2023-images/hollywood-boulevard-hollywood-sign.jpg) +Hollywood Sign as seen from the upper floor of [Ovation Shopping Center](https://www.ovationhollywood.com/). + +![](los-angeles-2023-images/dolby-theater-walkway-1.jpg) +On Oscar night, Hollywood Boulevard becomes a red carpet walkway for the stars. What is normally the entrance to the Ovation Shopping Center will become a grand, elaborately decorated hall that the Academy Awards Ceremony attendees will walk down. + +![](los-angeles-2023-images/dolby-theater-walkway-2.jpg) +The steps leading up to the [Dolby Theater Tour](https://dolbytheatre.com/), where the Academy Awards Ceremony takes place + +[Video](https://youtu.be/r-C5N_mtsb8?si=DD_4C_2tPkIu2ko8) walking into Ovation Shopping Center up to Dolby Theater + +[Video](https://youtu.be/ihaYNCC3sU4?si=9IS5N8DZwYQ2lXkD) walking around Hollywood Boulevard + +[**back to top**](#table-of-contents) + +### Dolby Theater Tour + +Afterward, I took the [Dolby Theater Tour](https://dolbytheatre.com/tours/tour-information/). I really enjoyed it. It was one of the most fun things that I've ever done. + +My tour guide was a long-time Academy Awards Ceremony crew member. We walked in the footsteps of the A-list stars into the theater, then backstage and on stage where we had a view of the audience from where the presenters stand. We exited stage left, then took the red carpet "Winner's Walk" that only Academy Award winners and tour participants get to take. All the while, our tour guide gave some inside stories from her years of working at the ceremony. + +![](los-angeles-2023-images/dolby-theater-stage.jpg) +Me standing where the presenters stand with a view of the audience behind me... the photos on chairs represent the A-list guests who sat there recently. + +![](los-angeles-2023-images/dolby-theater-winners-walk.jpg) +Having exited stage left just like the Academy Award winners do, we are walking in their footsteps down the "Winner's Walk." + +![](los-angeles-2023-images/dolby-theater-winners-walk-2.jpg) +This red carpet leads the winners to their press interview. + +[**back to top**](#table-of-contents) + +### Santa Monica Beach at Sunset and Pier Burger + +I made it back to Santa Monica for sunset at the beach. + +![](los-angeles-2023-images/santa-monica-beach-sunset-1.jpg) +The view from Ocean Avenue + +![](los-angeles-2023-images/santa-monica-beach-sunset-2.jpg) +Walking from the pier down to Santa Monica Beach + +![](los-angeles-2023-images/santa-monica-beach-sunset-3.jpg) +Santa Monica Beach sunset + +![](los-angeles-2023-images/santa-monica-pier-pier-burger.jpg) +Tourist be touristing... I gave in and ate an overpriced hamburger, fries, and strawberry milkshake at [Pier Burger](https://www.pierburger.com/). + +[Video](https://youtu.be/tYtLZPSjdJQ?si=YTT-1avfxxbQuDxR) of walking to the Santa Monica Pier at sunset + +[Video](https://youtu.be/y_R55NwD5PA?si=FTA12rl3sTd4p1s6) of Santa Monica Beach at sunset + +[**back to top**](#table-of-contents) + +## Saturday + +### Republique + +I started Saturday by eating breakfast at a bakery/café called [République](https://republiquela.com/) in a building that Charlie Chaplin had built. République is owned by two chefs awarded a Michelin Star and a James Beards award and one of whom worked with Alain Ducasse of the Dorchester Collection, my old stomping grounds. A foodie colleague and friend Wooyong Ee recommended it. It was excellent. + +Much of the building's original architecture is intact, as seen in these [photos](https://martinturnbull.com/2020/06/02/charlie-chaplins-italian-villa-inspired-building-at-624-s-la-brea-ave-los-angeles-circa-late-1920s/). The restaurant floor appears to be in what was an open courtyard, with the arches still in existence. Imagine walking the same grounds as Charlie Chaplin. Mind blowing. + +![](los-angeles-2023-images/republique-bakery.jpg) +Brownie, pumpkin spice danish, pain au chocolat, ham croissant + +![](los-angeles-2023-images/republique-breakfast-1.jpg) +Regular breakfast: bacon steak, fingerling potatoes, baguette, french butter, jam, eggs over hard + +![](los-angeles-2023-images/republique-courtyard.jpg) +République courtyard... a good view of the front of the original Charlie Chaplin building + +![](los-angeles-2023-images/republique-front.jpg) +République front + +[**back to top**](#table-of-contents) + +### Academy Museum of Motion Pictures + +[The Academy Museum of Motion Pictures](https://www.academymuseum.org/en) had an extensive collection of photos, costumes, props, artifacts, and equipment that explored the various types of craft that go into movie making. + +One large exhibit was devoted to the creation of The Godfather. + +The museum also had a number of famous movie costumes and puppets. I particularly enjoyed the The Dark Crystal puppets. I hadn't thought about that movie since I watched it as a child and was instantly transported back to childhood. + +![](los-angeles-2023-images/academy-museum-godfather-office.jpg) +The Godfather office + +![](los-angeles-2023-images/academy-museum-horse-head.jpg) +The Godfather rehearsal horse head... not something you see everyday! + +![](los-angeles-2023-images/academy-museum-alien.jpg) +Alien xenomorph + +![](los-angeles-2023-images/academy-museum-the-dark-crystal-skeksis.jpg) +The Dark Crystal's Skeksis + +![](los-angeles-2023-images/academy-museum-terminator.jpg) +Terminator 2: Judgement Day animatronic... the team that created this won an Academy Award for Visual Effects + +![](los-angeles-2023-images/academy-museum-statue-room.jpg) +Academy Award statues room + +[Video](https://youtu.be/BM8AMYP3mL0?si=Jpd-JnuRdGW-eT4u) of the Academy Award statues room + +[**back to top**](#table-of-contents) + +### Petersen Automotive Museum + +Even though I am far from an expert in cars, with the [Petersen Automotive Museum](https://www.petersen.org/) being just across the street from the Academy Museum of Motion pictures, I decided to give it a try. + +A Lyft driver later pointed out to me that Notorious B.I.G. was shot at the intersection between the two museums. It's incredible how many famous landmarks are "hiding in plain sight" in Los Angeles. + +As suggested, I started on the third floor of the museum and worked my way down. The first floor was almost completely devoted to Tesla. + +I regret not having added the basement "vault" tour to my ticket. It was more than I could do at the time. Perhaps I'll go back sometime. + +While I am sure there were more technically impressive classic cars there, the many Hollywood cars in the collection caught my eye. + +![](los-angeles-2023-images/petersen-thelma-and-louise-car-description.jpg) +Thelma and Louise Car + +![](los-angeles-2023-images/petersen-thelma-and-louise-car-1.jpg) +Thelma and Louise Car + +![](los-angeles-2023-images/petersen-thelma-and-louise-car-2.jpg) +Thelma and Louise Car + +![](los-angeles-2023-images/petersen-back-to-the-future.jpg) +Back to the Future DeLorean + +![](los-angeles-2023-images/petersen-back-to-the-future-close-up.jpg) +Back to the Future flux capacitor! + +[**back to top**](#table-of-contents) + +## Sunday + +### The Getty Center + +[The Getty Center](https://www.getty.edu/visit/center/) experience was well worth the trip. The architecture, art, and views were all simply jaw dropping. + +![](los-angeles-2023-images/the-getty-center-entrance-hall.jpg) +The entrance hall + +![](los-angeles-2023-images/the-getty-irises.jpg) +One of the highlights of the collection: [Vincent Van Gogh's Irises](https://www.getty.edu/art/collection/object/103JNH) + +![](los-angeles-2023-images/the-getty-central-garden.jpg) +[Central Garden](https://www.getty.edu/visit/center/top-things-to-do/gardens/): a garden with an incredible view. I almost overlooked it. Fortunately, I came back a second time and ventured to the other side of the garden. + +![](los-angeles-2023-images/the-getty-center-fountain.jpg) +Example of the beautiful architecture + +Although I enjoyed the view of Los Angeles from the main Getty Center terrace, the consensus from locals was that the view from the The Griffith Observatory is much better. + +[Video](https://youtu.be/vngC0TWpU0Q?si=nnghFglziVyW2WwK) of The Getty Center main terrace + +[Video](https://youtu.be/1-OcUMCII3o?si=luk7utrXz2LnaQff) of the Central Garden + +[Video](https://youtu.be/x8CULebm0bY?si=fIBpoVIoVCZCmAth) walking through Central Garden + +[Video](https://youtu.be/ZzHO8MQLE9U?si=ADCgfmAaY8KrLPvw) of a Getty Center fountain + +[Video](https://youtu.be/TwIPtk2IA9A?si=ub_cBZedXZhjluZQ) of the ride down from The Getty Center + +[**back to top**](#table-of-contents) + +### Tacos 1986 and Santa Monica Beach at Sunset + +I grabbed some tacos and hurried to the Santa Monica Beach for some incredible sunset. + +![](los-angeles-2023-images/santa-monica-pier-tacos-1986-and-sunset-walking-to-the-pier.jpg) +Walking to the pier + +![](los-angeles-2023-images/santa-monica-pier-tacos-1986-and-sunset-on-the-beach.jpg) +Tacos on the beach + +![](los-angeles-2023-images/santa-monica-pier-tacos-1986-and-sunset-ocean.jpg) +Sunset across the ocean + +![](los-angeles-2023-images/santa-monica-pier-tacos-1986-and-sunset-pier.jpg) +The pier + +[Video](https://youtu.be/f1WSSYzchX0?si=puikvTz5-5LNqe-N) of walking to Santa Monica Pier at sunset + +[Video](https://youtu.be/hgm-Dc5btlA?si=rZATV0HqXm3hNext) of the Santa Monica beach at sunset + +[**back to top**](#table-of-contents) + +## Monday + +### Republique + +On my way to the Grammy Museum, I stopped at [République](https://republiquela.com/) again for breakfast. I regretted that I hadn't ordered Shrimp and Grits (anson mills grits, calabrian chilies, pork belly sausage, hooks cheddar, fried egg) on Saturday, then realized that dish is only served at weekend brunch and wasn't available on a Monday. I will have to go back sometime and try it. + +I did have some absolutely incredible tasting granola. It was beautifully presented, and although some of the fruit was unfamiliar to me, it was bursting with flavor, and definitely in the running for the most delicious breakfast that I have ever eaten. + +![](los-angeles-2023-images/republique-breakfast-2.jpg) +Granola: straus organic yogurt, farmer’s market fruit, wildflower honey + +[**back to top**](#table-of-contents) + +### The Grammy Museum + +[The Grammy Museum](https://grammymuseum.org/) was small, but fun. + +As suggested, I started on the third floor with the temporary Hip-Hop America exhibit. The exhibit was packed with memorabilia from Tupak Shakur, Flava Flav, Shock G., LL Cool J, Run-DMC, Grandmaster Flash, Wyclef Jean, Eminem, MCLite, Ceelo Green, Chuck D, and among many others. + +My favorite part of the museum was the impressive collection of Michael Jackson memorabilia on the second floor, including an autographed Thriller jacket. + +The museum also had temporary Shakira and The Roxy exhibits. + +![](los-angeles-2023-images/grammy-museum-michael-jackson-collection.jpg) +A portion of the Michael Jackson collection, including autographed Thriller jacket + +![](los-angeles-2023-images/grammy-museum-michael-jackson-nomination.jpg) +Thriller Album of the Year nomination + +![](los-angeles-2023-images/grammy-museum-costumes.jpg) +Grammy outfits worn by Taylor Swift, Harry Styles, Shania Twain, Lizzo, Olivia Rodrigo, and Samara Joy + +[**back to top**](#table-of-contents) + +### The Cecil Hotel + +I have been fascinated by true crime going back to childhood, when I started watching [48 Hours](https://www.cbsnews.com/48-hours/full-episodes/), my all-time favorite show. + +While I was walking from the Grammy Museum to the to City Hall Observatory Deck, I stopped at Hotel Cecil along the way. + +Hotel Cecil (a.k.a "Hotel Death") was the subject of a Netflix documentary called [Crime Scene: The Vanishing at the Cecil Hotel](https://www.netflix.com/title/81183727). The documentary focused on the case of [Elisa Lam](https://en.wikipedia.org/wiki/List_of_deaths_and_violence_at_the_Cecil_Hotel), a Canadian student suffering from bi-polar disease who drowned in a water tank on the roof. Members of the public crowd-sourced an investigation into what happened to Elisa. The hotel has a long history of murder, suicide, and unexplained deaths. In a strange twist, Richard Ramirez, a serial killer profiled in another Netflix documentary [Night Stalker](https://www.netflix.com/title/81025701), stayed at Hotel Cecil. + +![](los-angeles-2023-images/hotel-cecil-1.jpg) +The hotel is shuttered with a "private property" sign on one door. There were a few people nearby. Not sure if they were workers or loitering. + +![](los-angeles-2023-images/hotel-cecil-2.jpg) +The infamous water tanks where Elisa Lam drowned... it was speculated that she might have taken the stairs on the front of the hotel to the roof. + +[Video](https://youtu.be/4Jyj94ut0Mk?si=Gd6toD3jRr4On6tR) of the Hotel Cecil + +[**back to top**](#table-of-contents) + +### Downtown Los Angeles + +While I was walking from the Grammy Museum to the to City Hall Observatory Deck, I walked to the edge of [Skid Row](https://en.wikipedia.org/wiki/Skid_Row,_Los_Angeles). Having heard of Skid Row for years, I wanted to see it for myself. I walked by barbed wire, sidewalk tent encampments, homeless, and a mission providing social services. + +Strangely, Skid Row is next to the Toy and Fashion Districts. I can't get over the extreme opulence and poverty co-existing across Los Angeles. + +![](los-angeles-2023-images/downtown-la-skid-row.jpg) +The homelessness in Los Angeles was a sad reality. A local told me it increased greatly due to the pandemic. + +[**back to top**](#table-of-contents) + +### Los Angeles City Hall Observation Deck + +I heard that the Los Angeles City Hall Observation Deck is one of the city's best kept secrets, so I had to go. The building architecture was more fancy-schmancy than I expected. The observation deck triggered my fear of heights, so I didn't stay long out there, but it was a great view! + +![](los-angeles-2023-images/city-hall-building.jpg) +Fancy schmancy + +![](los-angeles-2023-images/city-hall-riding-in-style.jpg) +Riding in style + +![](los-angeles-2023-images/city-hall-banquet-room.jpg) +This banquet room has doors that lead out to the observation deck. + +![](los-angeles-2023-images/city-hall-observation-deck-view-explainer.jpg) +A view from one of the four sides + +![](los-angeles-2023-images/city-hall-observation-deck-view.jpg) +A view from one of the four sides + +[Video]([https://youtu.be/mGme3_W_BQc?si=xZ_PfOAzYDDktxUF) of the view from the City Hall Observation Deck + +[**back to top**](#table-of-contents) + +### Bruno's Ristorante Italiano + +After a few failed Google searches for restaurants in the area, I stumbled upon the absolute gem [Bruno's Ristorante Italiano](https://brunossantamonica.com/) + +Oh boy, I wish I lived nearby so that I could eat there regularly. The fettucchine alfredo was the best that I've ever tasted. It arrived at the table fresh, hot, and authentic, with a generous half loaf of bread. I sat on the patio. The weather was perfect with a view of the pier. The waitstaff was kind and efficient. I returned before the trip was over. + +![](los-angeles-2023-images/brunos-night-1.jpg) +Fettuccine Alfredo with chicken... so good! + +[**back to top**](#table-of-contents) + +## Tuesday + +### Universal Theme Park + +Although I wanted to take the [Universal Studios Tour](https://www.universalstudioshollywood.com/web/en/us/things-to-do/rides-and-attractions/the-world-famous-studio-tour), I was irked that I would have to buy an entire [Universal Theme Park](https://www.universalstudioshollywood.com/web/en/us) ticket to take it. After multiple people told me how fun the theme park is including a Lyft driver who said it's the best, because you are "in the movies," I decided to go. I know what she means now that I've experienced the incredible, immersive, 3-D experiences that included having water splashed on you. Anyhow, it's not everyday that you have the chance to visit a theme park like that. + +I guess I got my money's worth for the studio tour alone. I went twice... riding on either side of the cart to get a good look at everything. + +Having been an [Alfred Hitchcock](https://en.wikipedia.org/wiki/Alfred_Hitchcock) fan since I was a kid (I had probably read every [Alfred Hitchcock Presents](https://en.wikipedia.org/wiki/Alfred_Hitchcock_Presents) book at the Fredonia Public Library while I was still in grade school), I really enjoyed seeing the Bates Motel and mother's house from [Psycho](https://en.wikipedia.org/wiki/Psycho_(1960_film)). + +I walked most of the park. It was fun, but geared more toward kids. + +![](los-angeles-2023-images/universal-citywalk.jpg) +[Universal CityWalk](https://www.universalstudioshollywood.com/web/en/us/things-to-do/lands/citywalk) + +![](los-angeles-2023-images/universal-me-and-max.jpg) +Finally spotted a celebrity and even got a pic. Here I am with "Max" from The Grinch. + +![](los-angeles-2023-images/universal-psycho-bates-motel.jpg) +Bates Motel from Psycho + +![](los-angeles-2023-images/universal-psycho-house.jpg) +Mother's house from Psycho + +[Video](https://youtu.be/9uv5BZtSHNA?si=R2pd8kGSKy9brRnG) of the Universal sign + +[Video](https://youtu.be/d3wERBCZHEM?si=YHK-vpGaG7TKclwF) of 3-D King King experience, designed by Peter Jackson and team! + +[Video](https://youtu.be/evZHAcfSnqw?si=B279b284H-g0lZDn) of the Jaws experience! + +[Video](https://youtu.be/VVTMQafABCA?si=Q2x-n0jO9UIFyq1J) of Norman Bates + +[Video](https://youtu.be/402GcUXZ01c?si=HJ51z3y9jCnwu-Ti) of "Wisteria Lane" + +[Video](https://youtu.be/r5AzrhSoNRo?si=NIepFiPXdL0puQB2) of a simulated flood + + + +[**back to top**](#table-of-contents) + +### The Griffith Observatory + +Although [The Griffith Observatory](https://griffithobservatory.org/) museum was much smaller than I expected, the building was beautiful and had an amazing view. + +![](los-angeles-2023-images/the-griffith-observatory-entrance-hall.jpg) +Entrance hall which includes a [Foucault Pendulum](https://griffithobservatory.org/exhibits/w-m-keck-foundation-central-rotunda/foucault-pendulum/) + +![](los-angeles-2023-images/the-griffith-observatory-view.jpg) +What a view... + +![](los-angeles-2023-images/the-griffith-observatory-architecture.jpg) +Beautiful architecture... + +Multiple Lyft drivers told me the view is "spectacular" after dark, but frankly, I was too tired to stay that long. I will go back sometime. + +[Video](https://youtu.be/WxTooLaosq4?si=ZJENLG-pFEtw86m8) riding through the Hollywood Hills to The Griffith Observatory + +[Video](https://youtu.be/hlTgWcAXSXk?si=075mQ_nmLtIOpH2g) of the view around The Griffith Observatory + +[Video](https://youtu.be/_nZQzYq1Pnc?si=U7bHzHmFENE5ZAZP) of the Foucault Pendulum + +[**back to top**](#table-of-contents) + +### Comedy in English + +That night, I attended a comedy show for the first time. It was called [Comedy in English](https://www.facebook.com/Comineng/) and features comedians who have appeared on The Tonight Show, Conan, Comedy Central, and Netflix. + +There were awkward, confrontational jokes, excruciating silences, and big laughs. What a raw exercise! + +![](los-angeles-2023-images/comedy-show.jpg) +The comedian before him was scream-y... this one was quiet and thoughtful. I thought he'd bomb, but he didn't! + +[**back to top**](#table-of-contents) + +## Wednesday + +### Hollywood Walk of Fame + +Before the celebrity homes bus tour, I walked around Hollywood Boulevard again. I attempted to go to the [Chaplin-Keaton-Lloyd Alley](https://www.atlasobscura.com/places/chaplin-keaton-lloyd-alley) which I read about on the wonderful Atlas Obscura website, but it was closed off. + +![](los-angeles-2023-images/alfred-hitchcock-star.jpg) +Alfred Hitchcock's star + +![](los-angeles-2023-images/rebel-moon-premier.jpg) +Hollywood Boulevard was closed to cars due to the [Rebel Moon](https://en.wikipedia.org/wiki/Rebel_Moon) Premier + +[Video](https://youtu.be/owiHq5D2QRU?si=60DeIfk0kEvQhF4b) of the Rebel Moon Premier set up + +[**back to top**](#table-of-contents) + +### Celebrity Homes Bus Tour + +I went on a [Celebrity Homes Bus Tour](http://hollywoodbustours.com/), and it was an absolute blast. I’ve never taken a bus tour like it before. I loved every minute. The tour guide Mark was so fun and knew all of the famous spots. We drove all around the Hollywood Hills and Bel Air looking at celebrity homes, through Beverly Hills, Rodeo Drive, West Hollywood, Sunset Strip, and Hollywood. Although I couldn't verify the authenticity of every home afterward, I believe that Mark knew his stuff. + +![](los-angeles-2023-images/celebrity-homes-bus-tour-mark.jpg) +Our tour guide Mark + +![](los-angeles-2023-images/celebrity-homes-bus-tour-pretty-woman-balcony.jpg) +Pretty Woman balcony. Las Palmas Hotel, 1738 N Las Palmas Ave, Los Angeles, CA 90028 + +![](los-angeles-2023-images/celebrity-homes-bus-tour-jack-nicholson-home.jpg) +Jack Nicholson's house... that's a tennis court on stilts! + +![](los-angeles-2023-images/celebrity-home-bus-tour-leonardo-dicaprio.jpg) +Leonardo DiCaprio's house + +[Video](https://youtu.be/CetaKXxeulU?si=-wciRXebAL2qQ9uP) of bus stopping for Hollywood Sign + +[Video](https://youtu.be/52_T3K6Fc7c?si=DuYZs3tEoSCWRRSa) driving past homes in Beverly Hills + +[Video](https://youtu.be/idbC9zhvkxk?si=yWPyfS_X_hJY86N6) of Rodeo Drive, part 1 + +[Video](https://youtu.be/m5H2epDZf4Y?si=e9AJ9xj-U9jtIRVL) of Rodeo Drive, part 2 + +[**back to top**](#table-of-contents) + +### Rodeo Drive + +After the tour ended, I went back to Rodeo Drive and walked down the entire street taking pics. + +![](los-angeles-2023-images/celebrity-homes-bus-tour-dior.jpg) +Dior + +![](los-angeles-2023-images/rodeo-drive-valentino.jpg) +Valentino + +![](los-angeles-2023-images/rodeo-drive-harry-winston.jpg) +Harry Winston + +[Video](https://youtu.be/aPwa4OlnCP0?si=P2X4uJ25YaVcFLYy) of Rodeo Drive Giorgio Armani storefront + +[**back to top**](#table-of-contents) + +### Via Alloro + +While I was on the celebrity home bus tour, we drove around Beverly Hills. As we drove past a restauraunt named [Via Alloro](https://www.viaalloro.com/) just off of Rodeo Drive, the tour guide said it's a major celebrity hotspot and that he'd seen Steven Spielberg there, among others. Someone on the bus asked if you had to be dressed up to go in. The tour guide said no, and that he'd had passengers literally call while on the bus and make a reservation. + +After taking pics on Rodeo Drive, I decided to eat at Via Alloro. I knew if I didn't, I'd regret that I hadn't taken the opportunity to "rub shoulders" with the stars. + +The prices were surprisingly reasonable and the food was delicious. It felt like a surprisingly normal experience. The waiter told me that they do have "too many" celebs around. Sometimes, everywhere you look. A quick [google search](https://www.google.com/search?q=via+alloro+daily+mail&sca_esv=595179528&sxsrf=AM9HkKl7xam2HHlNbSzt-XLzlojjw9_Jug:1704229408712&source=lnms&sa=X&ved=2ahUKEwjvmpakzb-DAxWpkmoFHQsSDt0Q0pQJegQIBhAC&biw=1440&bih=699&dpr=2#ip=1) reveals some of the many celebs. + +I had the Fettuccini Boscaiola. Having never heard of this dish, I wasn't quite sure what it would be like, but I thought it sounded good. It was delicious! + +![](los-angeles-2023-images/via-alloro.jpg) +Fettuccini Boscaiola: homemade fettuccini pasta with meat sauce, cream, green peas, mushrooms for $26.50 + +[**back to top**](#table-of-contents) + +### Bruno's Ristorante Italiano + +That night, I couldn't resist returning to [Bruno's Ristorante Italiano](https://brunossantamonica.com/) for another meal. It was another hit. + +![](los-angeles-2023-images/brunos-night-2.jpg) +Spaghetti with meat sauce + +I'll be back. + +[**back to top**](#table-of-contents) + +## Thursday + +### Ice at Santa Monica + +If I hadn't already done enough... I went ice skating for the first time! + +I went to [Ice at Santa Monica](https://iceatsantamonica.com/). + +It was fun, and I skated for a good 30 minutes, but when another skater wiped out badly, I decided that I'd pushed my luck long enough and stopped. The rink workers said the skates weren't great anyway, because they provided very little support. Nevertheless, I'm glad I tried it, and perhaps I'll try again sometime. + +![](los-angeles-2023-images/ice-skating.jpg) +Santa Monica's Ice skating rink + +[Video](https://youtu.be/udvcou-cgV0?si=NXMn2PaAy2Vt917-) of ice skating + +[**back to top**](#table-of-contents) + +### Mel's Drive-In + +I saw a [Mel's Drive-in](https://melsdrive-in.com/) at Universal Studios Theme Park and another one just off Hollywood Boulevard. Because I kept hearing about it so much, I decided to eat at one in Santa Monica. I later realized that I had Mel's Drive-in mixed up with Mel's Diner. Mel's Drive-in was made famous by the movie [American Graffiti](https://melsdrive-in.com/about/#story). [Mel's Diner](https://www.alicehyatt.com/) was a television show. Haha. Nevertheless, the chocolate milkshake was the best that I've ever had. + +![](los-angeles-2023-images/mels-drive-in-counter.jpg) +Mel's Drive-in counter + +![](los-angeles-2023-images/mels-drive-in-milkshake.jpg) +The best chocolate milkshake that I've ever had. + +[Video](https://youtu.be/jTq31Q2034Q?si=NsgiEQ77am7aedDf) at the counter in Mel's Drive-in + +[**back to top**](#table-of-contents) + +### End of Santa Monica Pier at Sunset + +I made it back to Santa Monica Beach for one last sunset. It was a doozy. + +![](los-angeles-2023-images/santa-monica-pier-sunset-view-to-the-right.jpg) +Ocean Avenue + +![](los-angeles-2023-images/santa-monica-pier-sunset-cityscape.jpg) +Love the strange vintage look of this beach landscape. It was facing the sunset. + +![](los-angeles-2023-images/santa-monica-pier-sunset-pier.jpg) +The sun setting beyond the end of the pier + + + +![](los-angeles-2023-images/santa-monica-pier-sunset-steps.jpg) +Venturing to the end of the pier for sunset... + +![](los-angeles-2023-images/santa-monica-pier-sunset-end.jpg) +The rippling waves were like abstract art... + +![](los-angeles-2023-images/santa-monica-pier-sunset-end-of-pier.jpg) +The end of the pier... wow! + +![](los-angeles-2023-images/santa-monica-pier-cityscape-pink.jpg) +Pink cityscape + +![](los-angeles-2023-images/santa-monica-pier-sunset-people.jpg) +People watching + +[Video](https://youtu.be/dPPWp-k3kIE?si=mELmyVOv6elfcVWr) of Santa Monica Pier at sunset + +[Video](https://youtu.be/NK2FCOE9ZGA?si=dJTLWqB0KCtadn7V) of Santa Monica Pier at sunset + +[Video](https://youtu.be/KxvcWh8gzg4?si=kVukmFdxZy3GXXXA) of the end of the pier at sunset + +[Video](https://youtu.be/bFZlSN-wjWg?si=KRM_pPzfLflQLAJX) of Santa Monica Beach at sunset + +[Video](https://youtu.be/xyXs-FP-3n4?si=UgdO0TWjZ5fcvAYR) of ferris wheel with Santa Claus + +[**back to top**](#table-of-contents) + +### Santa Monica Pier Carousel + +![](los-angeles-2023-images/santa-monica-pier-sunset-carousel.jpg) +Santa Monica Pier Carousel... Paul Newman worked there in the Sting. I rode it! + +[Video](https://youtu.be/TVL2gUfgNGk?si=CHgmEYUToBc9Eerr) riding Paul Newman's carousel :) + +[**back to top**](#table-of-contents) + +### Santa Monica Promenade + +![](los-angeles-2023-images/santa-monica-promenade-1.jpg) +Christmas decorations + +![](los-angeles-2023-images/santa-monica-promenade-2.jpg) +Christmas decorations + +[**back to top**](#table-of-contents) + +## Friday + +### Back to Kansas for Christmas + +Bye bye, LA… + +![](los-angeles-2023-images/bye-la.jpg) +Santa Monica, Venice, and Playa Del Rey Beaches, I believe + +I made it home from Los Angeles with one last momento: bronchitis. I believe it was caused by the smog. Walking for miles over nine days and riding around in an open air bus for two hours couldn't have helped. + +[**back to top**](#table-of-contents) + +## Takeaways + +I love San Diego's thriving Little Italy. I love the plaza, with its beautiful, flowing fountain, live music, open air dining, and great restaurants surrounding it. I love the sight and sound of people enjoying the good things in life. I thought Santa Monica would be like this, but it wasn't. I was shocked by the isolated, distributed feeling of Los Angeles. I did not feel a real sense of community anywhere. + +Never have I been to a place where there is so much poverty and opulence co-existing. Never have I been to a place where there is so much pretending. People pretending by living above their means. The entertainment industry is pretending too. The things that look magical on screen look more ordinary in real life than I expected. + +I'm not completely sure that I liked Los Angeles... yet, I can't wait to go back. Haha. + +For one thing, I'd like to go back for the food. I learned from my friend Wooyong that I should research the food before I arrive. Next time, I want to go to the great restaurants, not just restaurants that I find on the spur of the moment. + +Things to do next time: +* Plan in advance to go to great restaurants +* Take the Paramount Studio Tour (it was one too many studio tours for this trip) +* Go to The Griffith Observatory at night +* Take the scenic Coast Starlight train +* Visit Redondo Beach and Santa Barbara + +[**back to top**](#table-of-contents) + +## Warner Brothers Studio Tour versus Universal Studios Tour + +The Warner Brothers tour guides immediately established their tour as "better" than Universal's. Although it was lighthearted banter, I did detect a real hint of competition. + +### What Warner Brothers Had Going For It + +The Warner Brothers tour was a personalized, small group experience. At the start of the tour, the tour guide asked us which Warner Brothers shows or movies we were fans of so that the tour could be tailored to our interests. During the guided part of the tour, we were all on one cart in close proximity to the tour guide and could ask questions as we went. We get off several times to tour city lots, a sound stage, residential street, and house. + +There were multiple photo ops, including the Friends set, Big Bang Theory set, and Friends fountain. + +Before and after the guided part of the tour, we had the opportunity to walk at our own pace through exhibits packed with incredible costumes, props, and immersive experiences. + +I spent 3 hours on the Warner Brothers tour. + +[**back to top**](#table-of-contents) + +### What Universal Studios Tour Had Going For It + +In contrast, the Universal Studios tour consisted of one large group riding on a group of connected carts with a pre-recorded commentary by Jimmy Fallon. Although tour guides had the freedom to provide their own additional commentary, group members did not have the opportunity to ask questions or get off the cart to take a closer look. + +However, the Universal Studios tour did include some very iconic backlots, and nothing at Warner Brothers compared to Universal's immersive, 3-D experiences. + +I spent approximately 45 minutes on the Universal Studios Tour. + +[**back to top**](#table-of-contents) diff --git a/_sources/pinax-release-tutorial.md.txt b/_sources/pinax-release-tutorial.md.txt new file mode 100644 index 00000000..779321b8 --- /dev/null +++ b/_sources/pinax-release-tutorial.md.txt @@ -0,0 +1,243 @@ +# Pinax Release Tutorial + +Pinax has been a popular group of projects, apps, and themes for around 15 years and still has many users. + +A request was made recently to add support for Django 4.0 and 4.1. I decided it's time to create a new Pinax release plan. I've also created this tutorial to teach others how Pinax releases are done. Let's get started! + +## TL;DR + +* You will need to be able to install and access multiple Python interpreters locally +* Determine which Python and Django versions to use +* Using these Python and Django versions, create updated configurations for the CircleCI `config.yml` and `tox.ini` files +* Clone a Pinax App repo locally, cd, and create a new branch +* Update the CircleCI `config.yml` and `tox.ini` files in that Pinax App directory with the new configurations +* Run tox +* Fix the errors +* When tox is successful, push your changes to GitHub +* Open a pull request +* When all of the updates are made to a Pinax App, the app release will be tagged +* Then, a package will be created and published to PyPI + +## Background + +Pinax includes a group of Django projects called [Pinax Starter Projects](https://github.com/pinax/pinax-starter-projects) that can be installed using [Pinax CLI](https://github.com/pinax/pinax-cli). These Pinax Starter Projects include relevant Pinax Apps that can be found in the [Pinax GitHub organization](https://github.com/pinax) or on PyPI via [Pinax keyword search](https://pypi.org/search/?q=pinax). + +This tutorial will focus on app release. + +## Required Setup + +In order to test code locally and make the updates required for the release, you will need to be able to access a Python interpreter for every version used in the release. The Pinax way of doing this is to install [pyenv](https://github.com/pyenv/pyenv) on a MacBook. This will enable you to install multiple versions of Python on your computer and make them globally available using the command: + +```bash +$ pyenv global 3.10.0 3.9.0 3.8.0 3.7.0 +``` + +## Release Plan + +I create a release plan for each release. This serves several purposes. + +* It provides instructions for how to complete the release as it happens +* It enables newcomers to contribute more easily to a release +* It serves as a reference for future releases + +Here is the WIP [Pinax 22.12 Release Plan](https://github.com/pinax/pinax/wiki/Pinax-22.12-Release-Plan/). + +## Why Do a New Release? + +Pinax is based on the [Django](https://www.djangoproject.com/) framework, which is based on the [Python](https://www.python.org/) programming language. Like other software, Python and Django evolve over time. Features are added, bugs are fixed, and security flaws are patched. New releases of Python and Django are then published. By incorporating new versions of Python and Django into Pinax, Pinax can benefit from these new features, bug fixes, and security patches. This is done through a release. Pinax releases can also include new features, bug fixes, and security patches. + +## Knowing Which Versions of Python and Django to Include + +We will want to use Python and Django versions that are being actively supported. For one thing, unsupported versions of Python and Django no longer receive security patches. It's best to drop these versions and add new, supported versions. + +In order to determine which versions of Python and Django are being actively supported, check out the [Python downloads](https://www.python.org/downloads/) and [Django downloads](https://www.djangoproject.com/download/) pages. + +Current Python support schedule + +![](pinax-release-tutorial/python-support-schedule.png) + +Current Django support schedule + +![](pinax-release-tutorial/django-support-schedule.png) + +Not all versions of Python and Django are compatible together. In order to determine which Python and Django versions are compatible, check out the "[What Python version can I use with Django?](https://docs.djangoproject.com/en/4.1/faq/install/#what-python-version-can-i-use-with-django)" section of the Django FAQs. This will help us create the test matrix and release documentation. + +Python and Django compatibility + +![](pinax-release-tutorial/python-django-compatibility.png) + +We now know that the Python 3.7, 3.8, 3.9, 3.10 and Django 3.2, 40, and 4.1 are supported. + +Python 3.8, 3.9, and 3.10 are compatible with all versions of Django. + +Python 3.7 is not compatible with Django 4.0 or 4.1. + +## Test Matrix Configurations + +Once we know which Python and Django versions to use, we can create updated configurations for the CircleCI `config.yml` and `tox.ini` files that will be in each Pinax App repo. Although CircleCI and tox can be used together, it is primarily tox that we will be interested in for this tutorial, because it's the tool we will use to update the code locally. + +In addition to testing against Python and Django, Pinax tox configuration includes a few other tools to maintain code quality. + +These tools are: +* [Flake8](https://flake8.pycqa.org/en/latest/): check your codebase style and complexity +* [Black](https://black.readthedocs.io/) (being added in this release): check your codebase style and reformat in place +* [isort](https://pycqa.github.io/isort/): sort Django imports +* [Coverage](https://coverage.readthedocs.io/): measures the percentage of code per file that is covered by tests + +Invariably, these other tools will have had new releases of their own between Pinax releases. As a result, additional changes will need to be made to the configuration. For some examples, check out the WIP [Pinax 22.12 Release Plan](https://github.com/pinax/pinax/wiki/Pinax-22.12-Release-Plan/). + +## Running the Test Matrix Locally Using tox + +Once the configurations are documented, we will be able to clone a Pinax App repo, update its CircleCI `config.yml` and `tox.ini` files, run tox, then fix the errors that result from the incompatibility between the existing code and the new Python and Django versions we are testing against. + +Clone the repo using the command line tool of your choice + +```bash +$ git clone https://github.com/pinax/pinax-messages +``` + +Change directory + +```bash +$ cd pinax-messages +``` + +Run the tox test matrix using the Makefile + +```bash +$ Make +``` + +Alternatively, run tox directly + +```bash +$ tox +``` + +## tox Test Environments + +Pinax tox configuration includes several test environments that it will run. + +```tox +[tox] +envlist = + checkqa, + py{37}-dj{32} + py{38, 39, 310}-dj{32, 40, 41} +``` + +The first one, called `checkqa`, runs the formatting tools Flake8, Black, and isort. + +A special `[testenv:checkqa]` configuration specifies which version of each tool tox should use and the commands needed to run each one. Instead of running the tools ourselves manually via the command line, tox will run them as it executes. + +Here, it's specified that Flake8 and Black will run in the `pinax` directory. The isort `--check-only` and `--diff` flags indicate proposed changes should be outputted in the terminal, rather than the files being modified. The isort `--settings-path` is explicitly set. For more information about isort options, see the [isort Configuration Options page](https://pycqa.github.io/isort/docs/configuration/options.html). + +```tox +[testenv:checkqa] +commands = + flake8 pinax + isort --check-only --diff pinax --settings-path tox.ini + black pinax +deps = + flake8 == 5.0.4 + flake8-quotes == 3.3.1 + isort == 5.10.01 + black == 22.8.0 +``` + +Separate `[flake8]` and `[isort]` configurations document choices specific to Pinax such as which tool formatting rules to ignore. + +Here, it's specified that tox should ignore the default [Flake8 rules](https://www.flake8rules.com/) that a colon should not have a space before it, that a block comment should have a space before the pound sign and comment, that there is no need for backslashes between brackets, and that a line break should occur before a binary operator. [`max-line-length`](https://flake8.pycqa.org/en/2.5.5/config.html#settings) can be up to 100 characters, rather than the 79 suggested by [PEP 8](https://peps.python.org/pep-0008/). [`max-complexity`](https://flake8.pycqa.org/en/2.5.5/#quickstart) can be up to 10 (more than 10 is believed to be too complex). Migrations files should be excluded from formatting. `inline-quotes` should be double, not single. + +```tox +[flake8] +ignore = E203,E265,E501,W504 +max-line-length = 100 +max-complexity = 10 +exclude = **/*/migrations/* +inline-quotes = double +``` + +[`multi_line_output`](https://pycqa.github.io/isort/docs/configuration/multi_line_output_modes.html) should be formatted as a vertical hanging indent. + +```tox +[isort] +multi_line_output=3 +known_django=django +known_third_party=appconf,pinax +sections=FUTURE,STDLIB,DJANGO,THIRDPARTY,FIRSTPARTY,LOCALFOLDER +include_trailing_comma=True +skip_glob=**/*/migrations/* +``` + +After `checkqa` is finished running, tox will iterate through each Python/Django combination, creating an environment to test that combination. + +tox environments created within the Pinax App directory `.tox` folder + +![](pinax-release-tutorial/tox-folder.png) + +This will include a coverage report for each combination. + +```tox +[testenv] +passenv = CI CIRCLECI CIRCLE_* +deps = + coverage==6.5.0 + codecov + dj32: Django>=3.2,<4.0 + dj40: Django>=4.0,<4.1 + dj41: Django>=4.1,<4.2 + master: https://github.com/django/django/tarball/master +``` + +Separate `[coverage:run]` and `[coverage:report]` configurations document coverage choices specific to Pinax. + +Here, it is specified that coverage should run in the `pinax` directory. `conf.py`, `tests`, `migrations`, and `admin.py` folders and files should be ignored. + +```tox +[coverage:run] +source = pinax +omit = **/*/conf.py,**/*/tests/*,**/*/migrations/*,**/*/admin.py +branch = true +data_file = .coverage +``` + +`conf.py`, `tests`, `migrations`, and `admin.py` folders and files should be ignored. The `--show-missing` flag indicates that the report should show the file line numbers missing coverage. + +```tox +[coverage:report] +omit = **/*/conf.py,**/*/tests/*,**/*/migrations/*,**/*/admin.py +exclude_lines = + coverage: omit +show_missing = True +``` + +## tox Output + +When `checkqa` runs, tox will output any formatting errors in the terminal. + +For each Python/Django combination, tox will output the incompability errors. + +tox will show one error at a time. Fix that error, and rerun tox. + +If needed, refer to the [Django 3.2 release notes](https://docs.djangoproject.com/en/4.1/releases/3.2/), [Django 4.0 release notes](https://docs.djangoproject.com/en/4.0/releases/4.0/#features-removed-in-4-0), and [Django 4.1 release notes](https://docs.djangoproject.com/en/4.1/releases/4.1/) for more info about the changes made in those releases. Google and Stack Overflow can also help. + +To see some example errors, check out the WIP [Pinax 22.12 Release Plan](https://github.com/pinax/pinax/wiki/Pinax-22.12-Release-Plan/). + +Once all of the errors are fixed, tox will show all green. + +tox success! :) + +![](pinax-release-tutorial/tox-success.png) + +## Coverage Report + +For each Python/Django combination, tox will also show a coverage report. The report will show the percentage of coverage for each file. Files with 100% coverage will be ignored. + +Example coverage report + +![](pinax-release-tutorial/coverage-report.png) + +## CircleCI + +## Tagging and Publishing diff --git a/_sources/pycon-us-2019-recap.md.txt b/_sources/pycon-us-2019-recap.md.txt new file mode 100644 index 00000000..285403f8 --- /dev/null +++ b/_sources/pycon-us-2019-recap.md.txt @@ -0,0 +1,136 @@ +# PyCon US 2019 Recap + +Published June 1, 2019 + +### Description + +PyCon US 2019 took place at Huntington Convention Center in downtown Cleveland, Ohio from May 1-10. Eldarion’s Katherine Michel wrote about what it was like to experience PyCon US for the first time! + +### Blog Post + +![](pycon-us-2019-recap-images/cleveland-sign.jpg) + +Cleveland script sign at Edgewater Park, with a lovely view of downtown Cleveland as a backdrop; photo credit: Katherine Michel + +This was my first PyCon and I had a blast! It was one of the most fun and inspiring experiences of my life. + +While PyCon 2018 was going on, I regretted not having gone when I realized via Twitter that many of the Pythonistas I had been getting to know were there. I was kicking myself for missing the chance to connect with them. So, I was thrilled to have the opportunity to go to [PyCon US 2019](https://us.pycon.org/2019/). + +Perhaps because of my FOMO in 2018, I didn’t want to have any regrets after PyCon US 2019 and I don’t. I both challenged and enjoyed myself to the max. I returned home having made many new friends, (including people I have long admired), learned new things, and found new ideas for [Pinax](https://github.com/pinax), an open source ecosystem of Django starter projects and apps that I help maintain. + +### Getting Ready + +Even though I didn’t know what to expect at PyCon, I knew there would be more going on than I could do. So ahead of time, I did some prioritizing that helped me make the most of my time, without doing too much: + +* I made a schedule of the talks and events that I was most interested in attending. +* I made a list of people with whom I wanted to reconnect or meet for the first time. +* And I chose three sights around Cleveland that were a priority to see. + +### It’s Going to Be Great + +As people began to tweet that they were on their way to Cleveland, the anticipation began to build. Kushal Das [tweeted](https://twitter.com/KatiMichel/status/1123277599348707328) that SFO was filling up for PyCon, including the BDFL [Guido van Rossum](https://twitter.com/gvanrossum)! I replied, “I’m getting so excited!” I was gobsmacked when Guido then followed me on Twitter. I immediately felt quite welcome and certain that I would have a great PyCon! + +![](pycon-us-2019-recap-images/guido-tweet.png) + +My tweet after being followed on Twitter by Guido + +### Thursday + +I arrived in Cleveland on Thursday, around noon. I headed to the conference floor to register and see what was going on. Quite a few conference-goers were mingling in the hallway. It was an advantage for me that I had gone to smaller, regional Python conferences before PyCon. I immediately saw some friends I’ve made through [DjangoCon US](https://2019.djangocon.us/) and [PyGotham](https://2019.pygotham.org/) and was excited to see them. I also immediately began to see people I had hoped to meet for the first time and chatted with them. The atmosphere was upbeat and everyone was super friendly. A group of us walked to nearby [Mabel’s BBQ](http://www.michaelsymon.com/mabels-bbq). The food was delicious. + +When we returned to the convention center, I decided to join the [swag stuffing line](https://us.pycon.org/2019/about/volunteers/#swag). I was surprised to meet Larry Hastings and [Paul Hildebrandt](https://twitter.com/paulhildebrandt) there and began to realize that I was going to stumble across people I admire everywhere I went! While taking a break from swag stuffing, I also chatted with some Bloomberg friends I’d met through PyGotham, including being given an impromptu black hole simulation made using Python by [Pablo Galindo Salgado](https://twitter.com/pyblogsal). Very cool and timely! + +The [Opening Reception](https://us.pycon.org/2019/events/opening-reception/) started at 5:30 pm in the [Exhibit Hall](https://us.pycon.org/2019/sponsors/exhibit-hall/). I’d never seen anything quite like the Exhibit Hall in real life, only on television! It was an industrial-size space filled with row after row of booths. Conference-goers ate, networked, and walked around chatting to sponsors and picking up swag. I saw Guido there for the first time and said hello! I was thrilled to meet him. Throughout the week, it became rather normal to see him around, chatting and working. I began to think of him more as a human being, not just a famous tech person. + +### Friday + +The main conference kicked off on Friday, with an [impressive keynote](https://www.youtube.com/watch?v=ftP5BQh1-YM) by [Dr. Russell Keith-Magee](https://twitter.com/freakboy3742) about Python black swans. I had come across some of the ideas in his talk before. I was amazed at how he wove them into one coherent theme, often using masterful storytelling. I felt inspired to become a better public speaker by finding connections between ideas and improving my storytelling skills. + +That morning, I began fulfilling one of my goals as a [DEFNA](https://www.defna.org/) Board Member. DEFNA is the Django Events Foundation North America. We oversee DjangoCon US and facilitate outreach and local events across all of North America, including Canada, the U.S., Mexico, and a number of other countries and territories. I represented DEFNA at the [PyCon Charlas](https://us.pycon.org/2019/hatchery/charlas/). I’m thrilled that throughout the week I got to know many members of the Mexican and Latin American communities who can benefit from DEFNA’s services. + +![](pycon-us-2019-recap-images/defna-and-pycon-charlas.png) + +Tweets in Español and English for DEFNA representation at PyCon Charlas + +![](pycon-us-2019-recap-images/pylatam.jpg) + +Me and Joel Rivera with the PyLatam Logo + +On Friday evening, I attended the [Art of Python](https://us.pycon.org/2019/hatchery/artofpython/), a mini arts festival that is part of the [PyCon Hatchery Program](https://us.pycon.org/2019/hatchery/). The performances were funny and thought-provoking. I’m glad I went. + +### Saturday + +Saturday kicked off with two very special keynotes by [Shadeed “Sha” Wallace-Stepter](https://restorecal.org/sha/) and [Jessica McKellar](https://twitter.com/jessicamckellar). + +Sha told the story of his troubled childhood in San Francisco. He turned to street crime for a feeling of empowerment. It was only after he was sent to prison for 27 years that he realized the same skills that he had used on the street could be channeled into entrepreneurship and tech. After producing a vast body of journalistic content while in prison, his sentence was commuted. Sha said that open source is “love.” Open source accepts people like him. He received a standing ovation. I was proud to see the community embrace someone who could easily be rejected elsewhere. + +Jessica McKellar’s keynote was a call to action to the Python community to help break the cycle of incarceration and help former inmates re-integrate. She is a powerful voice for change. You might remember that under Jessica’s leadership as PyCon US Diversity Chair, talk gender diversity [rose from 1% to 40%](https://twitter.com/jessicamckellar/status/737299461563502595) in just a few years. I’m glad that after Jessica’s talk I had the chance to personally thank her for that and also thank [Chris Neugebauer](https://twitter.com/chrisjrn) for making it a priority as a PSF Director to tie [PSF event support to diversity and inclusion targets](https://wiki.python.org/moin/PythonSoftwareFoundation/BoardCandidates2018#christopher-neugebauer). + +Later that morning, I spent as much time as I could at the [Maintainer’s Summit](https://us.pycon.org/2019/hatchery/maintainers/). Thanks to my time as Pinax Maintainer and [DjangoCon US](https://2019.djangocon.us/) Website Chair, I felt right at home. I especially enjoyed the table discussion I took part in where we shared our approaches in some of the practical aspects of maintaining projects. Other maintainers and I had faced many of the same challenges. I hope to attend another summit like this sometime. + +On Saturday afternoon, even though I hadn’t had time to check out the [Open Spaces](https://us.pycon.org/2019/events/open-spaces/) board, I’m quite pleased to say I ended up at an open space for chocolate! A friend alerted me to the open space as it was going on and of course, as a chocolate lover, I couldn’t resist immediately heading there to sample some. + +![](pycon-us-2019-recap-images/chocolate-open-space.jpg) + +A selection of chocolate on the table at the Chocolate Open Space; photo credit: Katherine Michel + +After the Chocolate Open Space I spent time as a volunteer at the [PyLadies](https://www.pyladies.com/) Booth. I hadn’t realized how many people I would meet as a booth volunteer! It was a lot of fun and I highly recommend it. So many people came up to the booth to pick up stickers, buy t-shirts, ask questions about PyLadies, and inquire about [PyLadies Auction](https://us.pycon.org/2019/events/auction/) tickets. Fortunately and unfortunately, the PyLadies Auction tickets were sold out. Although I hated to turn people away, it was great to see an abundance of support for PyLadies. + +Incredibly, I also randomly met one of the original Pinax authors at the PyLadies Booth! It was a pleasure to chat with [Jannis Leidel](https://twitter.com/jezdez) about the early days of Pinax. I have some new insight into the history of the Pinax ecosystem now. He also gave me some input for our next release. + +After I was finished at the booth, I attended the PyLadies Auction. The auction took place at 6:30 pm in a ballroom in the Hilton Hotel connected to the Huntington Convention Center. The atmosphere was filled with good will and humor. A highlight was seeing the smile on Guido’s face after a portrait of him went for the highest ever bid. I really appreciate that he proactively supports underrepresented people. + +Another highlight of PyCon for me was meeting [Dr. Naomi Ceder](https://twitter.com/NaomiCeder), [Lorena Mesa](https://twitter.com/loooorenanicole), [Jackie Kazil](https://twitter.com/JackieKazil), [Katie Cunningham](https://twitter.com/kcunning), and [Lynn Root](https://twitter.com/roguelynn), all of whom play an important role in the PyLadies Auction and in promoting diversity in the Python community. + +![](pycon-us-2019-recap-images/pyladies-auction.jpg) + +The portrait of Guido being carried around by PyLadies; photo credit: Katherine Michel + +### Sunday + +On Sunday, I attended the [PyLadies Lunch](https://us.pycon.org/2019/events/pyladieslunch/). The lunch was a time to meet in a fun, relaxed atmosphere to network and share common experiences. Throughout the lunch, women went to the front of the room and shared things they had done that they were proud of. Too often, women downplay their accomplishments. This was a time to celebrate ourselves and applaud one another! + +After the PyLadies Lunch, I walked from the convention center a few blocks to take a [30 minute self-guided tour of the Terminal Tower Observation Deck](https://www.eventbrite.com/e/terminal-tower-observation-deck-self-guided-tour-tickets-33127241471). When I was researching the sights around Cleveland, I’d had a hunch that I would enjoy seeing the Cleveland skyline from the top of this famous landmark and I did! + +![](pycon-us-2019-recap-images/terminal-tower.jpg) + +Cleveland skyline as seen from the Terminal Tower Observation Deck; photo credit: Katherine Michel + +### Development Sprints and More Sight Seeing + +The main conference ended on Sunday and the [Development Sprints](https://us.pycon.org/2019/community/sprints/) began on Monday. + +After several overcast days, the sun finally came out on Monday morning. Even though I would miss a bit of sprinting, I decided to take advantage of the nice weather and visit one of the sight seeing spots I had chosen, [Edgewater Park](https://www.clevelandmetroparks.com/parks/visit/parks/lakefront-reservation/edgewater-park) along [Lake Erie](https://en.wikipedia.org/wiki/Lake_Erie). Having lived in Kansas most of my life, it’s always a pleasure to enjoy a beach and something I make a priority. + +![](pycon-us-2019-recap-images/edgewater-park.jpg) + +A peaceful scene at Edgewater Park; photo credit: Katherine Michel + +Back at the sprints, I spent time in the CPython Sprint. I remember back to the 2016 [PyLadies tweet](https://twitter.com/mariatta/status/737689052736978945) that led [Mariatta](https://twitter.com/mariatta) to become a CPython Core Developer. She's one of my heroes and I love having the chance to see her in person! + +![](pycon-us-2019-recap-images/me-and-mariatta.jpg) + +Mariatta and I taking a selfie for her self-care Selfie Sprint! + +Throughout the week, I had the chance to meet a number of CPython and Django Core Devs for the first time, including [Cheryl Sabella](https://twitter.com/cherylsabella) and [Emily Morehouse-Valcarcel](https://twitter.com/emilyemorehouse). I’m particularly excited to see the rapid progress happening in CPython gender diversity now that it’s a priority. + +On my last full day of PyCon, I left the sprints to spend a large part of the day at the [Rock and Roll Hall of Fame Museum](https://www.rockhall.com/). The museum has an incredible collection of rock and roll memorabilia and I highly recommend going, if you get the chance. A few of my favorite items were John Lennon and Paul McCartney’s In My Life handwritten lyrics and Hey Jude descriptive score, Elvis Presley’s gold lamé suit, and Michael Jackson’s Dangerous Tour “Billie Jean” glove. + +![](pycon-us-2019-recap-images/rock-and-roll-hall-of-fame.jpg) + +The Beatles Exhibit at the Rock and Roll Hall of Fame Museum; photo credit; Katherine Michel + +On Wednesday, my last evening in Cleveland, being invited to eat at [Flannery’s Irish Pub](https://www.flannerys.com/) with a group of CPython Core Devs and other Pythonistas was a wonderful way to end a magical week. + +### It’s Not the End + +A few things really surprised me about PyCon. + +Firstly, although the crowd at PyCon was huge, it still had the same warm feeling of a small conference for me. Secondly, I had found everyone, including the most accomplished CPython Core Devs and Pythonistas, to be extremely kind and encouraging. I left feeling as inspired as ever. Thirdly, I found myself naturally chatting with the authors and maintainers of code important to Pinax and me. This brought some unexpected clarification to my work. Next time, I will plan ahead to do more of this! + +Also, I found the planning I had done in advance of PyCon to have been very helpful. Nevermind that by the end of the week, I had walked and stood so much, I had a blister on my foot to prove it! I made it to the talks and events that were the highest priority for me. I chatted with nearly everyone I had wanted to reconnect with or meet for the first time, plus many more. And I had seen the sights most important to me in Cleveland. + +I met so many people that I created a [Twitter list](https://twitter.com/KatiMichel/lists/pycon-us-2019/members) to keep track of as many of them as I could find. I borrowed this idea from Trey Hunner, who also happens to have written a wonderful blog post [How to Have a Great First PyCon](https://treyhunner.com/2018/04/how-to-make-the-most-of-your-first-pycon/). By the way, if I met you at PyCon and you’re not in my Twitter list, please let me know, so I can add you! I want to build on the new relationships I formed and when I attend PyCon in the future, grow my network even more. I’m also making my way through talk videos I missed due to the “hallway track” and finding more insights to apply to our next major Pinax release. + +A special thank you to [PyCon Chair Ernest Durbin III](https://twitter.com/EWDurbin) and the many other people who made PyCon US 2019 happen. I can’t wait to go again! + diff --git a/_sources/pycon-us-2024-recap.md.txt b/_sources/pycon-us-2024-recap.md.txt new file mode 100644 index 00000000..081ce149 --- /dev/null +++ b/_sources/pycon-us-2024-recap.md.txt @@ -0,0 +1,909 @@ +# PyCon US 2024 Recap + +Table of Contents +----------------- + +- [Intro](#intro) +- [Wednesday](#wednesday) + - [Sightseeing Downtown](#sightseeing-downtown) + - [Allegheny Riverfront](#allegheny-riverfront) + - [Fig and Ash](#fig-and-ash) +- [Thursday](#thursday) + - [Noticeable Sightings at the Conference Center](#noticeable-sightings-at-the-conference-center) + - [Andy Warhol Museum](#andy-warhol-museum) + - [Heinz History Center](#heinz-history-center) + - [Duquesne Incline](#duquesne-incline) + - [Opening Reception at the Expo Hall](#opening-reception-at-the-expo-hall) + - [Expo Hall Booths Thursday and Friday](#expo-hall-booths-thursday-and-friday) +- [Friday](#friday) + - [Breakfast](#breakfast) + - [K. Jay Miller Keynote](#k-jay-miller-keynote) + - [Hallway Track and Expo Hall](#hallway-track-and-expo-hall) + - [Photos and Tea](#photos-and-tea) + - [Condado Tacos](#condado-tacos) +- [Saturday](#saturday) + - [Breakfast](#breakfast-1) + - [Simon Willison Keynote](#simon-willison-keynote) + - [Hallway Track](#hallway-track) + - [Overcoming GIL with subinterpreters and immutability](#overcoming-gil-with-subinterpreters-and-immutability) + - [Measuring the performance of CPython](#measuring-the-performance-of-cpython) + - [PSF Members Luncheon](#psf-members-luncheon) + - [Profile Pic](#profile-pic) + - [Juggling](#juggling) + - [Hallway Track and Expo Hall](#hallway-track-and-expo-hall-1) + - [PyLadies Auction](#pyladies-auction) +- [Sunday](#sunday) + - [Posters](#posters) + - [Ethan Smith](#ethan-smith) + - [PyLadies Lunch](#pyladies-lunch) + - [Building a JIT compiler for CPython](#building-a-jit-compiler-for-cpython) + - [Unlocking the Parallel Universe: Subinterpreters and Free-Threading in Python 3.13](#unlocking-the-parallel-universe-subinterpreters-and-free-threading-in-python-313) + - [Sync vs. Async in Python: Tools, Benchmarks, and ASGI/WSGI Explained](#sync-vs-async-in-python-tools-benchmarks-and-asgiwsgi-explained) + - [Sumana Harihareswara Keynote](#sumana-harihareswara-keynote) + - [Steering Council Updates](#steering-council-updates) + - [Barry Warsaw: Steering Council Overview](#barry-warsaw-steering-council-overview) + - [Gregory P. Smith: Steering Council Expenditures Update](#gregory-p-smith-steering-council-expenditures-update) + - [Emily Morehouse: Councils and Working Groups Update](#emily-morehouse-councils-and-working-groups-update) + - [Thomas Wouters: Overview of Python 3.13](#thomas-wouters-overview-of-python-313) + - [Pablo Galindo Salgado: Free-Threading Update (a.k.a. No GIL)](#pablo-galindo-salgado-free-threading-update-aka-no-gil) + - [Dinner and Ice Cream](#dinner-and-ice-cream) +- [Monday](#monday) +- [Until Next Time](#until-next-time) + +## Intro + +Disclaimer: the content of this post is a reflection of my career journey and not specific to my work at JPMorgan Chase & Co. + +PyCon US 2024 was truly incredible. If you ever have the chance to attend, I highly recommend it. + +I am thankful for and proud of my friend Mariatta (PyCon US Chair) who oversaw it. + +This was my second time attending an in-person PyCon US. My first one was in 2019. I remember being awestruck by the ocean of people. I was glad that I had already attended DjangoCon US and some regional conferences. I recognized some people in the crowd, and it made it feel like a smaller event. + +This time, I was better prepared. I knew what to expect and leveraged my time better, all while having a ton of fun. + +🔝 [**back to top**](#table-of-contents) + +## Wednesday + +### Sightseeing Downtown + +I arrived on Wednesday, settled in, and immediately took some time to see the [David L. Lawrence Convention Center](https://www.pittsburghcc.com/) and the downtown. + +This was my first time in Pittsburgh, and I didn't know what to expect. Downtown Pittsburgh, with its many steel bridges and brick buildings surrounded by riverfront, was a surprisingly gorgeous scene. + +![](pycon-us-2024-recap-images/david-l-lawrence-convention-center-rooftop-terrace.jpg) +David L. Lawrence Convention Center Rooftop Terrace + +![](pycon-us-2024-recap-images/tenth-street-water-feature.jpg) +10th Street Water Feature + +🔝 [**back to top**](#table-of-contents) + +### Allegheny Riverfront + +![](pycon-us-2024-recap-images/allegheny-river-bridge.jpg) +Standing on a bridge on the Allegheny River with a view of the downtown and one of the many other bridges + +🔝 [**back to top**](#table-of-contents) + +### Fig and Ash + +After a busy day, I was tempted to get some cheap takeaway for supper, but I thought twice, and decided I should enjoy the best this city has to offer. So, I googled "best restaurant in Pittsburgh." The top result was [Fig & Ash](https://figandashpgh.com/), a short walk away. I went there and had an incredible meal. + +![](pycon-us-2024-recap-images/fig-and-ash-spaghetti.jpg) +Spaghetti with Maine lobster cream, crab, nantucket bay scallops, arugula + +![](pycon-us-2024-recap-images/fig-and-ash-brownie.jpg) +A piping hot cast iron Kahlua fudge brownie with coffee ice cream and sea salt for dessert + +🔝 [**back to top**](#table-of-contents) + +## Thursday + +I took the day off to sightsee. + +As I was walking down the riverfront, I saw a man taking photos. He looked familiar. I was pretty sure we had been following each other on social media for a while. I couldn't resist approaching him. It was Peter Wang (Anaconda Co-founder). It was really fun to meet him, and I found out that he and my friend Andy Fundinger had been consultants at JPMorgan Chase years ago. + +🔝 [**back to top**](#table-of-contents) + +### Noticeable Sightings at the Conference Center + +I couldn't resist stopping at the convention center to see what was going on. + +Once inside, I soon saw Guido van Rossum (Python Creator and BDFL) walking nearby. He sat down next to me, and I had the chance to chat with him about life and work. I thanked him for spending the time, and he thanked me. I've had the chance to spend time with him at three conferences now, and it's always fun. The Python community is lucky to have a BDFL who actively engages with us and cares. + +I was thrilled to catch up with some of my DjangoCon US friends: Afi Gbagado (DjangoCon US), Abigail Mesrenyame Dogbe (Technology Chief of Staff and Open Source Founder), Noah Alorwu (Marygold and Co.), Felipe de Morais (AfroPython), Jeff Triplett (RevSys, DEFNA Board Member), Eric Matthes (Author of [Python Crash Course](https://nostarch.com/python-crash-course-3rd-edition)), and Trey Hunner (Python Trainer, Python Morsels). I made a new friend Amanda Viera (AfroPython). + +![](pycon-us-2024-recap-images/me-and-abigail.jpg) +Me and Abigail Mesrenyame Dogbe + +As usual, Trey had an interesting gaggle of people around him that included Marie Roald and Yngve Mardal Moe ([Turtle Thread](https://turtlethread.com/)) and Rodrigo Girão Serrão ([Python Math Teacher](https://mathspp.com/)). + +It was good to chat with Mason Eggers (PyTexas Chair), Kevin Horn (Dallas Fortworth Pythoneers Co-founder and PyTexas Organizer), Josh Schneider (PyTexas Organizer), Andy Fundinger (Bloomberg), and Heather Crawford (Bloomberg) again so soon after seeing them at the wonderful PyTexas conference I attended in April. Andy and I first met at PyGotham, another one of my favorite conferences. + +Inspired by Andy, Mason and I later talked PyTexas sponsorships. + +Although they were hard at work, I also got to see Deb Nicholson (Python Software Foundation Executive Director) for the first time again since DjangoCon US 2023, Ee Durbin (PSF Director of Infrastructure), Christopher Ngeuebauer (PSF Board Member), and Mariatta. :) + +🔝 [**back to top**](#table-of-contents) + +### Andy Warhol Museum + +On the way to the [Andy Warhol Museum](https://www.warhol.org/), I saw my friend Andy Knight (Automation Panda), and we walked there together. Andy had given a tutorial "[def test_crash_course_with_pytest():](https://us.pycon.org/2024/schedule/presentation/37/)". + +![](pycon-us-2024-recap-images/andy.jpg) +Andy wearing an Andy Warhol-inspired shirt + +![](pycon-us-2024-recap-images/andy-warhol-museum.jpg) +A favorite from the Andy Warhol Museum + +🔝 [**back to top**](#table-of-contents) + +### Heinz History Center + +When I heard that the [Heinz History Center](https://heinzhistorycenter.org/) has the Mister Rogers set, I had to go. + +![](pycon-us-2024-recap-images/heinz-museum-mr-rogers.jpg) +Mr. Rogers Neighborhood set + +🔝 [**back to top**](#table-of-contents) + +### Duquesne Incline + +I had all of my travel plans in place to attend PyCon US 2020 in Pittsburgh and planned to ride the [Duquesne Incline](https://www.duquesneincline.org/), but the in-person conference was canceled due to Covid. I finally had the chance to ride it! + +![](pycon-us-2024-recap-images/duquesne-incline-bottom.jpg) +View from the station at the bottom + +![](pycon-us-2024-recap-images/duquesne-incline-view.jpg) +View from the Duquesne Incline Observation Deck + +🔝 [**back to top**](#table-of-contents) + +### Opening Reception at the Expo Hall + +I gave my first conference talk at the first conference I ever attended. It was DjangoCon US 2017 in Spokane, Washington. I distinctly remember that Roger Masse (United States Senate) and Mark Lavin (Nvidia) attended my talk. At the PyCon US 2024 opening reception, while catching up with Jon Banafato (PyGotham Chair), I saw Mark walking by and couldn't resist stopping him to introduce myself and thank him years later for going to my first talk. :) + +After years of following each other on social media, it was wonderful to meet Anthony Shaw (Microsoft) in person. Along with Iqbal Abdullah (LaLoka Labs, PyCon JP), we talked about the [CPython Internals](https://realpython.com/products/cpython-internals-book/) book Anthony wrote and my desire to understand CPython better. Anthony later suggested that I submit to the CfP next year, and I have to admit that it's tempting. + +It was a pleasure to chat with Simon Willison (Django Co-founder) again briefly before he left to work on his keynote. I knew he would nail it. + +I got to hang out with Meagan Voss (Wagtail) and Nic James (DjangoCon US 2019 Chair) and talk about our work. + +It was so good to see my friend Jess Garson (Elastic, formerly Twitter) at the Elastic booth and meet Philip Krenn (Elastic). Jess and I first met at PyGotham 2019, and she introduced me to many aspects of the Twitter Developer Program. :) + +The night finished with a bear hug from Carol Willing (CPython Core Developer, Python Steering Committee) who told me I am awesome. :) + +![](pycon-us-2024-recap-images/expo-hall.jpg) +Expo Hall in full swing + +🔝 [**back to top**](#table-of-contents) + +### Expo Hall Booths Thursday and Friday + +In the Expo hall, I did a tour of database companies and other fun tools. + +At Datadog booth, Julian Levi Hernandez (Datadog, formerly CockroachDB) gave me a demo of a dashboard using Cockroach audit logs to further drill down into metrics. + +At the Edge DB booth, Yury Selivanov (Edge DB Co-founder) told me that Django will be supported in a few months and showed me the impressive performance improvement created by Edge DB. Looking forward to learning more! + +At the Oracle booth, Gary Brenner (Oracle Senior Cloud Engineer) told me about Oracle Cloud and self-managing Oracle databases. + +At MongoDB booth, I caught up with my friend Mark Smith (MongoDB) and obtained some [learning resources](https://www.mongodb.com/developer/events/pycon-us-2024/) from Rita Rodrigues (Director of Developer Relations at MongoDB). + +At Snowflake booth, I learned about [Snowflake Quickstarts](https://quickstarts.snowflake.com/) and using Snowflake tasks for orchestration. + +At the Crunch Data booth, I met Elizabeth Garrett Christensen. I know of Elizabeth through the talks she has given at DjangoCon US: "[How to Be a Postgres DBA in a Pinch](https://2022.djangocon.us/talks/how-to-be-a-postgres-dba-in-a-pinch/)" and "[Postgres Performance: From Slow to Pro](https://2023.djangocon.us/talks/postgres-performance-from-slow-to-pro/)". Crunch Data provides Enterprise PostgreSQL support, including fully managed Postgres as a Service. + +As a fellow Lawrence native, Elizabeth seems to be hoping for a Lawrence Django conference as much as I am. :) I missed the [Lawrence Technology Conference](https://lawrencetechconference.splashthat.com/) this year, but hope to make it next year at least, if there is one. + +At the PostgreSQL community booth, I obtained some learning resources, including a paper version of [PostgreSQL FAQs](https://www.postgresql.org/about/press/faq/). + +At the [Coiled](https://www.coiled.io/) booth, I learned about using Dask for parallel computing. Dask was a projects cited in the Measuring the performance of CPython. + +![](pycon-us-2024-recap-images/swag.jpg) +EdgeDB, Oracle, Dask, Streamlit socks, MongoDB socks? + +🔝 [**back to top**](#table-of-contents) + +## Friday + +### Breakfast + +At breakfast, I met Loren Crary (PSF) for the first time after following each other on social media for quite some time and saw Al Sweigart (Author of [Automate the Boring Stuff with Python](https://nostarch.com/automate-boring-stuff-python-3rd-edition)), one of my favorite authors and presenters, again. I also finally met Tania Allard (Quansight, formerly Microsoft) and learned more about her work, including consulting at JPMorgan Chase. It was a pleasure to meet Daniel Graham (SauceLabs) and Jing Cao (National Microbiome Data Collaborative), too. + +🔝 [**back to top**](#table-of-contents) + +### K. Jay Miller Keynote + +Jay knows two staff developer advocates who are Black and he is one of them. When he sees another Black developer on stage, it's not just another Pythonista. + +Jay talked about beautiful moments from DjangoCon US 2023 in Durham, North Carolina: Black leaders, from all around the world, getting on stage, getting in front of their booths. They showed up and showed out for who they were. + +![](pycon-us-2024-recap-images/black-python-devs-durham.png) +Black Python Devs at DjangoCon US 2023 + +Jay was happy to not be the first Black person keynoting PyCon US. But, at PyCon US 2022, Jay counted only 12 Black people among thousands. He talked to them. They had to have a reason to be there. He thought of the keynoters who came before him. They came, they spoke, they left. He wondered if "the juice wasn't worth the squeeze." + +Many people go to conferences to hang out with their friends. If you don't have that kind of experience, there's no reason to attend. + +Jay asked, how do we get more black people to experience the PyCon community, build friendship, and become repeat attendees? + +Jay decided to create something that would serve as a Wakanda for Black Python devs. Something that would be worth staying for. It's called [Black Python Devs](https://blackpythondevs.com/). + +Jay listened to people in the community who had experience running non-profits, starting communities, running conferences: Marlene, Dawn, Kojo. He needed to make the community safe, equitable, accessible. This goes beyond a code of conduct to issues that Black people think about everyday like physical safety in public. He also wants to prevent burnout. + +Jay started working behind the scenes to get as many Black people as possible to PyCon US 2023. There were 3x more than in 2022. They were able to be in the same room together and talk about the experiences they have as Black Python devs that others can't comprehend, not about how to increase diversity. + +![](pycon-us-2024-recap-images/black-python-devs-31.png) +3x attendance at PyCon US 2022 + +Five members launched a discord. There are 427 members now. Their only plan was to be there for each other. + +They are now officially a non-profit powered by the GNOME Foundation. + +The leadership model is "diversity by inclusion." Global leaders are represented at the table: from many countries, speaking different languages, 50/50 gender parity. It's members are people who are already around you in PSF, DFS, Djangonauts, Pylades, DjangoGirls. Because the community came from Africa, its leaders do too. + +"Your reach may extend beyond your grasp." Kojo Idressa + +The Python community can extend the reach further and Black Python Devs can help change perceptions in communities. + +A few examples of solidarity +* Facilitating four leaders traveling to their first PyCon US +* Converting community sponsorship into tickets for first time attendees who are Black Python Devs members +* Providing 75 student tickets to Python Nigeria +* Convening leaders from across the globe at conference lunchtime to help understand the situation happening in Africa and what could be done to assist +* Helped Vice Chair Velda Kiara on stage when her laptop didn't work +* Supporting a Django Girls event that gave not just Black women devs, but Black girls a wonderful first interaction with the Python community + +"Say it loud." Everything they do is out in the open, proudly showing up for each other, saying, we've got this, and celebrating. + +Black Python devs had a goal of sponsoring seven local conferences in Black communities and hoped to raise $5,000 at PyCon US. They raised over $15,300 from 282 donations. + +Things you can do to help +* Donate money +* Donate time, mentor +* Connect with Black Python Devs +* Open doors, have conversations, make connections + +🔝 [**back to top**](#table-of-contents) + +### Hallway Track and Expo Hall + +At PyCon US 2019, Pablo Galindo Salgado (CPython Release Manager, Bloomberg) was one of the first people I met as a wide-eyed newcomer. It was the Thursday night before the conference talks began, and I was at the conference hall for the swag stuffing, which is a great place to meet people. Scientists had recently photographed a black hole for the first time. Pablo, a physicist, invited me to a table nearby where he demoed some Python astronomy software for me. I later met Barry Warsaw (Python Steering Committee, Nvidia) at the sprints and talked to him about my career. At the time, I was a part-time open source maintainer of Pinax. + +I saw Pablo and Barry together at the PyCon US 2024 Opening Reception. It was wonderful to be able to share with them five years later how my career has taken off. + +It was great to see Andrew Godwin (Django Async Architecture) and Dave Forgac (PyOhio) again. + +I had the chance to say hello to Sarah Kuchinsky (PyCon US Organizer) for the first time since PyCon US 2019. She was recently the technical reviewer for Al Sweigart's great book about recursion called "[The Recursive Book of Recursion](https://inventwithpython.com/recursion/)". I really enjoyed it! + +I found out that Julia Ferraioli (AWS Open Source) was at the conference. I was ecstatic and hurried over to meet her. I had hoped to meet Julia in person for years. In March of 2021, I reached the final round of a Twitter Open Source Program Manager interview process. I was disappointed when I was not offered the job, but later found out that I had been considered alongside Julie and was honored. In a twist of fate, in August of 2022, Julia kindly met with me via Zoom and gave me excellent career advice. + +It was also a pleasure to meet Brianne Wilhelmi (Springboard) and Aaron Clark (Hamilton Beach) at lunch, and see Ashia Zawaduk (Muck Rack) again after PyCascades 2020. + +🔝 [**back to top**](#table-of-contents) + +### Photos and Tea + +Earlier this year, I created a [page of favorite conference snapshots](https://katherinemichel.github.io/portfolio/favorite-conference-snapshots.html). Benedict Kofi Amofah (Python Ghana, DjangoCon US) tweeted to me that he'd be in the gallery soon. I took him up on it. :) + +![](pycon-us-2024-recap-images/me-and-benedict.jpg) +Me and Benedict + +Abdur-Rahmaan Janhangeer (Python Usergroup of Mauritius (PyMUG)) and I have been following each other on social media for quite some time, but I didn't know what he looked like. Fortunately, he found me and gave me a wonderful gift of Chartreuse tea, the best selling tea in Mauritius. Thank you! + +![](pycon-us-2024-recap-images/chartreuse-tea.jpg) +Chartreuse Tea! + +🔝 [**back to top**](#table-of-contents) + +### Condado Tacos + +After my incredible meal on Thursday night at Fig and Ash, I wanted to do something simple for supper. Based on a tip from another conference attendee, I ended up across the street from the convention center at [Condado Tacos](https://condadotacos.com/). The food was pretty good, but the best part was sitting and chatting with Bloomberg Python Trainers Heather Crawford and Scott Irwin. I met Scott at PyGotham 2018 where I attended a talk he gave "[Dataclasses are here. Now what?](https://www.youtube.com/watch?v=zHY1oaYxxjA)". I met Heather at PyTexas 2024 where she did an awesome talk "[Python Code Versus Pythonic Code: What Experienced Developers Find Challenging About Learning Python](https://www.youtube.com/watch?v=RdkhRfRizf0)", which she also gave at PyCon US. + +🔝 [**back to top**](#table-of-contents) + +## Saturday + +### Breakfast + +Koushik Krishnan (Microsoft Azure Cosmos DB Engineer) gave his talk "[Rest Easy with Jupyrest: Deploy notebooks as web services](https://youtu.be/HWIPkipolUk?si=ozxHi5N7RwY19hVh)" at PyTexas. When I saw during the talk that he works on [Microsoft Azure Cosmo DB](https://azure.microsoft.com/en-us/products/cosmos-db), I was keen to meet him and did. He gave the talk at PyCon US too. It was a pleasure to have the chance to chat with him about different databases over breakfast. I also had the chance to promote [Bar Camp Philly](https://2023.barcampphilly.org/), organized by Tim Allen and now Dawn Wages' wife. + +🔝 [**back to top**](#table-of-contents) + +### Simon Willison Keynote + +Simon talked about Large Language Models such as Chat GPT, Google Gemini, Claude, and Llama. + +He does not think of them as Artificial Intelligence. He thinks of them as Imitation Intelligence. They predict the next word in a sentence. When they get good at that, it's spooky what they can do. He acknowledged that they are flawed, but just because a tool is flawed, doesn't mean it's not useful. + +When evaluating a new technology, Simon asks, what can I build with this that I couldn't have built with it before? LLMs open up new options unlike anything he has ever seen. + +How can we tell which of these models works best? Vibes. Simon recommends using [LMSYS Org Chatbot Arena](https://arena.lmsys.org/). You vote on which model gave the best response to a prompt, then they are scored using Elo rating system. Simon is relieved, because "openly" licensed models are beginning to rank. + +LLMs can be run on smartphones now, even with no internet connection. An app called MLC Chat will give you access to Mistral, one of the best openly licensed models. + +Simon has deep respect for what is known as prompt engineering. It's not easy to get LLMs to do what you want them to do. Building something simple is easy. Building something production ready can take months and is much harder than people expect. + +A few tricks +* Chat prompting +* Retrieval Augmented Generate (RAG) +* Function calling ("tools") in a loop + +Simon coined the term "Prompt Injection" after SQL Injection. He believes that we are not seeing digital assistants, because no one knows how to build them securely. 99% effective isn't good enough. Never mix untrusted text with access to tools. + +Simon showed how he gave the LLM a GeoJSON file with different line segments and prompted it to turn it into a single polygon. This "side project" took 3 1/2 minutes to complete + +Simon showed how he had created a counter that incremented each time he said AI or artificial intelligence. It took 6 minutes to get to prototype and 20 minutes to get it polished. + +Simon walked through how he passed structured data from the PSF Board Resolutions page into an LLM to parse it into a structured data table that could be filtered. He used a plugin he had been developing called llm.datasette.io. + +Simon has been able to use LLM to more quickly build things that he couldn't justify spending the time to build by hand. + +Tips +* Ask it to give options (it's more likely to give a better answer) +* It will rarely get the answer right. Ask it to "do better." + +LLMs make mistakes. It's up to you to verify. The tool gets you 90% of the way there. + +Rather than Generative AI, Simon likes to think of these tools as Transformative AI. + +Personal AI ethics: Simon came across the term "slop" and likes it. Similar to spam, ask yourself, am I creating unwanted junk or am I using these tools in a responsible way? + +Simon pondered if using LLMs is cheating. We care if students cheat, because it hurts them and they have an unfair advantage. + +LLMs feel different. Simon's whole career has been about getting things done more quickly, including by using open source code. + +A few rules of thumb +* Never commit any code that you couldn't actively explain to someone else +* LLMs are good at explaining code. Give it code in a language you don't understand and it will explain it with 90% accuracy +* Then, help people understand how you did it! + +He said software engineers are uniquely positioned to take advantage of LLMs, because LLMs are good at generating code, and you can check the code by running it. + +Simon is optimistic. You need to have a CS degree or spend a lot of time learning to do the simplest of computer tasks. + +LLMs opens programming up to a much wider community. Simon believes that we have a responsibility to not leave anyone behind. + +🔝 [**back to top**](#table-of-contents) + +### Hallway Track + +It was wonderful to see Moshe Zadka at PyTexas where he gave a talk "[Iterate, iterate, iterate](https://www.youtube.com/watch?v=WMK7pTOdECQ)" and again at PyCon US where he gave me a Moleskin journal from Anthropic for recording convo starters for next-generation AI assistant [Claude](https://www.anthropic.com/news/introducing-claude). + +![](pycon-us-2024-recap-images/moshe-convo-starters.jpg) +Moleskin from Moshe + +At DjangoCon US 2023, Marc Gibbons gave a wonderful talk called "[Empathetic testing: Developing with compassion and humility](https://2023.djangocon.us/talks/empathetic-testing-developing-with-compassion-and-humility/)". Not only was it his first conference talk, but after 44 chemo treatments, 15 fractions of radiation, and a stem cell transplant to treat Hodgkin Lymphoma, he had been given a clean bill of health the week before. It was wonderful to have the chance to catch up with him at PyCon US. + +🔝 [**back to top**](#table-of-contents) + +### Overcoming GIL with subinterpreters and immutability + +Yury Selivanov showed a screen with a single Python process running 10 async IO event loops saturating the 10 CPU cores on his laptop, all sharing memory and exchanging values between them from 1 million keys and values and done fairly efficiently. Yury said it is possible to build fast things with Python. + +Yury kind of likes the GIL. When he tries to do free-threading or multi-thread programming, bad things happen. + +Free-threading will take a couple of years to be stable. Python subinterpreters are relatively new. You can run these subinterpreters in the same process, side-by-side, isolated from each other, each with its own GIL and occupying one CPU core, sharing the same memory space. + +One of the subinterpreters will be the main one and will spawn workers and perhaps can have queues between workers and spawn tasks. + +What if we could safety share state between the subinterpreters with the potential for lots of it and without using pickle, because it's slow? + +![](pycon-us-2024-recap-images/yury-shared-state-no-pickle.png) +Safe shared state... no pickle + +Yury has created a minimal library called [memhive](https://github.com/edgedb/memhive) that enables efficient data sharing between isolated subinterpreters. + +He showed a code snippet. + +Architecture +* Level 1: simple protocol that enables you to send Python data across subinterpreter boundary +* Level 2: higher level API (queues and sychronization primitives) +* Level 3: async IO bridge + +Create memhive and define the async workers that will be running in each separate subinterpreter, each with its own async IO loop. They can access shared state, listen to messages, send messages, spawn worker subinterpreters. The main interpreter will initialize the shared state, broadcast signals to all subinterpreters, push work so that one starts working on a task, listen to messages. + +Rather than how it works, Yury felt it was more important to talk about how it's implemented. + +3 things to talk about +* Immutability +* Efficient immutability +* How we can benefit from it + +Immutability +* Python has immutable types: str, int, floates, bytes, tuples +* You cannot change an existing object. You have to create a new object out of the existing object. +* There is no immutable dictionary or mapping in CPython, which Yury says is a shame. + +Efficient immutability +* Creating a new tuple out of an existing one is efficient (O(n)), but you are not usually dealing with a lot of records. +* The same inefficiency would be very bad for a dictionary, because we are potentially putting millions of items in them. +* Dictionaries can be used as caches, but rebuilding it every time would be unacceptably slow. +* Fortunately smart people created a nice algorithm that can implement this with O(log n) + +The trick Yury would show used trees behind the scenes. + +As keys and values are added to an empty root node of the tree, when a key conflict happens, another node on the second level is created and the key is added to it instead. The tree will get bigger and bigger as items are added. + +![](pycon-us-2024-recap-images/yury-efficient-immutability.png) +Linking a second level node by reference + +Imagine that we want to mutate this tree. We run the algorithm to figure out where to put the key, then need to copy the root node (it's immutable, so we can't mutate it). + +This is where the magic happens. + +We don't have to copy the second level of the tree. We can re-use it. We just need the reference. + +In a mapping with billions of keys, perhaps five nodes out of 10,000 change. + +This is called structured sharing. The algorithm is called HAMT (Hash Array Mapped Trie). Yury implemented it in the Python Standard Library. It can be found in contextvars module. The [hamt.c file](https://github.com/python/cpython/blob/13a5fdc72f701c053b96abea48cd8f2775e9418e/Python/hamt.c) has a 200 line comment explaining in detail how this data structure works. + +How we can benefit from it +* All subinterpreters run in the same OS process so they share the same memory space +* If we want to access this tree from the main subinterpreter, we just look into the memory directly. It is immutable and will not change. +* If we want to add a key, we don't have to copy the entire tree, we just create the missing new branches and reference others +* If we have a tree with billions of keys, we just create a couple of tree nodes in a worker subinterpreter, the rest can be re-used. +* Key: using immutable things, we can access the underlying memory safely without locks, as long as we can guarantee that the data would not be garbage collected. +* memcopy is used and is really fast. + +![](pycon-us-2024-recap-images/yury-node-copy.png) +Create tree nodes in the worker subintrepreter and re-use the rest + +Yury performed a benchmark. Structured sharing is significantly faster than using pickle, potentially 6x to 150,000x faster. + +Yury talked about some of the implementation details icluding incref and decref. incref keeps Python objects alive when the ref count goes to zero. The data sharing mechanism has to guarantee safety. + +The hard part of this is implemented in memhive, but some bugs need to be fixed. Do not use it in production. + +Yury is building this for Edge DB to optimize cloud deployments. + +🔝 [**back to top**](#table-of-contents) + +### Measuring the performance of CPython + +"Measuring the Performance of CPython" by Michael Droettboom (Microsoft CPython Performance Engineering Team, Faster CPython Team) + +I did not watch this full talk, because I left early to go to the PSF Members Luncheon. + +A few key takeaways from what I did watch: +* The Faster CPython Team has made Python 3.11 20-60% faster depending on what you are doing +* This talk was born out of a need to benchmark in order to determine if they were working on the right things to impact Python performance +* In the Python world, benchmarks are in pyperformance suite (a little over 100 benchmarks, some 30 or 40 years old) +* Not all benchmarks are created equal + +![](pycon-us-2024-recap-images/python-benchmarking-faster-python.png) +Other projects that have aimed to make faster Pythons over the years + +[Computer Architecture: A Quantitative Approach](https://www.amazon.com/Computer-Architecture-Quantitative-Approach-Kaufmann/dp/0128119055) has a useful chapter for looking at benchmarks and categorizing what they are useful for +* Toy benchmarks: simple, less than 100 lines of code, cool, but not a common use case +* Real applications: take some code that runs in production, maybe on a massive scale and running it in a benchmark suite +* Microbenchmarks (not in the textbook): measuring a narrow feature of the language + +Sub-topics of real applications benchmarks: +* Modified application: change it slightly to make it better as a benchmark +* Application kernel: taking one subsystem of application and benchmarking that specifically + +🔝 [**back to top**](#table-of-contents) + +### PSF Members Luncheon + +I attended the PSF Members Luncheon. + +I sat at a table that included Naomi Cedar (Author of [The Quick Python Book](https://www.manning.com/books/the-quick-python-book-third-edition)), Tres Seaver (Zope), Chris Brousseau (PyBay), and Phebe Polk (PyBay Piggies). + +![](pycon-us-2024-recap-images/psf-members-luncheon.jpg) +I really enjoyed the presentation. + +At the luncheon, I had the chance to chat with Jannis Leidel (Anaconda) again. At PyCon US 2019, I met him serendipitously while I was working at the PyLadies booth. Once upon a time, he worked on Pinax, an open source library that I later helped maintained. I was able to learn more about the history of the project from him. + +I later went over to Hynek Schlawack (prolific open source maintainer) who remembered we had met at PyGotham 2019 where I attended a talk he gave! While chatting with him, he introduced me to Hugo van Kemenade, the CPython 3.14 and 3.15 Release Manager. It was very cool to meet him, and it turns out that he maintains [Pillow](https://pillow.readthedocs.io/en/stable/) package. I am a big fan of Pillow. I used it to create my Twitter art bot which is very special to me. :) + +🔝 [**back to top**](#table-of-contents) + +### Profile Pic + +My friend Melanie Arbor (O'Reilly Media) takes great profile pics. At DjangoCon US 2017, she took my pic, and I loved it. I've used it as my social media profile pic since then, but it's getting a bit dated. I saw her at PyCon US and asked her if she would be willing to take a new profile pic of me. It turned out that she had already created a "Profile Pic Palooza" open space for Saturday at 3 pm. As a bonus, I got to catch up with Chalmer Lowe (Google) for the first time since PyCon 2019. + +![](pycon-us-2024-recap-images/me-by-melanie.jpg) +New profile pic :) + +🔝 [**back to top**](#table-of-contents) + +### Juggling + +Not only does Ned Batchelder ([coverage.py](https://coverage.readthedocs.io/) Maintainer) maintain a powerful Python package and give popular conference talks (check out [People: The API User's Guide](https://nedbatchelder.com/text/key23.html)), he is also a juggling enthusiast. When I saw his juggling open space in progress, I couldn't resist stopping. I juggled for the first time in probably decades! It was also great to catch up with Paul Ganssle (Google, CPython Core Dev, pytz maintainer), and meet Rob Ludwick (Bank of NY Mellon) and William Higgins (Consumer Financial Protection Bureau). + +![](pycon-us-2024-recap-images/me-juggling.png) + +[Video](https://www.youtube.com/shorts/TJfENk2653c) of me juggling! + +🔝 [**back to top**](#table-of-contents) + +### Hallway Track and Expo Hall + +It was great to see Jacob Kaplan-Moss (early Django Engineer) and Frank Wiles (RevSys, former DSF President) again. + +I saw Glyph Kefkowitz's badge and immediately knew he was probably the same Glyph ([Twisted](https://twisted.org/) Project Leader) I'd come across on social media. I learned more about Twisted when Amber Brown gave a keynote at DjangoCon US US 2019 "[The Natural State of Computers](https://2019.djangocon.us/talk/keynote-amber-brown/)". Glyph and I talked about the role of Twisted in the async world and the possibility of using Twisted for async orchestration. + +Speaking of my DjangoCon US 2017 talk, Russell Keith-Magee (Beeware Founder, former DSF President, prolific public speaker) was my speaker mentor at the time. At PyCon US 2024, I had the chance to catch up with him before the PyLadies Auction. I congratulated him on the acceptance of [PEP 730: Adding iOS as a supported platform](https://peps.python.org/pep-0730). Python now runs on iOS without a patch! Russell's [Beeware](https://beeware.org/) Project enables you to write an app in Python and release it on multiple platforms, including desktop and mobile! Check out his PyCon US 2019 [Python Black Swans Keynote](https://www.youtube.com/watch?v=ftP5BQh1-YM)) and many Beeware talks. + +🔝 [**back to top**](#table-of-contents) + +### PyLadies Auction + +The [PyLadies Auction](https://us.pycon.org/2024/events/pyladies-auction/) is always a roaring good time. + +Not long after I sat down, I was excited to see Reuven Lerner ([Python Trainer](https://lerner.co.il/)) walking past. He sat down next to me, and it was a pleasure to get to know him. I also enjoyed chatting with Danielle Casper (Amazon) about systems engineering and with Scott Karlin (Princeton). + +A cuckoo clock donated by Capital One sold for $3,400. A "stupid" pen sold for $700. + +The auction raised $60,000, $15,000 more than it ever had before. The community showed up in a big way! + +![](pycon-us-2024-recap-images/hats.jpg) +[CPython Release Stream](https://www.youtube.com/watch?v=PGZPSWZSkJI) participants showing off their hats + +![](pycon-us-2024-recap-images/giant-guido.jpg) +A miniature cutout of Guido for selfies and rubber duck debugging :) + +Thank you to my friends Jackie Kazil (Bana Solutions, Project Mesa), Lorena Mesa (Netflix, PyLadies Chicago), and Lynn Root (Spotify) for all of the hard work they put into the auction this year and every year, and to Doug Napoleone for emceeing and Kushal Das for taking pics! + +A PyLadies Grant helped me attend PyCon US 2019. + +![](pycon-us-2024-recap-images/me-and-jackie.jpeg) +Me and Jackie Kazil :) + +🔝 [**back to top**](#table-of-contents) + +## Sunday + +### Posters + +I started Sunday morning by checking out all of the posters. + +🔝 [**back to top**](#table-of-contents) + +### Ethan Smith + +Ethan Smith (Nvidia, formerly Sentry) and I have been following each other on social media for a while. We met in person and talked about his packaging work at Nvidia. + +He was working on a draft Packaging PEP (Python Enhancement Proposal) "Supporting Symlinks in Wheels" sponsored by Barry Warsaw. + +🔝 [**back to top**](#table-of-contents) + +### PyLadies Lunch + +On Sunday, I attended the [PyLadies Luncheon](https://us.pycon.org/2024/events/pyladies-lunch/). It was wonderful, as usual. + +Thank you to Marie Roald, Sydney Runkle (Pydantic), Kim Tendulkar, Erika Ambrosio (Tampa Bay Lightning), Sierra Brown, Grace (Muck Rack) (and a few others whose names I did not catch) for a really wonderful conversation over lunch. + +I learned from Sydney who leads open source at Pydantic that [Pydantic](https://docs.pydantic.dev/latest/) is often used with Django Rest Framework. I am looking forward to learning more! Check out Sydney's PyCon US talk "[Pydantic Power-up: Performance Tips for Lightning-Fast Python Applications](https://us.pycon.org/2024/schedule/presentation/84/)". + +![](pycon-us-2024-recap-images/pyladies-luncheon.jpg) +Lynn Root, PyLadies Global Council, addressing the crowd + +![](pycon-us-2024-recap-images/pyladies.jpg) +PyLadies Booth in the Expo Hall + +![](pycon-us-2024-recap-images/pyladies-t-shirt.jpg) +Beautiful PyLadies t-shirt :) + +🔝 [**back to top**](#table-of-contents) + +### Building a JIT compiler for CPython + +Brandt Bucher (Microsoft CPython Performance Engineering Team) + +![](pycon-us-2024-recap-images/jit-compiler-background.png) +Updates that provided the foundation for a copy and patch JIT Compiler. + +In Python 3.13, a [JIT Compiler](https://peps.python.org/pep-0744/) was implemented. This was only possible, because of the work done in Python 3.11 and 3.12. + +In Python 3.11, a [Specializing Adaptive Interpreter](https://peps.python.org/pep-0659/) was implemented that brought a 25% performance improvement on average. At PyCon US 2023, Brandt gave a talk about it "[Inside CPython 3.11's new specializing, adaptive interpreter](https://www.youtube.com/watch?v=shQtrn1v7sQ)". + +In Python 3.12, infrastructure was implemented to automatically generate an interpreter from a DSL spec. This allowed for some repetitive, tedious, error-prone boilerplate to be removed from the main interpreter loop and different bytecode instructions to be analyzed. + +In Python 3.13, a second ["micro-op" interpreter](https://github.com/faster-cpython/ideas/issues/580) was implemented. It's an entirely separate execution pipeline that detects hot code paths and lowers them to a new bytecode format called "micro-ops." They are optimized and executed in another dedicated interpreter. + +Brandt showed how the pipeline works using a Fibonacci function as an example. He showed the code, the code's bytecode, and the stack. + +![](pycon-us-2024-recap-images/jit-compiler-fibonacci.png) +Fibonacci code + +This is where specialized bytecode comes in. If the operation is generalized to accommodate many use cases, but the code's actual use case is simple, the bytecode can be "specialized" to fit that simpler use case. The resulting bytecode instructions are more specific to the the actual values, types of the code. + +![](pycon-us-2024-recap-images/jit-compiler-specialized-bytecode.png) +Implementing specialized bytecode + +These instructions will now be broken down into smaller, more easily optimized parts called "micro-op traces." Instructions that are necessary in some cases, but not this case, can be removed. The result will be the essential instructions to execute the code. + +![](pycon-us-2024-recap-images/jit-compiler-micro-op-traces.png) +"micro-op traces" + +Unfortunately, this new instruction format is more complex than basic bytecode instruction. Although each instruction is doing less work, there are more instructions. This is 20% slower than if we'd done nothing. Decoding each individual instruction in the micro-op interpreter is a lot more expensive. + +That is where JIT compilation comes in. + +Rather than decoding individual instructions in the interpreter, we can compile these optimized traces directly into machine code. + +![](pycon-us-2024-recap-images/jit-just-in-time-compilation.png ) +Just-in-time compilation + +Python frame objects live out in heap memory. Instead, the stack can be moved to the register where it is immediately available and there is no latency. Rather than having a generic interpreter that needs to handle every possible micro-op, the hot code path can be transformed in a straight line sequence of the exact code needed. + +Although we want to make the faster, we need to trade peak performance for implementation simplicity that can enable Python to run in many places with few runtime dependencies and be easily maintained, improved, and extended upon by volunteers. + +While JIT compilers are historically complex, copy and patch compilation meets these requirements satisfying way. + +The technique is explained in a 30 page paper "[Copy and Patch Compilation](https://sillycross.github.io/assets/copy-and-patch.pdf)" and a blog post "[Building a baseline JIT for Lua](https://sillycross.github.io/2023/05/12/2023-05-12/)" by the same author. + +In a nutshell, it's a way of automatically turning a C interpreter into a fast template JIT compiler + +Copy and patch can enable us to take a sequence of bytecode instructions and translate it into fast machine code as quickly as possible. + +At runtime, walk over a sequence of bytecode instructions. For each, we can do something we have long been able to do when linking or reloading a relocatable object file +* Copy some static, pre-compiled machine code into executable memory +* Patch up instructions that need to have runtime data encoded into them (things like relocation records for extern symbols) + +Brandt walked through an example of how to go from micro op instruction to code we JIT at runtime. + +At build time, when we are building the Python interpreter, the body of the instruction is extracted. It is put inside of its own function to be compiled in isolation. It won't compile yet, because we are accessing objects with no values. These can be dynamically passed into the function as arguments. In terms of the "undefined locals" that will be the same once JIT-ed, and the frame and pointer that needs to be passed on so that we can JIT any additional micro-ops that we are JIT-ing, copy and patch gives an elegant solution for handling these: externs. Externs are similar to Python imports. You trust them to be defined at runtime. + +![](pycon-us-2024-recap-images/jit-externs.png ) +externs + +When compile this in Clang, the ELF file will have the raw bytes of machine code to execute the micro-op instruction and exactly where and how to patch values. + +We then have the opportunity to perform some localized optimizations until it is the essential micro-op. This can be parsed out of the ELF file and put directly into code generated in a C header file. We have a function that can be called and it will JIT the instruction for us by copying bytes and patching the load. + +This is super fast. + +Because [LLVM](https://llvm.org/) is used, there is a lot of platform support out of the box. + +In order to build this yourself, you need to have LLVM 18 installed and follow the instructions in the CPython repo. + +🔝 [**back to top**](#table-of-contents) + +### Unlocking the Parallel Universe: Subinterpreters and Free-Threading in Python 3.13 + +Anthony Shaw created a [gist](https://gist.github.com/tonybaloney/24d545ed855a3c90f844209152835f07) with the excellent pre-requisites for his talk. + +![](pycon-us-2024-recap-images/anthony-parallel-execution-in-python.png) +Parallel execution options in Python; In concurrency, multiple tasks share the same resource, while in parallelism, multiple resources execute multiple tasks. + +In Python 3.11, the GIL lived in the interpreter and we had one GIL per Python process. Multi-processing was used to achieve parallel code execution. If a task were split in half, it would take twice as long, because only one process could run at a time. + +In Python 3.12, because of a new API, the GIL is per interpreter. We can have multiple interpreters running at the same time with multiple threads. The operating system will figure out which core is available and schedule so they run in parallel. + +![](pycon-us-2024-recap-images/anthony-speed-differences.png) +Speed differences + +Quick conclusion: a subinterpreter is like "multiprocessing with less overhead and shared memory" + +In Python 3.13, we can disable the GIL and have a single interpreter running multiple threads at the same time. A task split in half will run more quickly now, because it will run in parallel. + +![](pycon-us-2024-recap-images/anthony-gil-removal-steps.png) +Steps to remove GIL + +Free-threading introduces a new ABI that requires special wheels and a special build for CPython, creating compatibility issues. The ABI (application binary interface) is used to load a module that is being compiled in a language like C. + +The GIL exists for thread-safety. We need to fix all of the C code that assumed the GIL existed and is not thread safe. + +If everything is in pure Python, the Python team has full control over the interpreter. C extension compatibility poses a major challenge. Ironically, we have so many C extensions, because people optimized code, because they couldn't run it in parallel. + +At the moment, disabling the GIL generally makes Python code run slower. There are optimizations that have been disabled when the GIL is turned off, because they need to be made thread-safe before they can be used. + +Anthony gave a demo followed by some closing thoughts with Terms and Conditions. + +![](pycon-us-2024-recap-images/anthony-terms-and-conditions.png) +Terms and conditions + +🔝 [**back to top**](#table-of-contents) + +### Sync vs. Async in Python: Tools, Benchmarks, and ASGI/WSGI Explained + +This talk by Arun Suresh Kamar was going on while I was in Anthony's talk. It is at the top of my list to watch on demand. + +🔝 [**back to top**](#table-of-contents) + +### Sumana Harihareswara Keynote + +"Untold Stories from Six Years Working on Python Packaging" + +I met Sumana (Changeset Consulting, Python packaging, Recurse Center) at PyGotham 2017 and attended the [Art of Python](https://pycon-archive.python.org/2019/hatchery/artofpython/) miniature arts festival that she organized at PyCon US 2019. It was wonderful to see her in her element at PyCon US 2024, on stage talking about Python packaging. + +From 2017 to 2022, Sumana was a paid packaging project manager. She worked on things we use a lot, like pip. + +Key takeaways +* A chance meeting led Sumana to help obtain funding from Mozilla and overhall PyPI to Warehouse, finishing on time and on budget and unblocking more improvements +* The strength of weak ties, cross pollination are possible because of the kind of conversations that happen at places like PyCon US +* Infrastructure is hard, it's often invisible. People depend on it, but don't know that they depend on it. Sumana compared it to being a water user. +* If volunteers try to get the word out about changes and even ask for your feedback, treat them like people. We are all in this together. +* When PSF gets funding, it gets results (see a list in the [PyPI sponsors page](https://pypi.org/sponsors/)) +* Organizations that rely on this infrastructure (and may have entitled opinions) can do a lot more to help +* What seems like failure can prepare the ground for success: building organization, networks, knowledge, skill can be crucial for future successes you can't foresee at the time +* Sumana revised a bill to the NY City Council until it passed: The HEART Act to make Automated External Defibrillators more accessible to New Yorkers. +* She wasn't a Python packaging expert, but also wasn't a public health expert. She planned and asked the right question until she got an answer. +* You too can be the paddles that revive something that is stuck, in open source, local government + +Homework +* Renew a connection: reply to an old friend or colleague +* Practice [Volunteer Responsibility Amnesty Day](volunteeramnestyday.net): on June 20th have a 20 minute meeting with yourself to think about your choices +* Consider solidarity + +Sumana created a page with all of her excellent [keynote references](https://harihareswara.net/posts/2024/references-pycon-us-keynote/). + +I got to say hello after the keynote and also had the chance to meet her husband Leonard Richardson, who authored [Beautiful Soup](https://beautiful-soup-4.readthedocs.io/en/latest/), another one of my favorite packages. :) + +Leonard handed me a mini-zine called "Tool Safety" that he had written. After I got home and started looking through it, I saw that it had a beautiful message. You can see the online version [here](https://www.crummy.com/software/BeautifulSoup/zine/). + +![](pycon-us-2024-recap-images/tool-safety-zine.jpg) +Tool Safety mini-zine cover and page 3 + +As a bonus, before the talk began, I met Brian Walker who was sitting in my row. He's a "Digital Billboard Jedi Master" software engineer working at Watchfire. + +🔝 [**back to top**](#table-of-contents) + +### Steering Council Updates + +Current Python Steering Council Members: Emily Morehouse (Cuttlesoft), Barry Warsaw, Pablo Galindo Salgado, Thomas Wouters (Google), Gregory P. Smith (To be determined) + +🔝 [**back to top**](#table-of-contents) + +#### Barry Warsaw: Steering Council Overview + +The steering council is a five-person elected governance body responsible for the technical direction of Python: the evolution of the Python language, the CPython interpreter, and standard library. Elections happen annually, roughly aligned with Python releases. + +Steering council members serve for one year and can run for re-election with no term limits. They are typically nominated and elected by CPython Core Devs, but you don't have to be a CPython Core Dev to serve. No more than two members can work for the same company. + +The steering council meets almost every week for 90 minutes. They are regularly joined by Deb Nicholson and Łukasz Langa. They discuss many topics which often come to their attention through the public GitHub tracker. A few of their important tasks: determining release cycle, choosing next release manager, pronouncing PEPs. The steering council has the final say on PEPs. + +[PEP 13](https://peps.python.org/pep-0013/) outlines how the Python Steering Council operates. + +🔝 [**back to top**](#table-of-contents) + +#### Gregory P. Smith: Steering Council Expenditures Update + +How the steering council has spent PSF money to improve CPython +* Developer in Residence (team of 3 now: Łukasz Langa, Petr Viktorin, Serhiy Storchaka) +* Security Developer in Residence: Seth Michael Larson +* Steering Council Secretary: offer recently extended to Velda Kiara +* Annual Core Developer Sprints + +🔝 [**back to top**](#table-of-contents) + +#### Emily Morehouse: Councils and Working Groups Update + +Firstly, Emily explained their role. As Python evolves, the requirements for helping change. Councils and working group members are experts in complex, specialized subjects. These groups report to the steering council and are able to help with decision making and management, such as reviewing and pre-approving PEPs. + +Three working group changes +* [PEP 732: The Python Documentation Editorial Board](https://peps.python.org/pep-0732/) +* [PEP 731: C API Working Group Charter](https://peps.python.org/pep-0731/) (CPython's API exposes certain aspects of Python internals and gives direct access to the Python interpreter from C and C++) +* [PEP 729: Typing Governance Process](https://peps.python.org/pep-0729/) + +The C API Working Group has a new [repo](https://github.com/capi-workgroup). + +🔝 [**back to top**](#table-of-contents) + +#### Thomas Wouters: Overview of Python 3.13 + +Thomas Wouters, Python 3.12 and 3.13 Release Manager, gave an overview of 3.13 + +Breaking changes +* [PEP 594: Removing dead batteries from the standard library](https://peps.python.org/pep-0594/) (might put some back if too disruptive) +* Removed many deprecated functions and classes +* "Removed" many private C functions + +Type Annotation +* [PEP 696: Type Defaults for Type Parameters](https://peps.python.org/pep-0696) (James Hilton-Balfe) +* [PEP 702: Marking deprecations using the type system](https://peps.python.org/pep-0702/) (Jelle Zijlstra) +* [PEP 705: TypedDict: Read-only items](https://peps.python.org/pep-0705/) (Alice Purcell) +* [PEP 742: Narrowing types with Typels](https://peps.python.org/pep-0742) (Jelle Zijlstra) + +Platform Support +* [PEP 602: Annual Release Cycle for Python](https://peps.python.org/pep-0602/) (Łukasz Langa) +* [PEP 730: Adding iOS as a supported platform](https://peps.python.org/pep-0730/) (Russell Keith-Magee) +* [PEP 738: Adding Android as a supported platform](https://peps.python.org/pep-0738/) (Malcolm Smith) +* macOS on Apple Silicon (M1/M2/M3) is now Tier 1 + +Despite saying there are no major new features in Python 3.13, Thomas acknowledged some exciting new developments. +* A new interactive interpreter based on PyPY's, with color, multi-line editing, and paste support +* [PEP 744: JIT Compilation](https://peps.python.org/pep-0744/) (Brandt Bucher) +* [PEP 703: Making the Global Interpreter Lock Optional in CPython](https://peps.python.org/pep-0703/) (Sam Gross) + +![](pycon-us-2024-recap-images/jit.png) + +Why even upgrade? +* Improved error messages (again) +* Many bug fixes (not all of them can be backported to 3.12) +* Many new features in standard lib modules +* Stepping stone for future improvements +* Discover what newly deprecated APIs you are using + +The 3.13 beta is out now! See the full release notes at [What's New in Python 3.13](https://bit.ly/python313). + +Thomas noted that incoming release manager Hugo van Kemenade has proposed switching to CalVer. He gave a talk "[Should Python adopt CalVer](https://hugovk.github.io/python-calver/)" at the Language Summit. + +🔝 [**back to top**](#table-of-contents) + +#### Pablo Galindo Salgado: Free-Threading Update (a.k.a. No GIL) + +Pablo outlined the free-threading plan. + +![](pycon-us-2024-recap-images/python-steering-council-free-threading-the-plan.png) +The plan + +![](pycon-us-2024-recap-images/python-steering-council-free-threading-phase-1.png) +Experimental phase + +![](pycon-us-2024-recap-images/python-steering-council-free-threading-phase-2.png) +Supported, but not default + +![](pycon-us-2024-recap-images/python-steering-council-free-threading-phase-3.png) +Making it default + +![](pycon-us-2024-recap-images/python-steering-council-free-threading-community-support.png) +Community + +Closing thoughts +* The CPython Core Team will regularly assess progress and work to prevent prolonged backward compatibility struggle +* If things become problematic, it can be called off +* Lessons have been learned. This will be neither Python 2 to 3, nor Python 4. +* Free-threading is available on Python 3.13 with an optional flag and environmental variable + +![](pycon-us-2024-recap-images/python-steering-council-one-more-thing.png) + +This thing is really happening. It feels like we went from Brett Cannon's "put up or shut up" to this pretty quickly, lol. + +🔝 [**back to top**](#table-of-contents) + +### Dinner and Ice Cream + +After the conference ended on Sunday night, I found myself chatting with a group of old friends and new friends. They invited me to dinner, and I decided to join. It was a wonderful time, as you can tell from the photo. :) + +![](pycon-us-2024-recap-images/sunday-night.jpeg) +Tammy Do (Code Fellows), Velda Kiara (DEFNA Board Member, Python Steering Council Secretary), Jim Anderson (Motorola Solutions, Real Python), Ngazetungue Muheue (LaLoka Labs, DjangoCon Africa), Kudzayi Bamhare, Benedict Kofi Amofah, me, Afi Gbagado, and Catherine Devlin (Corning, formerly Disney) + +![](pycon-us-2024-recap-images/chocolate-bar.jpg) +Chocolate bar made by a Ghanian company and given to me by Afi :) + +PyCon US had a [challenge](https://us.pycon.org/2024/about/pycon-us-challenge/). You could get points for completing certain activities and redeem them for an ice cream card. I was able to complete the challenge, because I had organized a Python-related conference (DjangoCon US 2023) and attended a regional Python conference (PyTexas 2024) since last PyCon US. After dinner, I went to [Milley's Homemade Ice Cream at Market Square](https://www.millieshomemade.com/location/market-square/) and used the ice cream card. I had Best Chocolate. Yummy! + +![](pycon-us-2024-recap-images/ice-cream.jpg) +Best Chocolate :) + +🔝 [**back to top**](#table-of-contents) + +## Monday + +At PyCon US 2019, on my last night in Cleveland, I spontaneously joined Sviatoslav Sydorenko (Ansible Core Developer), Stéphane Wirtel (CPython Core Developer), and a few other conference attendees at Flannery's Pub for dinner. It was magical. + +On the first day of the PyCon US 2024 Sprints, Sviatoslav Sydorenko and I found each other for a catch up. I suddenly made the connection that he is a core developer of [Ansible](https://github.com/ansible), a tool that I use. Mind blown. :) He gave me some insight about being a programmer versus engineer and distributed systems. It was a very enlightening conversation for me. + +I also met Seth Michael Larson (PSF Security Developer in Residence) in person in the packaging sprints room. I have been following his security work, which has included [Visualizing the CPython release process](https://sethmlarson.dev/security-developer-in-residence-weekly-report-9), [making CPython source release Software Bill-of-Materials (SBOMs) available](https://pyfound.blogspot.com/2024/02/software-bill-of-materials-now-available-for-cpython.html), and [getting the PSF set up as a CVE Numbering Authority](https://www.cve.org/Media/News/item/news/2023/08/29/Python-Software-Foundation-Added-as-CNA). He told me more about his background and work. His [blog](https://sethmlarson.dev/) is an awesome source of info, and I highly recommend following him for news! + +Interactions like these brought to mind a post by Frank Wiles: + +![](pycon-us-2024-recap-images/frank-post.png) + +🔝 [**back to top**](#table-of-contents) + +## Until Next Time + +Thank you to everyone for making this a truly epic experience. The talk replays should be public soon. + +If you are looking for another conference experience, check out the mega-regional conference list in the closing presentation. + +After chatting with a PSF Staff Member a few years ago about location selection, I assumed that PyCon US would never be held in a high cost of living city. + +It was announced that PyCon US 2026 will be in Long Beach, California. + +Last year, I treated myself by taking [my dream Los Angeles vacation](https://katherinemichel.github.io/portfolio/los-angeles-2023.html) in December. I loved it, and I can't wait to go back for PyCon US! :) + +In the meantime, I hope to see you all in Pittsburgh next year! + +![](pycon-us-2024-recap-images/badge.jpg) + +🔝 [**back to top**](#table-of-contents) diff --git a/_sources/pygotham-2019-recap.md.txt b/_sources/pygotham-2019-recap.md.txt new file mode 100644 index 00000000..62d4b363 --- /dev/null +++ b/_sources/pygotham-2019-recap.md.txt @@ -0,0 +1,366 @@ +# PyGotham 2019 Recap + +Published: July 20, 2020 + +### Description + +PyGotham 2019 took place at Hotel Penn in New York City last fall. While sheltering-in-place, Eldarion’s Katherine Michel looked back at the wonderful experience she had there and looks forward to returning to a conference and city she loves. + +### Blog Post + +![](pygotham-2019-recap-images/statue-of-liberty-and-south-manhattan.jpg) + +While riding the ferry to Liberty Island, looking back at the Statue of Liberty and South Manhattan; photo credit: Katherine Michel + +### A Powerful Call-to-Action + +[PyGotham](https://2019.pygotham.org/), New York City's regional Python conference, took place again last fall at the historic [Hotel Pennsylvania](https://en.wikipedia.org/wiki/Hotel_Pennsylvania), in the heart of Manhattan. I've been fortunate to have been able to attend PyGotham every year for the past three years. + +The content at PyGotham is excellent and I always find myself struggling to choose which talk to attend (fortunately, the videos are [published online](https://www.youtube.com/channel/UCTFmuFVfQA8Fl2SzKERFodQ/videos)). + +But what stood out to me the most this year, was the collective call-to-action to make the tech community a place where everyone can feel a sense of belonging and thrive. + +I felt this call-to-action in several ways: + +In addition to open captioning, every PyGotham talk was interpeted in [American Sign Language](https://2019.pygotham.org/about/accessibility/#hearing-accessibility). + +The three keynotes, "[Python Use Spectrum](https://2019.pygotham.org/talks/keynote-the-python-use-spectrum/)" by Kojo Idrissa, "[Accepting your successes](https://2019.pygotham.org/talks/keynote-accepting-your-successes/)" by [Piper Thunstrom](https://twitter.com/pathunstrom), and "[Because Equity: Python FTW](https://2019.pygotham.org/talks/keynote-because-equity-python-ftw/)" by [Meg Ray](https://twitter.com/teach_python), were about welcoming people on the fringes into the community and making them feel valued, for the greater good of all. + +I felt inspired by a talk by [Froi Irizarry Rivera](https://twitter.com/froidotdev) and [José Padilla](https://twitter.com/jpadilla_) called "[Python, Governments, and Contracts](https://2019.pygotham.org/talks/python-governments-and-contracts/)," in which they told of their feeling of helplessness as they watched a hurricane ravage Puerto Rico and how they had spontaneously channeled their frustration into an appeal for grassroots volunteers who have now created powerful tools to root out corruption. + +And during my own visit to the [Statue of Liberty](https://en.wikipedia.org/wiki/Statue_of_Liberty) and [Ellis Island](https://en.wikipedia.org/wiki/Ellis_Island), I watched Ranger Jenn re-enact the impassioned stories of people who had arrived at Ellis Island as prospective immigrants. She told of the extreme adversity many had faced to be accepted in the United States. More about that later in this blog post. + +All converged into one interwoven experience that felt very fitting in such a diverse city. + +### A Note About American Sign Language at PyGotham + +Approximately a month before PyGotham, I attended an event at [Strange Loop](https://www.thestrangeloop.com/) conference in St. Louis where a deaf woman named [Mel Chua](https://twitter.com/mchua) was a featured speaker. Mel is an electrical computer engineer with a background in free open-source software (FOSS), large-scale distributed engineering team collaboration, and engineering education culture. + +Mel told her story, primarily through American Sign Language. I'm embarrassed to say, this was the first time I can remember ever having seen sign language interpretation happen in real life. + +Having grown up loving math, science, and computers, Mel wanted to join the "beautiful" tech world. But she wanted to leave behind the things that made her not fit in. Eventually she realized that by being her true self and becoming what tech looks like, she could make the tech community more welcoming for people like her and impact the perceptions of others. Cultures form in response to the people in them, she pointed out. + +Mel gave a call to action during her message, to see tech as one culture. "Let’s hack it together, and remake it in the image of all of us," she said. + +After having heard Mel's powerful message at Strange Loop, it made me happy to see her at PyGotham, along with a group of other deaf developers, making use of the services of the American Sign Language interpreters. + +[A. Jesse Jiryu Davis](https://twitter.com/jessejiryudavis) wrote "[PyGotham 2019's ASL and Live Captioning Playbook](https://emptysqua.re/blog/pygotham-2019-asl-live-captioning-playbook/)" in the hopes that it will be used to make other conferences accessible for the Deaf and hard-of-hearing. + +![](pygotham-2019-recap-images/members-of-the-deaf-community.jpg) + +Members of the Deaf community at PyGotham; photo credit: A. Jesse Jiryu Davis (used with permission) + +### Friday + +#### Python Use Spectrum + +I was thrilled that the conference kicked off with a keynote about the "[Python Use Spectrum](https://2019.pygotham.org/talks/keynote-the-python-use-spectrum/)" by Kojo Idrissa! + +Kojo is a [DjangoCon US](https://2019.djangocon.us/) Organizer, former [DEFNA](https://www.defna.org/) Board Member, and currently DEFNA North American Ambassador. DEFNA is the non-profit that oversees DjangoCon US (disclosure, I'm a DEFNA Board Member and DjangoCon US Website Co-Chair). DEFNA also provides small amounts of funding for Django events in North America. As a fellow organizer, Kojo extended an official "hello" and group hug to the PyGotham organizers from the DEFNA Board and DjangoCon US team. Thank you, Kojo! + +Kojo's talk was about how we, as a community, can ensure that as Python grows in use, the number of contributors and the skillset of contributors grow as well. + +![](pygotham-2019-recap-images/kojo-burnout-is-real.png) + +Kojo Idrissa; photo credit: Casey Faist (used with permission) + +[CPython](https://github.com/python/cpython), the most popular implementation of the Python interpreter, is an open-source project developed primarily by volunteers. Burnout is a real possibility. As projects like CPython grow, they also need skills beyond coding, that are not taught in traditional CS programs. + +Kojo showed us what he calls the Python Use Spectrum. On one end of the spectrum is programmer. On the other end is software engineer. Data scientist is somewhere in the middle. + +A programmer might be working alone, using just Python to solve a problem. Perhaps he or she is a professional making a tool to improve their workplace, or a hobbyist making a video game or a website. + +On the other hand, a software engineer tends to be a member of a team, using special tools and a process to ship code professionally. The code itself is the product and might be used by other people. + +![](pygotham-2019-recap-images/kojo-why-does-this-matter.jpg) + +Kojo Idrissa; photo credit: Casey Faist (used with permission) + +Kojo believes that the Python community has developed a strong bias toward software engineering as the "one true way of writing code" and that this is detrimental to the community. + +In reality, everyone on the spectrum is using Python to solve problems and all are potential contributors to the Python ecosystem. One way that we can actively work to increase the number of contributors and the skill set of contributors is by embracing and valuing all members of the community, regardless of where they are on the spectrum. + +![](pygotham-2019-recap-images/kojo-call-to-action.png) + +Kojo Idrissa; photo credit: Casey Faist (used with permission) + +### Friday Talks + +As a [Pinax](https://github.com/pinax) Maintainer, I find that talks I can apply to my work particularly resonate with me. There were several such talks on Friday. + +[Hynek Schlawack](https://twitter.com/hynek) is a CPython Core Developer and maintainer of many open-source projects. In his talk, "[Maintaining a Python Project When It's Not Your Job](https://2019.pygotham.org/talks/maintaining-a-python-project-when-its-not-your-job/)," Hynek explained how a maintainer with limited time can publish a high quality Python package, that as much as possible leverages the contributions of others. Even though the title suggests it's for volunteer maintainers, the talk included lessons that could be useful to just about any maintainer. Hynek has made a fine science out of creating a welcoming environment for all prospective contributors, removing the fiction from the contribution process, and automating the package continuous integration and release process. This process has also been helpfully documented in an [outline on his blog](https://hynek.me/talks/python-foss/). I particularly liked that the talk went beyond a list of tips, to focus more on the psychology of motivation and time, and the tools and configurations he uses. + +I found myself completely engrossed in [Mason Egger](https://twitter.com/masonegger)'s high-energy talk, "[Building Docs Like Code: Continuous Integration for Documentation](https://2019.pygotham.org/talks/building-docs-like-code-continuous-integration-for-documentation/)." Mason is a self-described "documentation fanatic" who believes that developers dislike writing code because they have to context-switch out of the code writing tools that they love in order to write docs in a workflow they don't love. Empowering developers to document within a workflow they already know and love can result in beautiful, uniform docs. Mason believes we should treat documentation like code... store it in version control alongside the code it documents, write it with markup language, review and test it with the same granularity as code to ensure it is accurate and functional, and auto-publish it. Mason did a review of documentation types and tools, including [Sphinx](http://www.sphinx-doc.org/) and [MkDocs](https://www.mkdocs.org/). He also gave a case study and demo showing how he created a docs pipeline. + +Going on at the same time as Mason Egger's talk was "[How I Solved my NYC Parking Problem with Python](https://2019.pygotham.org/talks/how-i-solved-my-nyc-parking-problem-with-python/)," by [Jessica Garson](https://twitter.com/jessicagarson). I was particularly interested in this talk because Jessica created a fun app to solve her own problem, something I'd like to do more of myself. Jessica lives in Brooklyn and used to have a car. Because of alternate side of the street parking restrictions, every night at 9 o'clock, she would move her car to avoid an expensive parking ticket. She was spending a lot of time looking for a new parking space, sometimes overlooking that she didn't need to, due to a holiday. So, she built an app that would let her know when she didn't need to move her car! Twice a day, a cron job runs the app. Using a [Twitter Premium Search endpoint](https://developer.twitter.com/en/docs/tweets/search/api-reference/premium-search), when the words "suspended" and "tomorrow" show up in a tweet from the [NYC Alt Side Parking Twitter account](https://twitter.com/NYCASP), [Twilio](https://www.twilio.com/) sends her a text message letting her know she doesn't need to re-park. Very cool! + +### Accepting Your Successes + +Saturday kicked off with a keynote by [Piper Thunstrom](https://twitter.com/pathunstrom): "[Accepting your successes](https://2019.pygotham.org/talks/keynote-accepting-your-successes/)." + +![](pygotham-2019-recap-images/piper-accepting-your-success.png) + +Piper Thunstrom; photo credit: Casey Faist (used with permission) + +I first heard Piper speak at PyGotham 2017 when I attended her talk "[Monkey Patching My Life- Being a Trans Python Developer](https://youtu.be/FYcwyec7HS8)." + +In Piper's own words, she's "A domestic violence survivor, a trans woman, a game developer, and a book editor that struggles with suicide ideation and loves her community." + +In her keynote, Piper walked us through the difficult times in her life, and how she came out on the other side having found the Python community and achieved success. + +I found it very poinant when Piper said that she stands on stage vulnerably, because she is reaching out to her own self of 10 or 20 years ago, "The little kid who will be going through a world of hurt." She needed for other people to do that for her. She is also doing it for her current friends who haven't reached out. + +In my opinion, her ability to be a role model and voice for other trans members of the community and victims of trauma, could be her most important form of success, and a source of healing for her. + +I think Piper's own words best sum up the lessons of her talk: + +"Every one of us has something to contribute to our community. If you've been around, you should look for people you don't recognize and new faces and help lift them up. + +Stop treating societal expectations as success metrics: write your own success story and learn to recognize when success doesn't look like you imagine. + +If you're struggling with your mental health: you're not alone. Don't be afraid to reach out to those around you." + +### Python, Governments, and Contracts + +On Saturday, I spent a lot of time in the "hallway track." But there was one talk I did attend that I found particularly important. It was "[Python, Governments, and Contracts](https://2019.pygotham.org/talks/python-governments-and-contracts/)," by [Froi Irizarry Rivera](https://twitter.com/froidotdev) and [José Padilla](https://twitter.com/jpadilla_). + +In 2017, Hurricane Maria, a category 4 storm, made landfall in Puerto Rico and devastated the island. Feeling helpless as they worried about their families back home, Froi and José decided to do something. They started the [Maria Tech Brigade](https://github.com/SoPR/maria-tech-brigade-effort). In two or three weeks, through grassroots organizing, they were 300 volunteers strong. + +Froi and José soon became aware of the website of the [Oficina de la Controlar de Puerto Rico](https://www.ocpr.gov.pr/). Contracts made by government entities to other government entities or contractors are published there. The Puerto Rican Power Authority has had a number of suspicious contracts over the past two years. + +![](pygotham-2019-recap-images/froi.png) + +Froi Irizarry Rivera; photo credit: Casey Faist (used with permission) + +Froi and José found that the controller website has a terrible user experience. The site data is neither open nor usable. Users have to download documents one at a time. There is no real API. The contract documents are sometimes missing. The search functionality is rudimentary. The document content is not searchable. The pagination is broken. No real insights or data visualization tools are provided. + +Froi and José began to build their own tool [Contrato PRA](https://contratospr.com/) to help journalists and interested citizens investigate corruption. + +The batteries included philosophy of [Django](https://www.djangoproject.com/) and the third-party extensions in the Python and Django ecosystem enabled them to get the project up and running as quickly and cost effectively as possible. + +The project was split into two parts: a REST API built with [Django REST Framework](https://www.django-rest-framework.org/), [Python](https://www.python.org/), [Redis](https://redis.io/), [Celery](http://www.celeryproject.org/), [Docker,](https://www.docker.com/) and [Postgres](https://www.postgresql.org/); and a front-end, which users can access the API data through, built using a [React](https://reactjs.org/) framework called [Next](https://nextjs.org/). + +Froi and José used JSON endpoints and self-throttling to optimize data collection, without negatively affecting the controller site. In the Contrato PRA site, documents and their contents are now searchable and the data can be visualized by category. + +Sadly, the work is not done, because the consequences of mismanagement and corruption are still ongoing and Puerto Rico has suffered additional natural disaster. + +They have met their goal of collecting the million contract documents on the website. They have also explored ways of making their scraping logs and project financials transparent. They want to collect input from journalists and members of the data science community to help improve the site. And they are interested in finding sponsorship for the $60/month cost of running the project. + +If you are interested in the project or would like to contribute, reach out to them! + +### Closing Keynote + +The conference closed with a keynote by [Meg Ray](https://twitter.com/teach_python): "[Because Equity: Python FTW](https://2019.pygotham.org/talks/keynote-because-equity-python-ftw/)." + +Meg's keynote at PyGotham was very timely. She had recently been [awarded a PSF education grant](http://pyfound.blogspot.com/2019/09/grants-awarded-for-python-in-education.html) to create an open-source, PSF landing site for Python education. Meg wants to bring together Pythonistas who are interested in education and educators interested in Python. And she's looking for contributors! Reach out to her if you are interested. + +![](pygotham-2019-recap-images/meg-python-education-website.png) + +Meg Ray; photo credit: Casey Faist (used with permission) + +According to the Association for Computer Machinery report "[Running on Empty](https://runningonempty.acm.org/)," lack of access to computer science education or privileged knowledge in US K-12 schools is a significant social justice issue. + +![](pygotham-2019-recap-images/meg-social-justice-issue.png) + +Meg Ray; photo credit: Casey Faist (used with permission) + +Meg's talk explored ways to bring computer science education to every student. + +There are a variety of obstacles that prevent students from being exposed to computer science, internal and external, physical and psychological. + +Some schools are lacking the basics: reliable internet, power, technology devices, or technology device support. Some schools have made choices that affect exposure, such as restrictions on internet access or lack of the computer science courses that qualify students for college-level computer science programs. It's also difficult to find or create a curriculum that works in the classroom. + +There are personal obstacles as well. Some students have visible or invisible disabilities. Others feel that they don't belong or that the subject-matter is boring. + +By the time students are in high school, they tend to be either on a computer science track or not. + +Speaking from her own experience, having redesigned Young Coders for PyGotham along with Barbara Shurette, as well as referencing resources such as the Gates Foundation's [Reboot Representaton](https://www.linkedin.com/pulse/closing-gender-gap-techits-time-act-melinda-gates/) coalition, Meg gave tips for engaging every student. + +Students need to be motivated to pursue programming. Making kids sit at computers and power through boring stuff doesn't work. When students go to stations and make take-home projects, they learn the basics, make something meaningful, and get hooked. Students also tend to retain more of the knowledge when they make something tangible. + +Holistically, schools can create a longterm path for every student by offering diverse on-ramps for beginners, not one set path. A sense of belonging should be created immediately and fostered intentionally for the longterm. + +Meg also gave a few tips from the "[Zen of Python Education](https://www.slideshare.net/MegRay2/the-zen-of-python-open-education-resources-creating-resources-that-work)" talk she gave at PyCon 2019. + +![](pygotham-2019-recap-images/meg-the-zen-of-python-education.png) + +Meg Ray; photo credit: Casey Faist (used with permission) + +At the end of the talk, Meg gave a call to action for community members to advocate and volunteer. Ways to make a difference include: personally advocating at a state or local level for computer science as a graduation requirement; professionally promoting computer science education via your workplace by supporting employees in volunteering for computer science education week or make events, hosting school field trips in your office, inviting high school students to shadow you for a day on take your child to work day, or recruiting a first-time intern. + +### Hallway Track + +As usual, the "hallway track" was an invaluable opportunity to network. The connections made were too numerous to list all, but here are a few highlights: + +It was a pleasure to chat with PSF Director [Lorena Mesa](https://twitter.com/loooorenanicole) about PSF diversity initiatives, and meet for the first time PyCon US 2019 and 2020 Financial Co-Chair [Jigyasa Grover](https://twitter.com/jigyasa_grover). + +While mentioning to Meg Ray that perhaps there were some lessons in her talk that I could apply to my work as an open-source maintainer, we arranged for her to pick my brain about my experiences as [DjangoCon US Website](https://2019.djangocon.us/) Chair and Co-Chair and [Pinax](https://github.com/pinax) Maintainer as she embarks on the new open-source PSF Education landing page. + +During the last few hours of PyGotham, I also serendipitiously met employees of three companies that have had a huge impact on my life, and was offered tours of the San Francisco-based headquarters of all three. Fun! + +### Statue of Liberty and Ellis Island + +When I attended PyGotham for the first time in 2017, it was the first time I had ever visited New York City. I had read about and seen pictures and videos of New York City all of my life, of course, but you really have to physically be in a place to understand it, in my opinion. It both was and wasn't what I had expected. + +I hadn't realized ahead of time how meaningful it would be to finally experience for myself a place that is such an important part of our culture. + +When I arrived at [Penn Station](https://en.wikipedia.org/wiki/Pennsylvania_Station_(New_York_City)) in 2017, I distinctly remember emerging from the station onto bustling 7th Avenue, [Madison Square Garden](https://en.wikipedia.org/wiki/Madison_Square_Garden) behind me and [Hotel Pennsylvania](https://en.wikipedia.org/wiki/Hotel_Pennsylvania) in front of me. + +I was gobsmacked by my surroundings. Walking around the streets of New York, marveling at the landscape, I found the people to be austere in appearance, but kind. I was fascinated by the rich diversity I saw around me and the sight of people just living who they are, unapologetically. + +![](pygotham-2019-recap-images/arriving.jpg) + +7th Avenue; photo credit: Katherine Michel + +![](pygotham-2019-recap-images/times-square.jpg) + +Times Square; photo credit: Katherine Michel + +During that 2017 trip, I rode the [Staten Island Ferry](https://en.wikipedia.org/wiki/Staten_Island_Ferry) past the Statue of Liberty. There were so many sights on my list to see that at the time, I was satisfied with that. + +This year, I decided it was time to visit the [Statue of Liberty](https://en.wikipedia.org/wiki/Statue_of_Liberty) and [Ellis Island](https://en.wikipedia.org/wiki/Ellis_Island) for the first time. + +It's mind blowing to think that some of my own Scottish, Volga German, and Pennsylvania Dutch ancestors arriving in New York City as prospective immigrants, saw the same timeless Statue of Liberty that I did, and walked through the same hallowed halls of what is now the [National Museum of Immigration](https://www.nps.gov/elis/index.htm) on Ellis Island. + +In [Battery Park](https://en.wikipedia.org/wiki/The_Battery_(Manhattan)), I boarded the ferry and rode to [Liberty Island](https://en.wikipedia.org/wiki/Liberty_Island), home of the [Statue of Liberty](https://en.wikipedia.org/wiki/Statue_of_Liberty) and [Statue of Liberty Museum](https://en.wikipedia.org/wiki/Statue_of_Liberty_Museum). + +![](pygotham-2019-recap-images/1.jpg) + +Boarding the ferry to Liberty Island; photo credit: Katherine Michel + +On the island, I walked around the perimeter in front of the statue, then walked 215 steps up to the statue pedestal for a beautiful view of the Manhattan skyline and Statue of Liberty Museum. + +![](pygotham-2019-recap-images/2.jpg) + +Standing in front of the Statue of Liberty; photo credit: Katherine Michel + +![](pygotham-2019-recap-images/3.jpg) + +The view of South Manhattan from the pedestal; photo credit: Katherine Michel + +![](pygotham-2019-recap-images/4.jpg) + +The view of the Statue of Liberty Museum from the pedestal; photo credit: Katherine Michel + +![](pygotham-2019-recap-images/5.jpg) + +The view of the statue from the Statue of Liberty Museum; photo credit: Katherine Michel + +I then went to the Statue of Liberty Museum and saw pieces of the statue at scale, an exhibit showing how the pieces were made, and a replica of [The New Colossus](https://en.wikipedia.org/wiki/The_New_Colossus) plaque enscribed with that famous poem that begins "Give me your tired, your poor; Your huddled masses yearning to breathe free," among many other historical items. + +![](pygotham-2019-recap-images/6.jpg) + +The beautiful Statue of Liberty Museum; photo credit: Katherine Michel + +![](pygotham-2019-recap-images/7.jpg) + +A piece of the statue at scale; photo credit: Katherine Michel + +![](pygotham-2019-recap-images/8.jpg) + +A piece of the statue at scale; photo credit: Katherine Michel + +![](pygotham-2019-recap-images/9.jpg) + +A replica of The New Colossus plaque; photo credit: Katherine Michel + +I then re-boarded the ferry to travel to Ellis Island, to the [National Museum of Immigration](https://www.nps.gov/elis/index.htm), where immigrants were once welcomed. + +![](pygotham-2019-recap-images/10.jpg) + +The National Museum of Immigration; photo credit: Katherine Michel + +In the Baggage Room, I joined a tour that was in process. + +![](pygotham-2019-recap-images/11.jpg) + +A description of the Baggage Room; photo credit: Katherine Michel + +![](pygotham-2019-recap-images/12.jpg) + +A view of the Baggage Room from the stairs leading up to the Registration Room; photo credit: Katherine Michel + +Ranger Jenn gave us an impassioned depiction of what the atmosphere would have been like for new arrivals in the Baggage Room. + +![](pygotham-2019-recap-images/13.jpg) + +Ranger Jenn giving an impassioned depiction; photo credit: Katherine Michel + +![](pygotham-2019-recap-images/14.jpg) + +Ranger Jenn giving an impassioned depiction; photo credit: Katherine Michel + +![](pygotham-2019-recap-images/15.jpg) + +Ranger Jenn giving an impassioned depiction; photo credit: Katherine Michel + +We then moved onto the Registration Room. + +![](pygotham-2019-recap-images/16.jpg) + +A description of the Registration Room; photo credit: Katherine Michel + +![](pygotham-2019-recap-images/17.jpg) + +A photo of what the Registration Room looked like ca. 1912; photo credit: Katherine Michel + +![](pygotham-2019-recap-images/18.jpg) + +A photo of what the Registration Room looked like on the day that I was there; photo credit: Katherine Michel + +Standing at a registration desk, Ranger Jenn took us through a mock conversation between an official and a prospective immigrant. It was not unlike today. The officials were human life detectors, questioning the prospective immigrants, who had to answer correctly and show they were able-bodied. + +![](pygotham-2019-recap-images/19.jpg) + +Ranger Jenn taking us through a mock conversation between an official and a prospective immigrant; photo credit: Katherine Michel + +![](pygotham-2019-recap-images/20.jpg) + +Ranger Jenn taking us through a mock conversation between an official and a prospective immigrant; photo credit: Katherine Michel + +Amazingly, the green benches in the Registration Room were the same benches used when the building was in service, Ranger Jenn pointed out. + +![](pygotham-2019-recap-images/21.jpg) + +One of the green benches used when the building was in service; photo credit: Katherine Michel + +At the end of the tour, Ranger Jenn led us to the far end of the room to the "golden doors" that people passed through after being approved. + +She said to us, "May you have many golden doors in life the way Ellis Island was for them and may each of you be a golden door in this life for someone else the way this spot was for so many, personally and collectively. One third to one fourth of all Americans today can trace at least one ancestor to this little spit of land in the New York Harbor." + +![](pygotham-2019-recap-images/22.jpg) + +Ranger Jenn standing in front of the "golden doors"; photo credit: Katherine Michel + +Remembering back to the time I spent working for U.S. Immigration, I had all the feels. + +Ranger Jenn then gave us a special viewing of the Hearing Room. + +![](pygotham-2019-recap-images/23.jpg) + +The view of the Hearing Room from the gallery; photo credit: Katherine Michel + +She was keen to tell us the story of [Frank Woodhull/Mary Johnson](https://www.wikitree.com/wiki/Woodhull-215), a biological woman who looked like a man, who arrived at Ellis Island in 1908 and had a hearing to determine if he/she should be allowed to enter the U.S. + +![](pygotham-2019-recap-images/24.jpg) + +A photo of Frank Woodhull/Mary Johnson + +Despite having illness that could have been disqualifying, Frank Woodhull/Mary Johnson was allowed to enter the U.S. and was the only person who ever had a name change at Ellis Island. + +![](pygotham-2019-recap-images/25.jpg) + +A dog-eared article about Frank Woodhull/Mary Johnson + +After the tour was over, I had the chance to chat with Ranger Jenn about my time spent working for U.S. Immigration and how that experience still inspires my work today. She scribbled some thoughts down on a piece of paper, because she likes to reflect on the experiences of people she meets there, and incorporate these insights into her work. + +It was an experience of a lifetime. + +### Thank You + +PyGotham was yet another life-changing conference. Thank you to Conference Chair [Jon Banafato](https://twitter.com/jonafato) and all of the organizers who put so much hard work and planning into making it a wonderful event. Looking forward to next time! + +![](pygotham-2019-recap-images/i-love-nyc.jpg) + +Souveniers at LaGuardia Airport; photo credit: Katherine Michel + diff --git a/_sources/reflections-on-stanford-code-in-place.md.txt b/_sources/reflections-on-stanford-code-in-place.md.txt new file mode 100644 index 00000000..79bf39ec --- /dev/null +++ b/_sources/reflections-on-stanford-code-in-place.md.txt @@ -0,0 +1,194 @@ +# Reflections on Stanford Code in Place + +## About Stanford Code in Place + +In late March, while I was looking through my Twitter news feed, I came across a [tweet](https://twitter.com/chrispiech/status/1244692768431038473) about a one-time [Python](https://www.python.org/) programming course called Stanford Code in Place. + +[Mehran Sahami](http://robotics.stanford.edu/users/sahami/bio.html) and [Chris Piech](https://stanford.edu/~cpiech/bio/index.html) teach Stanford's introductory Python course CS106A. Because of shelter-in-place, they decided to open the course to the public. They would teach the traditional CS106A version and public Code in Place version simultaneously. + +## Application and Acceptance + +Sensing an opportunity to unlock some invaluable new knowledge through what would undoubtedly be a high quality course, I jumped at the chance to apply. + +The application consisted of a few personal questions and a few "Karel the Robot" exercises. + +[Karel the Robot](https://en.wikipedia.org/wiki/Karel_(programming_language)) is a powerful, toy-like programming environment created by former Stanford instructor [Richard E. Pattis](https://en.wikipedia.org/wiki/Richard_E._Pattis). + +![](reflections-on-stanford-code-in-place-images/karel-world.png) + +Caption: "Karel World" + +I immediately liked Karel the Robot. Karel piqued my interest, challenged me, and left me wanting to go further in my learning. + +I completed the application and soon received an acceptance email. 80,000 prospective students had started an application, 8,000 students were admitted, and 800 section leaders accepted. + +Although the Code in Place instructors strongly believe in open education, this was the first initiative of its kind and run by volunteers. With students split into groups of 10 and each group supported by a section leader, the number of students admitted was limited. + +## What I Got Out of the Course + +I was excited to be able to participate and was intent to make the most of the experience and build on it after the course ended. + +As a release manager of an open-source Django library named [Pinax](https://github.com/pinax), Python was not new to me. However, there were specific things I wanted to get out of Code in Place and I can wholeheartedly say that I did: + +* A more intuitive understanding of control flow, algorithms, and program structure +* Reinforcement of my Python fundamentals knowledge + +There were also a few unexpected bonuses that I got out of the course: + +* Had fun making things, including using tools I had already wanted to explore +* Got to know a few Python libraries better, including SimpleImage, [Pillow](https://pillow.readthedocs.io/en/stable/), and [Tkinter](https://docs.python.org/3/library/tkinter.html) +* Learned how to make a project demo video +* Got to know a number of fascinating and inspiring people + +## Lectures and Assignments + +The main part of the course lasted for 5 weeks. + +New lecture videos were released every Monday, Wednesday, and Friday. In these lectures, Mehran and Chris taught Python fundamentals in such a way that they built on each other and aligned with our coursework. + +There were three regular assignments due approximately every week and a half, and a final project that we had an additional one to two weeks to work on. + +## Sections + +My section leader was Matt, a Stanford CS alum, and our section met every Thursday via Zoom. + +When our first section took place, I was surprised to see that nearly all of the students were women, primarily in my same age group, with the exception of one man. I didn't expect that kind of gender and age representation and thought it was great. + +During each section, we went over key points from that week's lectures, worked through programming challenges, and talked about any questions we had. Our section leader Matt was very knowledgeable and helpful. + +## Assignments and Final Project + +### Assignment 1: Karel the Robot + +Our first assignment consisted of Karel the Robot problems. + +We were encouraged to install and use [PyCharm IDE](https://www.jetbrains.com/pycharm/), if possible. An online IDE was available for those who needed it. + +It's fairly easy to get started using Karel the Robot. On the surface, Karel seems simple to use. There are only a few built-in commands available for giving Karel instructions for completing seemingly straightforward tasks in Karel World. + +![](reflections-on-stanford-code-in-place-images/karel-reference.png) + +Caption: Karel Reference + +However, in order to "solve" a Karel challenge, your code must be adequately abstract! + +For example, I thought I had "solved" the first Karel challenge when it passed the first test case, only to amusingly (and frustratingly, at the time!) realize that there were other, more extreme test cases my solution had not yet passed. To succeed in passing all of them, you needed to use decomposition, good control flow, and creative problem solving. + +![](reflections-on-stanford-code-in-place-images/example-karel-test-cases.png) + +Caption: Example test cases... Karel should be able to climb up and down mountains of any size, not just one size! + +Our instructor Chris alluded to the hidden cleverness of Karel when he told us that some of the most difficult programming problems he had ever encountered had been in Karel World. + +![](reflections-on-stanford-code-in-place-images/fun-but-challenging.png) + +Caption: A tweet about my progress. Creating new neural pathways, I hope! + +### Assignment 2: Simple Python + +In the second week, we moved on from Karel the Robot, which was similar to Python, to Python itself. Our assignment involved solving several challenges in Python. This felt like the easiest week for me. + +By now, we had covered Python control flow, variables, expressions, functions, and parameters, and would soon move on to lists and dictionaries. + +Not long after assignment 2 was due, we had the option to complete a diagnostic test consisting of several programming problems. To complete the diagnostic test, we typed the code as we thought it should be to solve the problems, without being able to debug. Interesting! + +### Assignment 3: Images + +On the same day that assignment 2 was due, we began studying images. + +For the images assignment, we used a module called SimpleImage that was created by Stanford teacher [Nick Parlante](https://cs.stanford.edu/people/nick/). Built on top of Python's full-featured [Pillow](https://pillow.readthedocs.io/en/stable/) library for manipulating images, SimpleImage provides a smaller selection of functionality, such as the ability to open and display an image and access and change its RGB pixel values. + +Our assignment problems included creating a special Code in Place image filter, creating a mirror image, and creating an [Andy Warhol](https://en.wikipedia.org/wiki/Andy_Warhol)-esque artwork of the same image repeated multiple times, but with a different, brightly colored filter applied to each. + +![](reflections-on-stanford-code-in-place-images/simba.png) + +Caption: Simba, the Code in Place Dog + +![](reflections-on-stanford-code-in-place-images/warhol-simba.png) + +Caption: Simba, as a Warhol-esque "Painting" + +After studying images, we studied animation using [Tkinter](https://docs.python.org/3/library/tkinter.html), text processing, and data. + +### Final Project + +The course went by so quickly that before I knew it, it was time to do our final projects. + +Although there were two standard Code in Place final project ideas students could use, we could make anything we wanted. I wanted to use the final project as an opportunity to challenge myself to do something new. + +For quite a while, I had wanted to make a Twitter bot, possibly powered by GitHub Actions. I happen to love photos, so I immediately looked at some photo service APIs. At Unsplash, I came across a pet photo collection. It reminded me of Simba, the adorable Code in Place dog, and how we had applied image filter algorithms to photos of Simba. + +So, I created a "Simba Friends" Twitter bot powered by a Python program I wrote that randomly downloads a photo from the Unsplash pet photo collection, randomly applies an image filter algorithm to it, and tweets it. + +![](reflections-on-stanford-code-in-place-images/sitting-here-stunned.png) + +Caption: Tweeting my surprise that my final project had worked as a proof of concept + +Our final projects are listed on the Code in Place final projects site. My project is lucky [#13](https://compedu.stanford.edu/codeinplace/public/projectlist.html). :) + +You can also learn more about my final project in its [GitHub repo](https://github.com/KatherineMichel/stanford-code-in-place-final-project). + +## A Few of My Thoughts and Opinions About the Course + +### Inclusion + +Beginning with the first introductory lecture, I had a sense that the Code in Place staff were genuinely nice people who wanted to create a kind, welcoming, non-judgmental atmosphere that was all about the best interest of individuals and their learning. + +It was great to see that there were women in my section with non-traditional backgrounds who were insatiably curious about programming and highly motivated to succeed at it. Because of my familiarity with the Python ecosystem, I was able to provide some special support and advice to those who wanted to learn more, such as directing them to two of my favorite Python books: "[Automate the Boring Stuff with Python](https://automatetheboringstuff.com/)" by Al Sweigart and "[Python Crash Course](https://ehmatthes.github.io/pcc/)" by Eric Matthes. + +Our teacher Chris, who uses machine learning to study how students learn, posted a course midpoint message that I did not at all expect. A neural network was trained on data collected about how students had solved a programming challenge on www.code.org. The neural network became very good at predicting outcomes. When it predicted who was most likely to have longterm success, it was not the person who had immediately known the answer, but instead, a person who had grappled with the problem a.k.a. had grit. Members of my section, myself included, found it inspiring. :) + +![](reflections-on-stanford-code-in-place-images/course-milestone.png) + +I also appreciated that we were told that our final projects could be as humble or as big as we wanted. + +Having personally experienced the mixed messages women in particular face about skills and achievement, it's refreshing to be in a mental space where students are all given permission to do their best, wherever they are on their journey, without being stuck in the psychological trap women are often perpetually caught in of being either not good enough or too good, instead of simply being. + +My only quibble, and it's a very small one, about inclusion during the course was the use of "guys" a few times during lectures to refer to students of all genders. I'm 100% sure it was not at all intended to create a feeling of exclusion and it's something I occassionally do by accident. My friend Lacey created a website called [Hey Guys](https://heyguys.cc/) that has a list of alternatives. I'm personally a fan of "y'all." :) + +### My Favorite Lecture + +Out of all of the Code in Place lectures, my favorite was the decomposition lecture. I felt that decomposition is a major key and the tips Chris gave us were excellent. I also really enjoyed the functions lectures. + +### Final Project and Demo Video + +Instead of submitting the code we wrote for our final project, we were asked to submit a short video demonstrating how our program worked. + +I'm glad to have been forced to learn how to make a demo video, lol. It's a skill I could have indefinitely put off learning, but now that I know how to do it and how easy and useful it is, I intend to make more demo videos like this in the future. + +I really liked the idea of creating a working program based on my own creativity and presenting it. + +### Finishing Strong + +Like many people, I've signed up for MOOCs (Massive Open Online Courses) in the past and not completed them. + +However, even though Code in Place was not for a grade, it was a priority to me personally to complete all of the work expected of me. I watched every lecture, attended every section, and submitted every required assignment. + +I was motivated by a few things: + +* Only a small percentage of people had been accepted into the course; by not finishing, I would have taken a spot away from someone else who might have +* I had a high level of confidence in the quality of the course +* I felt an informal sense of accountability to my section leader and members of my section +* I knew that by not finishing strong, I would have been hurting myself most of all by missing an opportunity + +I appreciated the flexibility of the course though. I fell behind one week, due to a broken computer. My section leader encouraged us to show up to our sections, even if we were less prepared than we wanted to be. Showing up and taking part helped me keep on track and I was able to fully catch up later that weekend. + +### What Does Baseball Have to Do With Programming?! + +Toward the end of the course, members of my section had a conversation about the Code in Place curriculum. Different people had different ideas about what should or shouldn't have been included. Obviously, there is a limit to how much content can be taught in a five week timeframe and choices have to be made. + +The debate reminded me of the "baseball" analogy I first heard of through the outstanding [teaching philosophy](https://www.fast.ai/2016/10/08/teaching-philosophy/) of Jeremy Howard and Rachel Thomas of Fast AI. In their philosophy, Jeremy and Rachel contrast learning math with learning baseball. A math student could spend years studying the dry, theoretical details of the subject, before getting to the "fun" stuff of putting it to real, practical use, if he or she makes it that far. On the other hand, a "student" of baseball perhaps stumbles across an informal baseball game in progress, immediately begins to get a sense of how the entire game works, and perhaps picks up the bat and excitedly joins the game in progress. + +Yes, there were some important concepts that weren't included in Code in Place, but I don't think that was the most important thing. I think Code in Place did a good job of teaching important fundamentals while also providing "fun" projects that could give students the sense of excitement of joining a game, and perhaps get them indefinitely hooked on learning and making things beyond Code in Place. + +![](reflections-on-stanford-code-in-place-images/greenscreening.png) + +Caption: One of the fun things we learned how to do + +## What's Next + +In the past few months, I've also overseen an epic new [Pinax](https://github.com/pinax) release that drops support for Python 2.7 and it's nearly finished. Meanwhile, I am making good on my vow to build on what I learned through Code in Place by taking part in 100 Days of Code. I am making fun, new things regularly now, including another bot, inspired by my Code in Place final project, that is creating some experimental image artwork that I'd like to curate into a small exhibit. I will be writing new blog posts to share what I learn. + +## Contact Me + +Have questions or comments? I can be reached at kthrnmichel@gmail.com or on Twitter [@KatiMichel](https://twitter.com/KatiMichel). diff --git a/_sources/speaker-board-and-organizer-photos.md.txt b/_sources/speaker-board-and-organizer-photos.md.txt new file mode 100644 index 00000000..f95153c1 --- /dev/null +++ b/_sources/speaker-board-and-organizer-photos.md.txt @@ -0,0 +1,125 @@ +# Speaker, Board, and Organizer Photos + +Table of Contents +----------------- + +- [Speaker Photos](#speaker-photos) +- [Board Photos](#board-photos) +- [Organizer Photos](#organizer-photos) + +## Speaker Photos + +### JPMorgan Chase 2023- DjangoCon US Recap + +December 6, 2023 + +![](speaker-board-and-organizer-photos/jpmorgan-chase-2023-djangocon-us-recap.jpg) + +![](speaker-board-and-organizer-photos/jpmorgan-chase-2023-djangocon-us-recap-2.jpg) + +### DjangoCon US 2021 + +October 22, 2021 + +![](speaker-board-and-organizer-photos/djangocon-us-2021-get-a-jumpstart-english.png) +My pre-recorded talk Get a Jumpstart on Collaboration and Code Review in GitHub playing simultaneously in English and Spanish + +![](speaker-board-and-organizer-photos/djangocon-us-2021-get-a-jumpstart-spanish.png) +My pre-recorded talk Get a Jumpstart on Collaboration and Code Review in GitHub playing simultaneously in English and Spanish + +### DjangoCon US 2018- State of Django Panel + +October 17, 2018 + +![](speaker-board-and-organizer-photos/djangocon-us-2018-state-of-django-panel-side.jpg) +On stage; photo credit: Bartek Pawlik (https://bartpawlik.format.com/) + +![](speaker-board-and-organizer-photos/djangocon-us-2018-state-of-django-panel-me-speaking.jpg) +Speaking; photo credit: Bartek Pawlik (https://bartpawlik.format.com/) + +![](speaker-board-and-organizer-photos/djangocon-us-2018-state-of-django-panel-front.jpg) +Panel and crowd; photo credit: Bartek Pawlik (https://bartpawlik.format.com/) + +![](speaker-board-and-organizer-photos/djangocon-us-2018-state-of-django-panel-crowd.jpg) +Panel and crowd; photo credit: Bartek Pawlik (https://bartpawlik.format.com/) + +### DjangoCon US 2017- Get a Jumpstart on Collaboration and Code Review in GitHub Talk + +August 14, 2017 + +![](speaker-board-and-organizer-photos/djangocon-us-2017-on-stage.jpg) +On stage; photo credit: Adam Gregory (https://atomimages509.wixsite.com/atom) + +![](speaker-board-and-organizer-photos/djangocon-us-2017-on-stage-2.jpg) +On stage + +![](speaker-board-and-organizer-photos/djangocon-us-2017-speaker-photo.jpg) +Speaker photo; photo credit: Adam Gregory (https://atomimages509.wixsite.com/atom) + +### DevICT Hacktoberfest Meetup- Get a Jumpstart on Collaboration and Code Review in GitHub Talk + +September 28, 2017 + +![](speaker-board-and-organizer-photos/dev-ict-2017-speaker-photo.jpg) +Speaker photo + +## Board Photos + +### DjangoCon US 2023 + +October 18, Durham, North Carolina + +![](speaker-board-and-organizer-photos/djangocon-us-2023-defna-board-outside.jpg) +DEFNA Board group photo; photo credit: Bartek Pawlik (https://bartpawlik.format.com/) + +## Organizer Photos + +### DjangoCon US 2023 + +October 16-20, Durham, North Carolina + +![](speaker-board-and-organizer-photos/djangocon-us-2023-organizers-outside.jpg) +Organizers group photo; photo credit: Bartek Pawlik (https://bartpawlik.format.com/) + +![](speaker-board-and-organizer-photos/djangocon-us-2023-organizers-stage.jpg) +Organizers during closing remarks (I am hidden behind Dawn lol); photo credit: Bartek Pawlik (https://bartpawlik.format.com/) + +### DjangoCon US 2022 + +October 16-21, San Diego, California + +![](speaker-board-and-organizer-photos/djangocon-us-2022-organizers-outside.jpg) +Organizers group photo; photo credit: Bartek Pawlik (https://bartpawlik.format.com/) + +![](speaker-board-and-organizer-photos/djangocon-us-2022-organizers-stage.jpg) +Organizers during closing remarks; photo credit: Bartek Pawlik (https://bartpawlik.format.com/) + +### DjangoCon US 2019 + +September 22-27, San Diego, California + +![](speaker-board-and-organizer-photos/djangocon-us-2019-organizers-outside.jpg) +Organizers group photo; photo credit: Bartek Pawlik (https://bartpawlik.format.com/) + +![](speaker-board-and-organizer-photos/djangocon-us-2019-organizers-stage.jpg) +Organizers during closing remarks; photo credit: Bartek Pawlik (https://bartpawlik.format.com/) + +### DjangoCon US 2018 + +October 14-19, San Diego, California + +![](speaker-board-and-organizer-photos/djangocon-us-2018-organizers-outside.jpg) +Organizers group photo; photo credit: Bartek Pawlik (https://bartpawlik.format.com/) + +![](speaker-board-and-organizer-photos/djangocon-us-2018-organizers-stage-side.jpg) +Organizers during closing remarks; photo credit: Bartek Pawlik (https://bartpawlik.format.com/) + +![](speaker-board-and-organizer-photos/djangocon-us-2018-organizers-stage.jpg) +Organizers during closing remarks; photo credit: Bartek Pawlik (https://bartpawlik.format.com/) + +### DjangoCon US 2017 + +August 13-18, Spokane, Washington + +![](speaker-board-and-organizer-photos/djangocon-us-2017-organizers-stage.jpg) +Organizers during closing remarks; photo credit: Adam Gregory (https://atomimages509.wixsite.com/atom) diff --git a/_sources/the-most-important-python-content-of-2024.md.txt b/_sources/the-most-important-python-content-of-2024.md.txt new file mode 100644 index 00000000..ed6b2763 --- /dev/null +++ b/_sources/the-most-important-python-content-of-2024.md.txt @@ -0,0 +1,151 @@ +# The Most Important Python Content of 2024 + + diff --git a/_sources/til-100-days-of-code-version.md.txt b/_sources/til-100-days-of-code-version.md.txt new file mode 100644 index 00000000..618ed54b --- /dev/null +++ b/_sources/til-100-days-of-code-version.md.txt @@ -0,0 +1,332 @@ +# TIL- 100 Days of Code Version + +In April, I was looking through my Twitter newsfeed and came across a [tweet](https://twitter.com/simonw/status/1252050046566055937) by Simon Willison that piqued my curiosity. + +![](til-100-days-of-code-version-images/simon-tweet.png) + +Caption: Simon's tweet + +I had the good fortune to get to know [Simon](https://github.com/simonw/) when he was the moderator of a ["State of Django" panel](https://youtu.be/TrAFQW7Wza0) that I took part in at [DjangoCon US 2018](https://2018.djangocon.us/) and I've been following him on Twitter ever since. One of the original creators of the [Django](https://en.wikipedia.org/wiki/Django_(web_framework)) web development framework at the Lawrence Journal World, Simon can often be found discovering novel ways of doing things. So, when he comes across an "interesting" idea, I tend to take notice. + +While looking at Hacker News, Simon had come across the idea of a self-rewriting README.md. The idea originated from a project called [TIL (Today I Learned)](https://github.com/jbranchaud/til), created by [Josh Branchaud](https://github.com/jbranchaud/) that was inspired by a [thoughtbot](https://github.com/thoughtbot/til) project of the same name. + +Simon re-implemented the idea in Python and wrote about it in a [blog post](https://simonwillison.net/2020/Apr/20/self-rewriting-readme/). + +In a nutshell, Simon's TIL repo contains a README.md and subject folders filled with TIL files. When Simon learns something new, he can open a corresponding subject folder, create a new markdown TIL file, and fill in what he has learned. When the new file is saved, a program runs and finds the change. In the README.md, each folder name is listed as a category with the names of the files contained in the folder listed below the category as TIL hyperlinks. The program rewrites the README.md, adding the new TIL file name under its category. + +![](til-100-days-of-code-version-images/simon-til.png) + +Caption: The beginning of Simon's TIL README.md + +## Lightbulb Moment + +There is so much to be learned from tech that for years now, I've been curating what I've learned in README.mds the old fashioned way, by hand, as a memory device. I've long known there was undoubtedly a more efficient way of doing it, but hadn't come across a specific better way, and my way worked well enough for the time being. + +Now that I knew about the self-writing README.md, it was clear that a similar implementation could be very helpful to me. I bookmarked the idea as something I would revisit. + +## TIL- 100 Days of Code Version + +Around the time of Simon's tweet, I was just beginning [Stanford's Code in Place](https://github.com/KatherineMichel/portfolio/blob/master/regular-blog-posts/reflections-on-stanford-code-in-place.md) course. When Code in Place ended, I wanted to continue building small, fun apps regularly. So, I started taking part in a popular initiative called [100 Days of Code](https://www.100daysofcode.com/). + +100 Days of Code participants spend 1 hour a day, most days, working on code-related learning and are encouraged to fork the official [100 Days of Code repo](https://github.com/kallaway/100-days-of-code) to keep a record of their work, as well as tweet their progress from day to day, in order to stay accountable. + +It's a great initiative and I can definitely feel my coding muscles becoming stronger over time. + +However, 100 Days of Code is largely self-guided, and at the beginning, I found myself having difficult settling into a routine. After a couple of weeks of feeling disorganized, I suddenly remembered the idea of a self-rewriting TIL. I had an ephiphany that I could create a TIL- 100 Days of Code version, to keep what I had worked on and learned from day to day organized. + +I felt super excited at the thought of creating my own TIL implementation. What better sort of project could there be than to create a programmatic solution to my own problem? + +## My TIL Requirements + +Requirements for my own TIL: + +Basic Features +* TILs listed by category, with a name and hyperlink for each (this is a traditional TIL feature) +* Total number of TILs and total by category (nice to have) +* Ability to add/edit TILs in the browser (I want to be able to do a quick and easy update) +* Powered by a GitHub Action (no need to run this locally) + +Special 100 Days of Code Features +* TILs ordered by date, name, and hyperlink, most recently modified first (ordering by date will help keep me accountable) +* Ability to open the most recently modified TIL and tweet a status update (I'll no longer need to manually tweet my progress) + +## Implementations I Considered + +The first thing I did was spend some time looking at different TIL implementations hosted on GitHub. My intention was not to adopt another person's solution outright, but to get a general idea of what approaches people had taken, and perhaps, why. Ultimately, I wanted to take code apart and go through my own process of discovery and learning, so that I would fully understand how what I was using worked. I also wanted to create an implementation unique to my own needs, including features incorporated specifically for 100 Days of Code. + +The upside of looking at different TIL implementations was that I immediately began to experiment and problem solve by creating my own versions. The downside was that I overlooked a potentially important performance issue. See the "[What I Learned About Performance](https://github.com/KatherineMichel/portfolio/blob/master/regular-blog-posts/til-100-days-of-code-version.md#what-i-learned-about-performance)" section later in this blog post for more information about that. + +I considered four major approaches implemented in Python: + +* Simon Willison's [TIL implementation](https://github.com/simonw/til) +* Andrei Cioara's [TIL Implementation](https://github.com/aicioara/til/) +* Raegon Kim's [TIL implementation](https://github.com/raycon/til/) +* KhanhIceTea's [TIL implementation](https://github.com/khanhicetea/today-i-learned/) + +### Contrasting the Implementations + +Simon's [TIL implementation](https://github.com/simonw/til) uses [Datasette](https://datasette.readthedocs.io/), an SQL tool he created and develops as part of a John S. Knight Journalism Fellowship at Stanford. Although I have no doubt that Simon's implementation is a stellar approach that leverages a very cool and useful tool (I plan to use it in the future in a project of my own!), I wanted to start from a blank slate and beginner mindset. + +I felt his implementation was too opinionated for my current needs. + +So, I moved on to Andrei Cioara's [TIL implementation](https://github.com/aicioara/til/) and Raegon Kim's [TIL implementation](https://github.com/raycon/til/). + +#### `os.walk()` and Program Structure + +Both implementations use `os.walk()` to traverse the directories and files, but the programs are structured very differently. For me, Andrei Cioara's implementation was the simplest of the four to understand and Raegon Kim's the most difficult. + +In Andrei Cioara's implementation, the bulk of the program exists within `main()` and executes from beginning to end, like a consecutive list of instructions. The program executes `os.walk()` once to create a simple list of categories and file links. + +```python +# Andrei Cioara's `os.walk()` + +def main(): + # Other stuff + + for root, dirs, files in os.walk("."): + dirs.sort() + if root == '.': + for dir in ('.git', '.github'): + try: + dirs.remove(dir) + except ValueError: + pass + continue + + # Other stuff + + for file in files: + # Other stuff +``` + +Unlike the procedural approach taken by Andrei Cioara, Raegon Kim splits the program into functions. Encapsulated in a function, `os.walk()` is called twice, to create both "Recently Modified" and "Categories" sections. He also creates a "Categories" table of contents with entries that link to the categories in the README.md via `relative` path. + +```python +# Raegon Kim's `os.walk()`, encapsulated in `tils()` + +excludes = (root, "drafts", "archive") + +# Other stuff + +def tils(root): + for (path, dirs, files) in os.walk(root): + dirs[:] = [d for d in dirs if d not in excludes and not d.startswith(".")] + paths = [os.path.join(path, f) for f in files if f.endswith(".md")] + if path != root: + yield relative(root, path), paths +``` + +Raegon Kim's entire program begins and ends in the same small block of code near the end of the file, when, the highest-order function `readme()` is called. A number of other functions, some nested within one another, are called from within `readme()`. These other functions create relative and absolute paths, titles, hyperlinks, TIL `count`, and a `modified` list that returns the most recent entries. + +```python +# Raegon Kim's `readme()` calls `tils()` and other functions + +def readme(): + # Other stuff + + # Recents + lines.append("## Recently Modified\n") + for date, filename in recent(flat(tils(root)), 15): + date = datetime.utcfromtimestamp(date).strftime("%Y-%m-%d") + l = link(root, filename) + lines.append(f"- *{date}* : {l}") + + # Categories + lines.append("\n## Categories\n") + lines.append("Total `%s` TILs\n" % total(root)) + for relative, paths in tils(root): + count = len(paths) + lines.append(f"- [{relative}](#{relative}) *({count})*") + + # Links + for relative, paths in tils(root): + lines.append(f"\n### {relative}\n") + for path in paths: + l = link(root, path) + lines.append(f"- {l}") + + # Other stuff +``` + +#### `os.listdir()`, TIL Dictionary, and Python Standard Library + +I later came across KhanhIceTea's [TIL implementation](https://github.com/khanhicetea/today-i-learned/), which is the approach I finally settled on. KhanhIceTea's implementation uses `os.listdir()` to iterate through the directories and files, instead of `os.walk()`. + +```python +# KhanhIceTea uses `os.listdir()` to create and sort a list of categories and iterate through their TIL files + +def convert_til_2_readme(source, template_file, dest): + excluded_folders = [".git", ".vscode"] + categories = [f for f in os.listdir(source) if os.path.isdir(f) and f not in excluded_folders] + categories.sort() + # Other stuff + + for cat in categories: + # Other stuff + for file in os.listdir(os.path.join(source, cat)): +``` + +Each TIL file is split into pieces and passed into a `parse_article()` function and the front matter and header are parsed using the Python `find()` function, with a dictionary created that stores the `date`, `category`, `tags`, and `title`. Each dictionary is added to both a `cat_articles` and `all_articles` list, which are sorted by chronological and reverse date. + +```python +# `parse_article()` parses the file front matter and header and returns a dictionary containing the data + +def parse_article(content, category): + pos1 = content.find('- Date : ') + pos2 = content.find('- Tags : ', pos1) + pos3 = content.find("\n", pos2) + pos4 = content.find("##", pos3) + pos5 = content.find("\n", pos4) + post = { + "date": datetime.strptime(content[pos1+9:pos2].strip(), "%Y-%m-%d"), + "category": category, + "tags": [t[1:] for t in content[pos2+9:pos3].strip().split(' ')], + "title": content[pos4+3:pos5].strip(), + } + + return post +``` + +While Andrei Cioara and Raegon Kim use Python Standard Library built-in functions to identify the variables used to create the README.md entries, KhanhIceTea's implementation accesses that data from the TIL dictionaries using index and variables instead. + +```python +# Iterating through the `cat_articles` and `all_articles` lists and accessing the data by index and variable + + # Other stuff + + for article in cat_articles: + count += 1 + cat_content += "| {}. [{}]({}/{}) | {} |\n".format( + count, article['title'], article['category'], article['file_name'], + article['date'].strftime('%Y-%m-%d')) + + # Other stuff + for article in all_articles[0:5]: + content += "| [{}]({}/{}) [{}] | {} |\n".format( + article['title'], article['category'], + article['file_name'], article['category'], + article['date'].strftime('%Y-%m-%d')) +``` + +#### Writing Content Using String Versus List + +One other seemingly incidental difference between implementations that could affect performance is how content is written to the README.md. + +Andrei Cioara creates an empty string called `content` and uses an addition assignment operator to append new strings to `content`, starting with a README.md header via a global `HEADER` variable assigned to a multiline, triple-double-quote string. At the end of the program, all of the `content` is written into the README.md at once. KhanhIceTea uses the same method. + +```python +# README.md header stored in a multiline, triple-double-quote string + +# Other stuff + +HEADER="""# TIL +> Today I Learned +A collection of software engineering tips that I learn every day. +--- +""" +``` + +```python +# New strings are appended to `content`, then all of the `content` is written into the README.md at once. + +def main(): + content = "" + content += HEADER + + # Other stuff + + category = os.path.basename(root) + + content += "### {}\n\n".format(category) + + for file in files: + name = os.path.basename(file).split('.')[0] + name = " ".join(word.capitalize() for word in name.split('-')) + content += "- [{}]({})\n".format(name, os.path.join(category, file)) + content += "\n" + + with open("README.md", "w") as fd: + fd.write(content) +``` + +In Raegon Kim's implementation, at the beginning of `readme()`, an empty list called `lines` is created. As the program progresses through `readme()`, and new lines are generated, the built-in list function `append()` is used to append the new lines to `lines` as strings. The `lines` list is returned by `readme()` and line by line, written into the README.md. + +```python +# Content is appended to `lines` as strings and `lines` is returned + +def readme(): + lines = [] + lines.append("# TIL\n") + lines.append("> Today I Learned\n") + + # Recents + lines.append("## Recently Modified\n") + for date, filename in recent(flat(tils(root)), 15): + date = datetime.utcfromtimestamp(date).strftime("%Y-%m-%d") + l = link(root, filename) + lines.append(f"- *{date}* : {l}") + + # Other examples + + return lines +``` + +```python +# Content stored within `lines` is written into the README.md, line by line + +output = open(os.path.join(root, "README.md"), 'w', encoding='UTF-8') +for line in readme(): + output.write(line) + output.write('\n') +output.close() +``` + +## My Journey Through Implementations + +I had heard positive things about `os.walk()` and immediately thought it would be a great approach for my TIL. So, I began by creating my own TIL implementation loosely based on Andrei Cioara's approach. + +However, I ran into difficulty when I attempted to add a section for most recently modified files, in addition to categories. I realized that `os.walk()` needed to "walk" the directories and files twice. Adding a second `os.walk()` without using a function seemed like overkill. + +So, I began to study Raegon Kim's implementation, to see how he had added a "Recently Modified" category using functions. Although I nearly completed a similar implementation, I wasn't quite happy with the result. I felt it was overly complex. + +At that point, I began looking through more examples on GitHub and came across KhanhIceTea's implementation. + +I immediately liked the way it looked, because of its fun use of markdown tables and emojis, plus it ticked the boxes of having both "Recently Modified" and "Category" sections. + +So, I created my own [TIL- 100 Days of Code Version](https://github.com/KatherineMichel/til-100-days-of-code-version). + +![](til-100-days-of-code-version-images/my-til.png) + +Caption: My [TIL- 100 Days of Code Version](https://github.com/KatherineMichel/til-100-days-of-code-version) repo + +![](til-100-days-of-code-version-images/my-til-example-til-file.png) + +Caption: An example file in my [TIL- 100 Days of Code Version](https://github.com/KatherineMichel/til-100-days-of-code-version) repo + +I'm undecided about the use of front matter and the `find()` function to parse it. I feel it might be unnecessarily manual, but I also have confidence in it. One major advantage of KhanhIceTea's approach of using a TIL dictionary is that I found it to be very straightforward to work with and was able to quickly add a `status` variable and implement auto-status tweet. + +For more information about the changes I made to KhanhIceTea's implementation, check out the "Changes I Made" section of the [program_information.py](https://github.com/KatherineMichel/til-100-days-of-code-version/blob/master/program_information.py) file. + +## What I Learned About Performance + +Although based on existing implementations, `os.walk()` seemed like the obvious choice at first, it can perform poorly. This was explained in [PEP 0471](https://www.python.org/dev/peps/pep-0471), which introduced `os.scandir()`, added to the Python Standard Library in Python 3.5. + +> "This PEP proposes including a new directory iteration function, os.scandir(), in the standard library. This new function adds useful functionality and increases the speed of os.walk() by 2-20 times (depending on the platform and file system) by avoiding calls to os.stat() in most cases. +> +> Python's built-in os.walk() is significantly slower than it needs to be, because -- in addition to calling os.listdir() on each directory -- it executes the stat() system call or GetFileAttributes() on each file to determine whether the entry is a directory or not." + +Although my implementation uses `os.listdir()` directly, which is an improvement over `os.walk()`, according to the `os.listdir()` documentation, `os.scandir()` gives better performance than `os.listdir()` for many common use cases. + +For a small, open-source app like mine, performance might not be as much of an issue as it would be for a large-scale system or one that runs the risk of maxing out on resource, such as an app in a private repo using up all of its GitHub Action minutes. + +But, knowing what I know now, if I were to start over, I would probably use `os.scandir()`. Perhaps, I will create a new version using it. + +## Make Your Own + +How would you create a TIL project and why? Is `os.listdir()` preferable to `os.walk()`? Which is the best method of storing and writing README.md content: string concatenation, list `append()`, or another method? Is front matter parsing an anti-pattern? + +Let me know what you think on Twitter [@KatiMichel](https://twitter.com/KatiMichel), in a [GitHub issue](https://github.com/KatherineMichel/til-100-days-of-code-version), or by email kthrnmichel@gmail.com. + +Stay tuned for a TIL- 100 Days of Code Version tutorial for step-by-step instructions for setting up your own TIL. + +Happy learning! :) diff --git a/_sources/what-i-am-paying-attention-to-in-2024.md.txt b/_sources/what-i-am-paying-attention-to-in-2024.md.txt new file mode 100644 index 00000000..cec082e4 --- /dev/null +++ b/_sources/what-i-am-paying-attention-to-in-2024.md.txt @@ -0,0 +1,288 @@ +# What I Am Paying Attention to in 2024 + +Disclaimer: the content of this post is a reflection of my career journey and not specific to my work at JPMorganChase. + +## Key + +| Emoji | Status | +| -------- | ------------ | +| ✓ | completed | +| ⌛ | in progress | +| 🛠 | daily/weekly | +| ⏸ | on pause | + +## Developer News + +Projects and developers trending on GitHub. Can be filtered by Python. +* [GitHub Trending](https://github.com/trending) 🛠 +* [GitHub Trending Python](https://github.com/trending/python) 🛠 +* [GitHub Trending Python Developers](https://github.com/trending/developers/python?since=daily) 🛠 + +The latest tech news that makes it through the Hacker News upvote process. +* [Hacker News Newest](https://news.ycombinator.com/newest) 🛠 + +GitHub news and changelog +* [GitHub Blog](https://github.blog) +* [GitHub Changelog](https://github.blog/changelog/) + +## Python and Django Features and Release + +Python release notes, discussion forum, enhancements proposals, release livestreams (recorded) +* [What's New](https://docs.python.org/dev/whatsnew/) +* [Python Discuss](https://discuss.python.org) +* [PEP (Python Enhancement Proposals) Index](https://www.python.org/dev/peps) 🛠 +* [Pablo Galindo Salgado's Release Streams](https://www.youtube.com/@PythonDiscord) + +Django release notes, enhancements proposals, blog, roadmap +* [Release Notes](https://docs.djangoproject.com/en/dev/releases/) +* [DEPs (Django Enhancement Proposals) GitHub](https://github.com/django/deps) 🛠 +* [Django Blog](https://www.djangoproject.com/weblog/) 🛠 +* [Django Roadmaps](https://code.djangoproject.com/wiki) + +## Python and Django Authorities + +Django co-founder and prolific tinkerer and public speaker. Check out his work with Datasette and LLMs. +* [Simon Willison](https://simonwillison.net/) + +Current and former Django Fellows +* [Carlton Gibson](https://noumenal.es/) 🛠 +* [Natalia Bidart and Mariusz Felisiak](https://www.djangoproject.com/weblog/) + +Current CPython Developer-in-Residence +* [Łukasz Langa](https://lukasz.langa.pl/python/developer-in-residence/) + +PSF Security Developer-in-Residence +* [Seth M Larson](https://sethmlarson.dev/) 🛠 + +Podcast by CPython Release Manager Pablo Galindo and CPython Developer-in-Residence Łukasz Langa +* [core.py Podcast](https://podcasters.spotify.com/pod/show/corepy/) 🛠 + +CPython Core Dev and Microsoft faster CPython team member +* [Brett Cannon](https://snarky.ca/) + +Author of a group of outstanding Django books and co-creator of Django News Newsletter +* [William Vincent](https://learndjango.com/) + +Author of my favorite Python book "Python Crash Course" +* [Eric Matthes](https://ehmatthes.com/) + +Highly-skilled, opinionated developers and release managers who maintain a number of packages important to the Python/Django community +* [Adam Johnson](https://adamj.eu/) +* [Hynek Schlawack](https://hynek.me/) 🛠 +* [Anthony Sottile](https://www.youtube.com/anthonywritescode) + +Author of a great Django blog +* [Matt Layman](https://www.mattlayman.com/) + +## Python Books + +Outstanding new book in a series by Extreme Programming and TDD authority Kent Beck. Short and sweet. Explores tidyings, cumulative progress, and optionality. +* [Tidy First?](https://www.oreilly.com/library/view/tidy-first/9781098151232/) ✓ + +Idiomatic Python deep dive to level up to professional, production quality Python quickly +* [Dead Simple Python](https://www.amazon.com/Dead-Simple-Python-Idiomatic-Programmers/dp/1718500920) ⌛ + +Classic, advanced, comprehensive Python manual +* [Fluent Python](https://www.amazon.com/Fluent-Python-Concise-Effective-Programming/dp/1491946008) + +Some gems in this more advanced book by the excellent Al Sweigart, author of the popular Automate the Boring Stuff with Python +* [Beyond the Basic Stuff with Python](https://nostarch.com/beyond-basic-stuff-python) + +More "battle-tested" advice from an experienced developer +* [Serious Python](https://nostarch.com/seriouspython) + +## Python Tutorials and Teachers + +Outstanding Python tutorials +* [Real Python](https://realpython.com/) + +Outstanding Python tutorials, with an emphasis on testing +* [Test Driven](https://testdriven.io/blog/) + +Curated Python content +* [Full Stack Python](https://www.fullstackpython.com) + +Coding problems and tutorials by my friend Trey. He is an amazing teacher. +* [Python Morsels](https://www.pythonmorsels.com/articles/) 🛠 +* [Trey Hunner](https://treyhunner.com/) 🛠 + +## General Python and Django Learning Resources + +Popular documentation framework +* [Diátaxis](https://diataxis.fr/) + +Python Patterns +* [Python Patterns](https://python-patterns.guide/) ⌛ + +General Python resources +* [Python Cheatsheet](https://gto76.github.io/python-cheatsheet/) +* [Google's PyGuide](https://google.github.io/styleguide/pyguide.html) +* [Practical Programming](https://dabeaz-course.github.io/practical-python/) and [Practical Programming GitHub](https://github.com/dabeaz-course/practical-python) + +The go-to intermediate to expert Django book +* [Two Scoops of Django 3.x](https://www.feldroy.com/books/two-scoops-of-django-3-x) + +Great, new-ish Python newsletter +* [Bite Code](https://www.bitecode.dev/) 🛠 + +A fabulous Django newsletter published every Friday, with all the most important Django news +* [Django News](https://django-news.com/) 🛠 + +## Data Structures and Algorithms + +The must-read algorithms book +* [Introduction to Algorithms](https://www.amazon.com/Introduction-Algorithms-fourth-Thomas-Cormen/dp/026204630X/) + +Coding challenges +* [Advent of Code](https://adventofcode.com/) ⌛ +* [NeetCode](https://neetcode.io/) ⌛ + +Course by the high profile Primeagen of Netflix. Does it live up to its name? +* [The Last Algorithms Course You'll Need](https://theprimeagen.github.io/fem-algos/) + +## APIs and Databases + +A tool I use and want to read up on +* [Django REST Framework](https://www.django-rest-framework.org/) + +I work in a database department and as such would like to better understand database capabilities. See also Simon Willison for SQLite experimentation. +* [Cockroach Labs](https://www.cockroachlabs.com/) ⌛ +* [Cockroach University](https://university.cockroachlabs.com/courses/) ⌛ +* [PostgreSQL Docs](https://www.postgresql.org/docs/) ⌛ +* [SQLite Docs](https://www.sqlite.org/docs.html) ⌛ + +## Testing + +Brian Okken's must-read pytest book +* [Python Testing with pytest](https://pragprog.com/titles/bopytest2/python-testing-with-pytest-second-edition/) + +Outstanding, free testing lessons, at one time overseen by my friend Andy "Automation Panda" Knight, testing expert. +* [Test Automation University](https://testautomationu.applitools.com/) + +Django test performance by the excellent Adam Johnson +* [Speed Up Your Django Tests](https://adamchainz.gumroad.com/l/suydt) + +## Refactoring, Patterns, Clean Code + +Martin Fowler is the patterns GOAT. I'd like to spend more time reading more of his work and applying it in real life. Refactoring 2nd Edition was updated in JavaScript. Patterns of Enterprise Application Architecture is said to be dated. +* [Martin Fowler](https://martinfowler.com) ⌛ +* [Refactoring 2nd Edition](https://martinfowler.com/articles/refactoring-2nd-ed.html) +* [Refactoring Catalog](https://refactoring.com/catalog/) ⌛ +* [Catalog of Patterns of Enterprise Application Architecture](https://martinfowler.com/eaaCatalog/) ⌛ + +Uncle Bob's controversial Clean Code. Not everyone likes him or his work, but it has clearly been influential. +* [Clean Code Cheat Sheet](https://github.com/charlax/professional-programming/blob/master/cheatsheets/Clean-Code-V2.4.pdf) + +Detailed list of coding considerations +* [Code Complete Checklist](https://www.matthewjmiller.net/files/cc2e_checklists.pdf) + +Exactly what the title says +* [Design Patterns for Humans GitHub](https://github.com/kamranahmedse/design-patterns-for-humans) ⌛ + +## General Engineering Resources + +Julie is an outstanding teacher. Check out her blog posts and 'zines. +* [Julia Evans](https://jvns.ca/) +* [Wizard Zines](https://wizardzines.com/) + +Several new-ish (or new-to-me) blogs that stand out +* [Architecture Notes](https://architecturenotes.co/) ⌛ +* [The Pragmatic Engineer](https://blog.pragmaticengineer.com/) +* [The Developing Dev](https://www.developing.dev/) + +Perhaps this is dated, but I'd like to know more +* [High Performance Web Sites Blog](http://stevesouders.com/) + +## How Companies Do Things + +A curated list of engineering blogs including most, if not all, of the leading tech companies, and many others too +* [Engineering Blogs](https://github.com/kilimchoi/engineering-blogs) ⌛ + +A classic blog about system architecture. Also happens to be "for sale." See the December 11 post and respond if you are serious. +* [High Scalability](http://highscalability.com/) ⌛ + +Information about how companies do testing and SRE +* [How They Test](https://github.com/abhivaikar/howtheytest) +* [How They SRE](https://github.com/upgundecha/howtheysre) + +The go-to system design learning resource +* [System Design Primer](https://github.com/donnemartin/system-design-primer) + +## How CPython Works + +Although I do not intend to divide my time between Python and C programming languages, I'd like to better understand how CPython works. +* [C for Python Programmers](https://realpython.com/c-for-python-programmers/) ⌛ +* [CPython Source Code Guide](https://realpython.com/cpython-source-code-guide/) +* [CPython Internals Book](https://realpython.com/products/cpython-internals-book/) +* [Building a Python C Extension Module](https://realpython.com/build-python-c-extension-module/) ⌛ +* [Compilers: Principles, Techniques, Tools (a.k.a. "The Dragon Book")](https://www.amazon.com/Compilers-Principles-Techniques-Tools-2nd/dp/0321486811) + +## Engineering and Management + +A legendary book by a business GOAT Andrew Grove +* [High Output Management](https://www.amazon.com/dp/B015VACHOK) + +An instant classic by Camille Fournier, also employed by JPMorgan Chase +* [The Manager's Path: A Guide for Tech Leaders Navigating Growth and Change](https://www.amazon.com/Managers-Path-Leaders-Navigating-Growth/dp/1491973897) + +I had the pleasure of eating lunch with Sarah Drasner at GitHub Universe 2019, then got to know her on Twitter over the years. She produces outstanding work, and I know this book will be no exception. +* [Engineering Management for the Rest of Us](https://www.amazon.com/Engineering-Management-Rest-Sarah-Drasner-ebook/dp/B0BGYVDX35) + +An intriguing subject from Tanya Reilly, the creator of the famous "Being Glue" talk. +* [The Staff Engineer's Path](https://www.oreilly.com/library/view/the-staff-engineers/9781098118723/) + +Although the Pragmatic Engineer Newsletter has not been around long, it has attracted a large following. The newsletter author wrote this book. I am intrigued. +* [The Software Engineer's Guidebook](https://www.engguidebook.com/) + +## More Great Books + +Highly recommended by many people I admire +* [The Courage to Be Disliked](https://www.amazon.com/Courage-Be-Disliked-Phenomenon-Happiness/dp/1501197274) + +A group of highly recommended books related to cumulative achievement and productivity +* [Atomic Habits](https://jamesclear.com/atomic-habits) +* [Tiny Habits](https://www.amazon.com/Tiny-Habits-Changes-Change-Everything/dp/0358003326) +* [Deep Work](https://www.amazon.com/Deep-Work-Focused-Success-Distracted/dp/1455586692) +* [Hooked and Indistractible](https://www.nirandfar.com) +* [Do Hard Things](https://www.amazon.com/Hard-Things-Resilience-Surprising-Toughness/dp/006309861X) + +An instant classic by the excellent Morgan Housel +* [The Psychology of Money](https://www.amazon.com/Psychology-Money-Timeless-lessons-happiness/dp/0857197681) + +## Transformational Leadership + +A colleague made me aware of the concept of [Transformational Leadership](https://en.wikipedia.org/wiki/Transformational_leadership). I love this graphic that categorizes leadership versus management. I hope to incorporate more leadership into my work to empower my colleagues. +* [Leadership versus Management](https://www.linkedin.com/posts/marcus-koehnlein_leadership-management-organization-activity-7070036302271762432-Hhly/?) ✓ + +## Agile and Scrum + +If you work in an agile/scrum environment, it's a good idea to revisit these evergreen resources from time-to-time. +* [Principles behind the Agile Manifesto](https://agilemanifesto.org/principles.html) ✓ +* [Scrum Guides](http://www.scrumguides.org/scrum-guide.html) ✓ + +## Product + +One of the most important voices in product management +* [Marty Cagan](https://www.linkedin.com/in/cagan) + +Prolific author of a widely-read, product-focused blog. Recently published the excellent The Ultimate Guide to Developer Productivity. +* [John Cutler](https://cutlefish.substack.com/) +* [The Ultimate Guide to Developer Productivity](https://cutlefish.substack.com/p/tbm-240-the-ultimate-guide-to-developer) + +A couple of resources that I've had bookmarked for a while to spend some time looking through. +* [Open Product Management](https://github.com/ProductHired/open-product-management) +* [Top 100 Resources for Product Managers](https://www.sachinrekhi.com/top-resources-for-product-managers) + +## Podcasts + +Interviews many of the movers and shakers of our time +* [Lex Fridman](https://www.youtube.com/c/lexfridman) + +An incredible example of hustle. His podcast put him on the map and helped him launch a career in VC, no small feat. Outstanding guests. +* [The 20 Minute VC](https://www.thetwentyminutevc.com/podcast/) + +## Certifications + +I will consider obtaining new certifications in 2024. AWS and CKAD are on my radar at the moment. +* [AWS Certifications](https://aws.amazon.com/certification/) ⏸ +* [Certified Kubernetes Application Developer (CKAD)](https://training.linuxfoundation.org/certification/certified-kubernetes-application-developer-ckad/) ⏸ diff --git a/_static/alabaster.css b/_static/alabaster.css new file mode 100644 index 00000000..7e75bf8f --- /dev/null +++ b/_static/alabaster.css @@ -0,0 +1,663 @@ +/* -- page layout ----------------------------------------------------------- */ + +body { + font-family: Georgia, serif; + font-size: 17px; + background-color: #fff; + color: #000; + margin: 0; + padding: 0; +} + + +div.document { + width: 940px; + margin: 30px auto 0 auto; +} + +div.documentwrapper { + float: left; + width: 100%; +} + +div.bodywrapper { + margin: 0 0 0 220px; +} + +div.sphinxsidebar { + width: 220px; + font-size: 14px; + line-height: 1.5; +} + +hr { + border: 1px solid #B1B4B6; +} + +div.body { + background-color: #fff; + color: #3E4349; + padding: 0 30px 0 30px; +} + +div.body > .section { + text-align: left; +} + +div.footer { + width: 940px; + margin: 20px auto 30px auto; + font-size: 14px; + color: #888; + text-align: right; +} + +div.footer a { + color: #888; +} + +p.caption { + font-family: inherit; + font-size: inherit; +} + + +div.relations { + display: none; +} + + +div.sphinxsidebar { + max-height: 100%; + overflow-y: auto; +} + +div.sphinxsidebar a { + color: #444; + text-decoration: none; + border-bottom: 1px dotted #999; +} + +div.sphinxsidebar a:hover { + border-bottom: 1px solid #999; +} + +div.sphinxsidebarwrapper { + padding: 18px 10px; +} + +div.sphinxsidebarwrapper p.logo { + padding: 0; + margin: -10px 0 0 0px; + text-align: center; +} + +div.sphinxsidebarwrapper h1.logo { + margin-top: -10px; + text-align: center; + margin-bottom: 5px; + text-align: left; +} + +div.sphinxsidebarwrapper h1.logo-name { + margin-top: 0px; +} + +div.sphinxsidebarwrapper p.blurb { + margin-top: 0; + font-style: normal; +} + +div.sphinxsidebar h3, +div.sphinxsidebar h4 { + font-family: Georgia, serif; + color: #444; + font-size: 24px; + font-weight: normal; + margin: 0 0 5px 0; + padding: 0; +} + +div.sphinxsidebar h4 { + font-size: 20px; +} + +div.sphinxsidebar h3 a { + color: #444; +} + +div.sphinxsidebar p.logo a, +div.sphinxsidebar h3 a, +div.sphinxsidebar p.logo a:hover, +div.sphinxsidebar h3 a:hover { + border: none; +} + +div.sphinxsidebar p { + color: #555; + margin: 10px 0; +} + +div.sphinxsidebar ul { + margin: 10px 0; + padding: 0; + color: #000; +} + +div.sphinxsidebar ul li.toctree-l1 > a { + font-size: 120%; +} + +div.sphinxsidebar ul li.toctree-l2 > a { + font-size: 110%; +} + +div.sphinxsidebar input { + border: 1px solid #CCC; + font-family: Georgia, serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox { + margin: 1em 0; +} + +div.sphinxsidebar .search > div { + display: table-cell; +} + +div.sphinxsidebar hr { + border: none; + height: 1px; + color: #AAA; + background: #AAA; + + text-align: left; + margin-left: 0; + width: 50%; +} + +div.sphinxsidebar .badge { + border-bottom: none; +} + +div.sphinxsidebar .badge:hover { + border-bottom: none; +} + +/* To address an issue with donation coming after search */ +div.sphinxsidebar h3.donation { + margin-top: 10px; +} + +/* -- body styles ----------------------------------------------------------- */ + +a { + color: #004B6B; + text-decoration: underline; +} + +a:hover { + color: #6D4100; + text-decoration: underline; +} + +div.body h1, +div.body h2, +div.body h3, +div.body h4, +div.body h5, +div.body h6 { + font-family: Georgia, serif; + font-weight: normal; + margin: 30px 0px 10px 0px; + padding: 0; +} + +div.body h1 { margin-top: 0; padding-top: 0; font-size: 240%; } +div.body h2 { font-size: 180%; } +div.body h3 { font-size: 150%; } +div.body h4 { font-size: 130%; } +div.body h5 { font-size: 100%; } +div.body h6 { font-size: 100%; } + +a.headerlink { + color: #DDD; + padding: 0 4px; + text-decoration: none; +} + +a.headerlink:hover { + color: #444; + background: #EAEAEA; +} + +div.body p, div.body dd, div.body li { + line-height: 1.4em; +} + +div.admonition { + margin: 20px 0px; + padding: 10px 30px; + background-color: #EEE; + border: 1px solid #CCC; +} + +div.admonition tt.xref, div.admonition code.xref, div.admonition a tt { + background-color: #FBFBFB; + border-bottom: 1px solid #fafafa; +} + +div.admonition p.admonition-title { + font-family: Georgia, serif; + font-weight: normal; + font-size: 24px; + margin: 0 0 10px 0; + padding: 0; + line-height: 1; +} + +div.admonition p.last { + margin-bottom: 0; +} + +dt:target, .highlight { + background: #FAF3E8; +} + +div.warning { + background-color: #FCC; + border: 1px solid #FAA; +} + +div.danger { + background-color: #FCC; + border: 1px solid #FAA; + -moz-box-shadow: 2px 2px 4px #D52C2C; + -webkit-box-shadow: 2px 2px 4px #D52C2C; + box-shadow: 2px 2px 4px #D52C2C; +} + +div.error { + background-color: #FCC; + border: 1px solid #FAA; + -moz-box-shadow: 2px 2px 4px #D52C2C; + -webkit-box-shadow: 2px 2px 4px #D52C2C; + box-shadow: 2px 2px 4px #D52C2C; +} + +div.caution { + background-color: #FCC; + border: 1px solid #FAA; +} + +div.attention { + background-color: #FCC; + border: 1px solid #FAA; +} + +div.important { + background-color: #EEE; + border: 1px solid #CCC; +} + +div.note { + background-color: #EEE; + border: 1px solid #CCC; +} + +div.tip { + background-color: #EEE; + border: 1px solid #CCC; +} + +div.hint { + background-color: #EEE; + border: 1px solid #CCC; +} + +div.seealso { + background-color: #EEE; + border: 1px solid #CCC; +} + +div.topic { + background-color: #EEE; +} + +p.admonition-title { + display: inline; +} + +p.admonition-title:after { + content: ":"; +} + +pre, tt, code { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; + font-size: 0.9em; +} + +.hll { + background-color: #FFC; + margin: 0 -12px; + padding: 0 12px; + display: block; +} + +img.screenshot { +} + +tt.descname, tt.descclassname, code.descname, code.descclassname { + font-size: 0.95em; +} + +tt.descname, code.descname { + padding-right: 0.08em; +} + +img.screenshot { + -moz-box-shadow: 2px 2px 4px #EEE; + -webkit-box-shadow: 2px 2px 4px #EEE; + box-shadow: 2px 2px 4px #EEE; +} + +table.docutils { + border: 1px solid #888; + -moz-box-shadow: 2px 2px 4px #EEE; + -webkit-box-shadow: 2px 2px 4px #EEE; + box-shadow: 2px 2px 4px #EEE; +} + +table.docutils td, table.docutils th { + border: 1px solid #888; + padding: 0.25em 0.7em; +} + +table.field-list, table.footnote { + border: none; + -moz-box-shadow: none; + -webkit-box-shadow: none; + box-shadow: none; +} + +table.footnote { + margin: 15px 0; + width: 100%; + border: 1px solid #EEE; + background: #FDFDFD; + font-size: 0.9em; +} + +table.footnote + table.footnote { + margin-top: -15px; + border-top: none; +} + +table.field-list th { + padding: 0 0.8em 0 0; +} + +table.field-list td { + padding: 0; +} + +table.field-list p { + margin-bottom: 0.8em; +} + +/* Cloned from + * https://github.com/sphinx-doc/sphinx/commit/ef60dbfce09286b20b7385333d63a60321784e68 + */ +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +table.footnote td.label { + width: .1px; + padding: 0.3em 0 0.3em 0.5em; +} + +table.footnote td { + padding: 0.3em 0.5em; +} + +dl { + margin-left: 0; + margin-right: 0; + margin-top: 0; + padding: 0; +} + +dl dd { + margin-left: 30px; +} + +blockquote { + margin: 0 0 0 30px; + padding: 0; +} + +ul, ol { + /* Matches the 30px from the narrow-screen "li > ul" selector below */ + margin: 10px 0 10px 30px; + padding: 0; +} + +pre { + background: unset; + padding: 7px 30px; + margin: 15px 0px; + line-height: 1.3em; +} + +div.viewcode-block:target { + background: #ffd; +} + +dl pre, blockquote pre, li pre { + margin-left: 0; + padding-left: 30px; +} + +tt, code { + background-color: #ecf0f3; + color: #222; + /* padding: 1px 2px; */ +} + +tt.xref, code.xref, a tt { + background-color: #FBFBFB; + border-bottom: 1px solid #fff; +} + +a.reference { + text-decoration: none; + border-bottom: 1px dotted #004B6B; +} + +a.reference:hover { + border-bottom: 1px solid #6D4100; +} + +/* Don't put an underline on images */ +a.image-reference, a.image-reference:hover { + border-bottom: none; +} + +a.footnote-reference { + text-decoration: none; + font-size: 0.7em; + vertical-align: top; + border-bottom: 1px dotted #004B6B; +} + +a.footnote-reference:hover { + border-bottom: 1px solid #6D4100; +} + +a:hover tt, a:hover code { + background: #EEE; +} + +@media screen and (max-width: 940px) { + + body { + margin: 0; + padding: 20px 30px; + } + + div.documentwrapper { + float: none; + background: #fff; + margin-left: 0; + margin-top: 0; + margin-right: 0; + margin-bottom: 0; + } + + div.sphinxsidebar { + display: block; + float: none; + width: unset; + margin: 50px -30px -20px -30px; + padding: 10px 20px; + background: #333; + color: #FFF; + } + + div.sphinxsidebar h3, div.sphinxsidebar h4, div.sphinxsidebar p, + div.sphinxsidebar h3 a { + color: #fff; + } + + div.sphinxsidebar a { + color: #AAA; + } + + div.sphinxsidebar p.logo { + display: none; + } + + div.document { + width: 100%; + margin: 0; + } + + div.footer { + display: none; + } + + div.bodywrapper { + margin: 0; + } + + div.body { + min-height: 0; + min-width: auto; /* fixes width on small screens, breaks .hll */ + padding: 0; + } + + .hll { + /* "fixes" the breakage */ + width: max-content; + } + + .rtd_doc_footer { + display: none; + } + + .document { + width: auto; + } + + .footer { + width: auto; + } + + .github { + display: none; + } + + ul { + margin-left: 0; + } + + li > ul { + /* Matches the 30px from the "ul, ol" selector above */ + margin-left: 30px; + } +} + + +/* misc. */ + +.revsys-inline { + display: none!important; +} + +/* Hide ugly table cell borders in ..bibliography:: directive output */ +table.docutils.citation, table.docutils.citation td, table.docutils.citation th { + border: none; + /* Below needed in some edge cases; if not applied, bottom shadows appear */ + -moz-box-shadow: none; + -webkit-box-shadow: none; + box-shadow: none; +} + + +/* relbar */ + +.related { + line-height: 30px; + width: 100%; + font-size: 0.9rem; +} + +.related.top { + border-bottom: 1px solid #EEE; + margin-bottom: 20px; +} + +.related.bottom { + border-top: 1px solid #EEE; +} + +.related ul { + padding: 0; + margin: 0; + list-style: none; +} + +.related li { + display: inline; +} + +nav#rellinks { + float: right; +} + +nav#rellinks li+li:before { + content: "|"; +} + +nav#breadcrumbs li+li:before { + content: "\00BB"; +} + +/* Hide certain items when printing */ +@media print { + div.related { + display: none; + } +} + +img.github { + position: absolute; + top: 0; + border: 0; + right: 0; +} \ No newline at end of file diff --git a/_static/basic.css b/_static/basic.css new file mode 100644 index 00000000..e5179b7a --- /dev/null +++ b/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: inherit; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/_static/custom.css b/_static/custom.css new file mode 100644 index 00000000..2a924f1d --- /dev/null +++ b/_static/custom.css @@ -0,0 +1 @@ +/* This file intentionally left blank. */ diff --git a/_static/doctools.js b/_static/doctools.js new file mode 100644 index 00000000..4d67807d --- /dev/null +++ b/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/_static/documentation_options.js b/_static/documentation_options.js new file mode 100644 index 00000000..e21c068c --- /dev/null +++ b/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '0.1', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/_static/file.png b/_static/file.png new file mode 100644 index 00000000..a858a410 Binary files /dev/null and b/_static/file.png differ diff --git a/_static/github-banner.svg b/_static/github-banner.svg new file mode 100644 index 00000000..c47d9dc0 --- /dev/null +++ b/_static/github-banner.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/_static/language_data.js b/_static/language_data.js new file mode 100644 index 00000000..367b8ed8 --- /dev/null +++ b/_static/language_data.js @@ -0,0 +1,199 @@ +/* + * language_data.js + * ~~~~~~~~~~~~~~~~ + * + * This script contains the language-specific data used by searchtools.js, + * namely the list of stopwords, stemmer, scorer and splitter. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +var stopwords = ["a", "and", "are", "as", "at", "be", "but", "by", "for", "if", "in", "into", "is", "it", "near", "no", "not", "of", "on", "or", "such", "that", "the", "their", "then", "there", "these", "they", "this", "to", "was", "will", "with"]; + + +/* Non-minified version is copied as a separate JS file, if available */ + +/** + * Porter Stemmer + */ +var Stemmer = function() { + + var step2list = { + ational: 'ate', + tional: 'tion', + enci: 'ence', + anci: 'ance', + izer: 'ize', + bli: 'ble', + alli: 'al', + entli: 'ent', + eli: 'e', + ousli: 'ous', + ization: 'ize', + ation: 'ate', + ator: 'ate', + alism: 'al', + iveness: 'ive', + fulness: 'ful', + ousness: 'ous', + aliti: 'al', + iviti: 'ive', + biliti: 'ble', + logi: 'log' + }; + + var step3list = { + icate: 'ic', + ative: '', + alize: 'al', + iciti: 'ic', + ical: 'ic', + ful: '', + ness: '' + }; + + var c = "[^aeiou]"; // consonant + var v = "[aeiouy]"; // vowel + var C = c + "[^aeiouy]*"; // consonant sequence + var V = v + "[aeiou]*"; // vowel sequence + + var mgr0 = "^(" + C + ")?" + V + C; // [C]VC... is m>0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + diff --git a/_static/minus.png b/_static/minus.png new file mode 100644 index 00000000..d96755fd Binary files /dev/null and b/_static/minus.png differ diff --git a/_static/plus.png b/_static/plus.png new file mode 100644 index 00000000..7107cec9 Binary files /dev/null and b/_static/plus.png differ diff --git a/_static/pygments.css b/_static/pygments.css new file mode 100644 index 00000000..04a41742 --- /dev/null +++ b/_static/pygments.css @@ -0,0 +1,84 @@ +pre { line-height: 125%; } +td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.highlight .hll { background-color: #ffffcc } +.highlight { background: #f8f8f8; } +.highlight .c { color: #8f5902; font-style: italic } /* Comment */ +.highlight .err { color: #a40000; border: 1px solid #ef2929 } /* Error */ +.highlight .g { color: #000000 } /* Generic */ +.highlight .k { color: #004461; font-weight: bold } /* Keyword */ +.highlight .l { color: #000000 } /* Literal */ +.highlight .n { color: #000000 } /* Name */ +.highlight .o { color: #582800 } /* Operator */ +.highlight .x { color: #000000 } /* Other */ +.highlight .p { color: #000000; font-weight: bold } /* Punctuation */ +.highlight .ch { color: #8f5902; font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: #8f5902; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #8f5902 } /* Comment.Preproc */ +.highlight .cpf { color: #8f5902; font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: #8f5902; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #8f5902; font-style: italic } /* Comment.Special */ +.highlight .gd { color: #a40000 } /* Generic.Deleted */ +.highlight .ge { color: #000000; font-style: italic } /* Generic.Emph */ +.highlight .ges { color: #000000 } /* Generic.EmphStrong */ +.highlight .gr { color: #ef2929 } /* Generic.Error */ +.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.highlight .gi { color: #00A000 } /* Generic.Inserted */ +.highlight .go { color: #888888 } /* Generic.Output */ +.highlight .gp { color: #745334 } /* Generic.Prompt */ +.highlight .gs { color: #000000; font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #a40000; font-weight: bold } /* Generic.Traceback */ +.highlight .kc { color: #004461; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #004461; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #004461; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #004461; font-weight: bold } /* Keyword.Pseudo */ +.highlight .kr { color: #004461; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #004461; font-weight: bold } /* Keyword.Type */ +.highlight .ld { color: #000000 } /* Literal.Date */ +.highlight .m { color: #990000 } /* Literal.Number */ +.highlight .s { color: #4e9a06 } /* Literal.String */ +.highlight .na { color: #c4a000 } /* Name.Attribute */ +.highlight .nb { color: #004461 } /* Name.Builtin */ +.highlight .nc { color: #000000 } /* Name.Class */ +.highlight .no { color: #000000 } /* Name.Constant */ +.highlight .nd { color: #888888 } /* Name.Decorator */ +.highlight .ni { color: #ce5c00 } /* Name.Entity */ +.highlight .ne { color: #cc0000; font-weight: bold } /* Name.Exception */ +.highlight .nf { color: #000000 } /* Name.Function */ +.highlight .nl { color: #f57900 } /* Name.Label */ +.highlight .nn { color: #000000 } /* Name.Namespace */ +.highlight .nx { color: #000000 } /* Name.Other */ +.highlight .py { color: #000000 } /* Name.Property */ +.highlight .nt { color: #004461; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #000000 } /* Name.Variable */ +.highlight .ow { color: #004461; font-weight: bold } /* Operator.Word */ +.highlight .pm { color: #000000; font-weight: bold } /* Punctuation.Marker */ +.highlight .w { color: #f8f8f8 } /* Text.Whitespace */ +.highlight .mb { color: #990000 } /* Literal.Number.Bin */ +.highlight .mf { color: #990000 } /* Literal.Number.Float */ +.highlight .mh { color: #990000 } /* Literal.Number.Hex */ +.highlight .mi { color: #990000 } /* Literal.Number.Integer */ +.highlight .mo { color: #990000 } /* Literal.Number.Oct */ +.highlight .sa { color: #4e9a06 } /* Literal.String.Affix */ +.highlight .sb { color: #4e9a06 } /* Literal.String.Backtick */ +.highlight .sc { color: #4e9a06 } /* Literal.String.Char */ +.highlight .dl { color: #4e9a06 } /* Literal.String.Delimiter */ +.highlight .sd { color: #8f5902; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #4e9a06 } /* Literal.String.Double */ +.highlight .se { color: #4e9a06 } /* Literal.String.Escape */ +.highlight .sh { color: #4e9a06 } /* Literal.String.Heredoc */ +.highlight .si { color: #4e9a06 } /* Literal.String.Interpol */ +.highlight .sx { color: #4e9a06 } /* Literal.String.Other */ +.highlight .sr { color: #4e9a06 } /* Literal.String.Regex */ +.highlight .s1 { color: #4e9a06 } /* Literal.String.Single */ +.highlight .ss { color: #4e9a06 } /* Literal.String.Symbol */ +.highlight .bp { color: #3465a4 } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #000000 } /* Name.Function.Magic */ +.highlight .vc { color: #000000 } /* Name.Variable.Class */ +.highlight .vg { color: #000000 } /* Name.Variable.Global */ +.highlight .vi { color: #000000 } /* Name.Variable.Instance */ +.highlight .vm { color: #000000 } /* Name.Variable.Magic */ +.highlight .il { color: #990000 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/_static/searchtools.js b/_static/searchtools.js new file mode 100644 index 00000000..b08d58c9 --- /dev/null +++ b/_static/searchtools.js @@ -0,0 +1,620 @@ +/* + * searchtools.js + * ~~~~~~~~~~~~~~~~ + * + * Sphinx JavaScript utilities for the full-text search. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +/** + * Simple result scoring code. + */ +if (typeof Scorer === "undefined") { + var Scorer = { + // Implement the following function to further tweak the score for each result + // The function takes a result array [docname, title, anchor, descr, score, filename] + // and returns the new score. + /* + score: result => { + const [docname, title, anchor, descr, score, filename] = result + return score + }, + */ + + // query matches the full name of an object + objNameMatch: 11, + // or matches in the last dotted part of the object name + objPartialMatch: 6, + // Additive scores depending on the priority of the object + objPrio: { + 0: 15, // used to be importantResults + 1: 5, // used to be objectResults + 2: -5, // used to be unimportantResults + }, + // Used when the priority is not in the mapping. + objPrioDefault: 0, + + // query found in title + title: 15, + partialTitle: 7, + // query found in terms + term: 5, + partialTerm: 2, + }; +} + +const _removeChildren = (element) => { + while (element && element.lastChild) element.removeChild(element.lastChild); +}; + +/** + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping + */ +const _escapeRegExp = (string) => + string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string + +const _displayItem = (item, searchTerms, highlightTerms) => { + const docBuilder = DOCUMENTATION_OPTIONS.BUILDER; + const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX; + const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX; + const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; + const contentRoot = document.documentElement.dataset.content_root; + + const [docName, title, anchor, descr, score, _filename] = item; + + let listItem = document.createElement("li"); + let requestUrl; + let linkUrl; + if (docBuilder === "dirhtml") { + // dirhtml builder + let dirname = docName + "/"; + if (dirname.match(/\/index\/$/)) + dirname = dirname.substring(0, dirname.length - 6); + else if (dirname === "index/") dirname = ""; + requestUrl = contentRoot + dirname; + linkUrl = requestUrl; + } else { + // normal html builders + requestUrl = contentRoot + docName + docFileSuffix; + linkUrl = docName + docLinkSuffix; + } + let linkEl = listItem.appendChild(document.createElement("a")); + linkEl.href = linkUrl + anchor; + linkEl.dataset.score = score; + linkEl.innerHTML = title; + if (descr) { + listItem.appendChild(document.createElement("span")).innerHTML = + " (" + descr + ")"; + // highlight search terms in the description + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + } + else if (showSearchSummary) + fetch(requestUrl) + .then((responseData) => responseData.text()) + .then((data) => { + if (data) + listItem.appendChild( + Search.makeSearchSummary(data, searchTerms, anchor) + ); + // highlight search terms in the summary + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + }); + Search.output.appendChild(listItem); +}; +const _finishSearch = (resultCount) => { + Search.stopPulse(); + Search.title.innerText = _("Search Results"); + if (!resultCount) + Search.status.innerText = Documentation.gettext( + "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories." + ); + else + Search.status.innerText = _( + "Search finished, found ${resultCount} page(s) matching the search query." + ).replace('${resultCount}', resultCount); +}; +const _displayNextItem = ( + results, + resultCount, + searchTerms, + highlightTerms, +) => { + // results left, load the summary and display it + // this is intended to be dynamic (don't sub resultsCount) + if (results.length) { + _displayItem(results.pop(), searchTerms, highlightTerms); + setTimeout( + () => _displayNextItem(results, resultCount, searchTerms, highlightTerms), + 5 + ); + } + // search finished, update title and status message + else _finishSearch(resultCount); +}; +// Helper function used by query() to order search results. +// Each input is an array of [docname, title, anchor, descr, score, filename]. +// Order the results by score (in opposite order of appearance, since the +// `_displayNextItem` function uses pop() to retrieve items) and then alphabetically. +const _orderResultsByScoreThenName = (a, b) => { + const leftScore = a[4]; + const rightScore = b[4]; + if (leftScore === rightScore) { + // same score: sort alphabetically + const leftTitle = a[1].toLowerCase(); + const rightTitle = b[1].toLowerCase(); + if (leftTitle === rightTitle) return 0; + return leftTitle > rightTitle ? -1 : 1; // inverted is intentional + } + return leftScore > rightScore ? 1 : -1; +}; + +/** + * Default splitQuery function. Can be overridden in ``sphinx.search`` with a + * custom function per language. + * + * The regular expression works by splitting the string on consecutive characters + * that are not Unicode letters, numbers, underscores, or emoji characters. + * This is the same as ``\W+`` in Python, preserving the surrogate pair area. + */ +if (typeof splitQuery === "undefined") { + var splitQuery = (query) => query + .split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu) + .filter(term => term) // remove remaining empty strings +} + +/** + * Search Module + */ +const Search = { + _index: null, + _queued_query: null, + _pulse_status: -1, + + htmlToText: (htmlString, anchor) => { + const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html'); + for (const removalQuery of [".headerlink", "script", "style"]) { + htmlElement.querySelectorAll(removalQuery).forEach((el) => { el.remove() }); + } + if (anchor) { + const anchorContent = htmlElement.querySelector(`[role="main"] ${anchor}`); + if (anchorContent) return anchorContent.textContent; + + console.warn( + `Anchored content block not found. Sphinx search tries to obtain it via DOM query '[role=main] ${anchor}'. Check your theme or template.` + ); + } + + // if anchor not specified or not found, fall back to main content + const docContent = htmlElement.querySelector('[role="main"]'); + if (docContent) return docContent.textContent; + + console.warn( + "Content block not found. Sphinx search tries to obtain it via DOM query '[role=main]'. Check your theme or template." + ); + return ""; + }, + + init: () => { + const query = new URLSearchParams(window.location.search).get("q"); + document + .querySelectorAll('input[name="q"]') + .forEach((el) => (el.value = query)); + if (query) Search.performSearch(query); + }, + + loadIndex: (url) => + (document.body.appendChild(document.createElement("script")).src = url), + + setIndex: (index) => { + Search._index = index; + if (Search._queued_query !== null) { + const query = Search._queued_query; + Search._queued_query = null; + Search.query(query); + } + }, + + hasIndex: () => Search._index !== null, + + deferQuery: (query) => (Search._queued_query = query), + + stopPulse: () => (Search._pulse_status = -1), + + startPulse: () => { + if (Search._pulse_status >= 0) return; + + const pulse = () => { + Search._pulse_status = (Search._pulse_status + 1) % 4; + Search.dots.innerText = ".".repeat(Search._pulse_status); + if (Search._pulse_status >= 0) window.setTimeout(pulse, 500); + }; + pulse(); + }, + + /** + * perform a search for something (or wait until index is loaded) + */ + performSearch: (query) => { + // create the required interface elements + const searchText = document.createElement("h2"); + searchText.textContent = _("Searching"); + const searchSummary = document.createElement("p"); + searchSummary.classList.add("search-summary"); + searchSummary.innerText = ""; + const searchList = document.createElement("ul"); + searchList.classList.add("search"); + + const out = document.getElementById("search-results"); + Search.title = out.appendChild(searchText); + Search.dots = Search.title.appendChild(document.createElement("span")); + Search.status = out.appendChild(searchSummary); + Search.output = out.appendChild(searchList); + + const searchProgress = document.getElementById("search-progress"); + // Some themes don't use the search progress node + if (searchProgress) { + searchProgress.innerText = _("Preparing search..."); + } + Search.startPulse(); + + // index already loaded, the browser was quick! + if (Search.hasIndex()) Search.query(query); + else Search.deferQuery(query); + }, + + _parseQuery: (query) => { + // stem the search terms and add them to the correct list + const stemmer = new Stemmer(); + const searchTerms = new Set(); + const excludedTerms = new Set(); + const highlightTerms = new Set(); + const objectTerms = new Set(splitQuery(query.toLowerCase().trim())); + splitQuery(query.trim()).forEach((queryTerm) => { + const queryTermLower = queryTerm.toLowerCase(); + + // maybe skip this "word" + // stopwords array is from language_data.js + if ( + stopwords.indexOf(queryTermLower) !== -1 || + queryTerm.match(/^\d+$/) + ) + return; + + // stem the word + let word = stemmer.stemWord(queryTermLower); + // select the correct list + if (word[0] === "-") excludedTerms.add(word.substr(1)); + else { + searchTerms.add(word); + highlightTerms.add(queryTermLower); + } + }); + + if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js + localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" ")) + } + + // console.debug("SEARCH: searching for:"); + // console.info("required: ", [...searchTerms]); + // console.info("excluded: ", [...excludedTerms]); + + return [query, searchTerms, excludedTerms, highlightTerms, objectTerms]; + }, + + /** + * execute search (requires search index to be loaded) + */ + _performSearch: (query, searchTerms, excludedTerms, highlightTerms, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + const allTitles = Search._index.alltitles; + const indexEntries = Search._index.indexentries; + + // Collect multiple result groups to be sorted separately and then ordered. + // Each is an array of [docname, title, anchor, descr, score, filename]. + const normalResults = []; + const nonMainIndexResults = []; + + _removeChildren(document.getElementById("search-progress")); + + const queryLower = query.toLowerCase().trim(); + for (const [title, foundTitles] of Object.entries(allTitles)) { + if (title.toLowerCase().trim().includes(queryLower) && (queryLower.length >= title.length/2)) { + for (const [file, id] of foundTitles) { + const score = Math.round(Scorer.title * queryLower.length / title.length); + const boost = titles[file] === title ? 1 : 0; // add a boost for document titles + normalResults.push([ + docNames[file], + titles[file] !== title ? `${titles[file]} > ${title}` : title, + id !== null ? "#" + id : "", + null, + score + boost, + filenames[file], + ]); + } + } + } + + // search for explicit entries in index directives + for (const [entry, foundEntries] of Object.entries(indexEntries)) { + if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { + for (const [file, id, isMain] of foundEntries) { + const score = Math.round(100 * queryLower.length / entry.length); + const result = [ + docNames[file], + titles[file], + id ? "#" + id : "", + null, + score, + filenames[file], + ]; + if (isMain) { + normalResults.push(result); + } else { + nonMainIndexResults.push(result); + } + } + } + } + + // lookup as object + objectTerms.forEach((term) => + normalResults.push(...Search.performObjectSearch(term, objectTerms)) + ); + + // lookup as search terms in fulltext + normalResults.push(...Search.performTermsSearch(searchTerms, excludedTerms)); + + // let the scorer override scores with a custom scoring function + if (Scorer.score) { + normalResults.forEach((item) => (item[4] = Scorer.score(item))); + nonMainIndexResults.forEach((item) => (item[4] = Scorer.score(item))); + } + + // Sort each group of results by score and then alphabetically by name. + normalResults.sort(_orderResultsByScoreThenName); + nonMainIndexResults.sort(_orderResultsByScoreThenName); + + // Combine the result groups in (reverse) order. + // Non-main index entries are typically arbitrary cross-references, + // so display them after other results. + let results = [...nonMainIndexResults, ...normalResults]; + + // remove duplicate search results + // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept + let seen = new Set(); + results = results.reverse().reduce((acc, result) => { + let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(','); + if (!seen.has(resultStr)) { + acc.push(result); + seen.add(resultStr); + } + return acc; + }, []); + + return results.reverse(); + }, + + query: (query) => { + const [searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms] = Search._parseQuery(query); + const results = Search._performSearch(searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms); + + // for debugging + //Search.lastresults = results.slice(); // a copy + // console.info("search results:", Search.lastresults); + + // print the results + _displayNextItem(results, results.length, searchTerms, highlightTerms); + }, + + /** + * search for object names + */ + performObjectSearch: (object, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const objects = Search._index.objects; + const objNames = Search._index.objnames; + const titles = Search._index.titles; + + const results = []; + + const objectSearchCallback = (prefix, match) => { + const name = match[4] + const fullname = (prefix ? prefix + "." : "") + name; + const fullnameLower = fullname.toLowerCase(); + if (fullnameLower.indexOf(object) < 0) return; + + let score = 0; + const parts = fullnameLower.split("."); + + // check for different match types: exact matches of full name or + // "last name" (i.e. last dotted part) + if (fullnameLower === object || parts.slice(-1)[0] === object) + score += Scorer.objNameMatch; + else if (parts.slice(-1)[0].indexOf(object) > -1) + score += Scorer.objPartialMatch; // matches in last name + + const objName = objNames[match[1]][2]; + const title = titles[match[0]]; + + // If more than one term searched for, we require other words to be + // found in the name/title/description + const otherTerms = new Set(objectTerms); + otherTerms.delete(object); + if (otherTerms.size > 0) { + const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase(); + if ( + [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0) + ) + return; + } + + let anchor = match[3]; + if (anchor === "") anchor = fullname; + else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname; + + const descr = objName + _(", in ") + title; + + // add custom score for some objects according to scorer + if (Scorer.objPrio.hasOwnProperty(match[2])) + score += Scorer.objPrio[match[2]]; + else score += Scorer.objPrioDefault; + + results.push([ + docNames[match[0]], + fullname, + "#" + anchor, + descr, + score, + filenames[match[0]], + ]); + }; + Object.keys(objects).forEach((prefix) => + objects[prefix].forEach((array) => + objectSearchCallback(prefix, array) + ) + ); + return results; + }, + + /** + * search for full-text terms in the index + */ + performTermsSearch: (searchTerms, excludedTerms) => { + // prepare search + const terms = Search._index.terms; + const titleTerms = Search._index.titleterms; + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + + const scoreMap = new Map(); + const fileMap = new Map(); + + // perform the search on the required terms + searchTerms.forEach((word) => { + const files = []; + const arr = [ + { files: terms[word], score: Scorer.term }, + { files: titleTerms[word], score: Scorer.title }, + ]; + // add support for partial matches + if (word.length > 2) { + const escapedWord = _escapeRegExp(word); + if (!terms.hasOwnProperty(word)) { + Object.keys(terms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: terms[term], score: Scorer.partialTerm }); + }); + } + if (!titleTerms.hasOwnProperty(word)) { + Object.keys(titleTerms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: titleTerms[term], score: Scorer.partialTitle }); + }); + } + } + + // no match but word was a required one + if (arr.every((record) => record.files === undefined)) return; + + // found search word in contents + arr.forEach((record) => { + if (record.files === undefined) return; + + let recordFiles = record.files; + if (recordFiles.length === undefined) recordFiles = [recordFiles]; + files.push(...recordFiles); + + // set score for the word in each file + recordFiles.forEach((file) => { + if (!scoreMap.has(file)) scoreMap.set(file, {}); + scoreMap.get(file)[word] = record.score; + }); + }); + + // create the mapping + files.forEach((file) => { + if (!fileMap.has(file)) fileMap.set(file, [word]); + else if (fileMap.get(file).indexOf(word) === -1) fileMap.get(file).push(word); + }); + }); + + // now check if the files don't contain excluded terms + const results = []; + for (const [file, wordList] of fileMap) { + // check if all requirements are matched + + // as search terms with length < 3 are discarded + const filteredTermCount = [...searchTerms].filter( + (term) => term.length > 2 + ).length; + if ( + wordList.length !== searchTerms.size && + wordList.length !== filteredTermCount + ) + continue; + + // ensure that none of the excluded terms is in the search result + if ( + [...excludedTerms].some( + (term) => + terms[term] === file || + titleTerms[term] === file || + (terms[term] || []).includes(file) || + (titleTerms[term] || []).includes(file) + ) + ) + break; + + // select one (max) score for the file. + const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w])); + // add result to the result list + results.push([ + docNames[file], + titles[file], + "", + null, + score, + filenames[file], + ]); + } + return results; + }, + + /** + * helper function to return a node containing the + * search summary for a given text. keywords is a list + * of stemmed words. + */ + makeSearchSummary: (htmlText, keywords, anchor) => { + const text = Search.htmlToText(htmlText, anchor); + if (text === "") return null; + + const textLower = text.toLowerCase(); + const actualStartPosition = [...keywords] + .map((k) => textLower.indexOf(k.toLowerCase())) + .filter((i) => i > -1) + .slice(-1)[0]; + const startWithContext = Math.max(actualStartPosition - 120, 0); + + const top = startWithContext === 0 ? "" : "..."; + const tail = startWithContext + 240 < text.length ? "..." : ""; + + let summary = document.createElement("p"); + summary.classList.add("context"); + summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; + + return summary; + }, +}; + +_ready(Search.init); diff --git a/_static/sphinx_highlight.js b/_static/sphinx_highlight.js new file mode 100644 index 00000000..8a96c69a --- /dev/null +++ b/_static/sphinx_highlight.js @@ -0,0 +1,154 @@ +/* Highlighting utilities for Sphinx HTML documentation. */ +"use strict"; + +const SPHINX_HIGHLIGHT_ENABLED = true + +/** + * highlight a given string on a node by wrapping it in + * span elements with the given class name. + */ +const _highlight = (node, addItems, text, className) => { + if (node.nodeType === Node.TEXT_NODE) { + const val = node.nodeValue; + const parent = node.parentNode; + const pos = val.toLowerCase().indexOf(text); + if ( + pos >= 0 && + !parent.classList.contains(className) && + !parent.classList.contains("nohighlight") + ) { + let span; + + const closestNode = parent.closest("body, svg, foreignObject"); + const isInSVG = closestNode && closestNode.matches("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.classList.add(className); + } + + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + const rest = document.createTextNode(val.substr(pos + text.length)); + parent.insertBefore( + span, + parent.insertBefore( + rest, + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + /* There may be more occurrences of search term in this node. So call this + * function recursively on the remaining fragment. + */ + _highlight(rest, addItems, text, className); + + if (isInSVG) { + const rect = document.createElementNS( + "http://www.w3.org/2000/svg", + "rect" + ); + const bbox = parent.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute("class", className); + addItems.push({ parent: parent, target: rect }); + } + } + } else if (node.matches && !node.matches("button, select, textarea")) { + node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); + } +}; +const _highlightText = (thisNode, text, className) => { + let addItems = []; + _highlight(thisNode, addItems, text, className); + addItems.forEach((obj) => + obj.parent.insertAdjacentElement("beforebegin", obj.target) + ); +}; + +/** + * Small JavaScript module for the documentation. + */ +const SphinxHighlight = { + + /** + * highlight the search words provided in localstorage in the text + */ + highlightSearchWords: () => { + if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight + + // get and clear terms from localstorage + const url = new URL(window.location); + const highlight = + localStorage.getItem("sphinx_highlight_terms") + || url.searchParams.get("highlight") + || ""; + localStorage.removeItem("sphinx_highlight_terms") + url.searchParams.delete("highlight"); + window.history.replaceState({}, "", url); + + // get individual terms from highlight string + const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); + if (terms.length === 0) return; // nothing to do + + // There should never be more than one element matching "div.body" + const divBody = document.querySelectorAll("div.body"); + const body = divBody.length ? divBody[0] : document.querySelector("body"); + window.setTimeout(() => { + terms.forEach((term) => _highlightText(body, term, "highlighted")); + }, 10); + + const searchBox = document.getElementById("searchbox"); + if (searchBox === null) return; + searchBox.appendChild( + document + .createRange() + .createContextualFragment( + '" + ) + ); + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords: () => { + document + .querySelectorAll("#searchbox .highlight-link") + .forEach((el) => el.remove()); + document + .querySelectorAll("span.highlighted") + .forEach((el) => el.classList.remove("highlighted")); + localStorage.removeItem("sphinx_highlight_terms") + }, + + initEscapeListener: () => { + // only install a listener if it is really needed + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; + if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { + SphinxHighlight.hideSearchWords(); + event.preventDefault(); + } + }); + }, +}; + +_ready(() => { + /* Do not call highlightSearchWords() when we are on the search page. + * It will highlight words from the *previous* search query. + */ + if (typeof Search === "undefined") SphinxHighlight.highlightSearchWords(); + SphinxHighlight.initEscapeListener(); +}); diff --git a/about-me.html b/about-me.html new file mode 100644 index 00000000..822f2536 --- /dev/null +++ b/about-me.html @@ -0,0 +1,132 @@ + + + + + + + + About Me — Portfolio 0.1 documentation + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

About Me

+
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/building-a-taco-johns-scraper.html b/building-a-taco-johns-scraper.html new file mode 100644 index 00000000..9b01575a --- /dev/null +++ b/building-a-taco-johns-scraper.html @@ -0,0 +1,378 @@ + + + + + + + + Building a Taco John’s Scraper — Portfolio 0.1 documentation + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

Building a Taco John’s Scraper

+
+

Before I Begin

+

I created this scraper as a fun programming exercise to solve a hypothetical problem.

+

A couple of important things to know:

+
    +
  • Scraping is sometimes considered controversial, and can have unintended consequences. For example, I recently read an article about a person being indefinitely locked out of their Google account due to their scraping activity! Be careful out there.

  • +
  • Some websites have been designed to have a built-in API (Application Programming Interface), which enables data to be obtained from the website database in a controlled way. Before scraping, you might want to see if an API exists and whether it serves your purpose. APIs are often well documented. Here are a couple of lists of APIs as examples: https://github.com/public-apis/public-apis and https://github.com/n0shake/Public-APIs

  • +
+
+
+

What is Scraping?

+

Imagine that a website contains some structured data that you would like to obtain. For example, perhaps you are a data scientist who would like to do an analysis of a store’s products, or you are a web developer who would like to create a website that aggregates product information.

+

One way to obtain the data is to use a mouse to click through the pages of the website. But, depending on how much data you’d like to obtain, this might not only be inconvenient, it might not be humanly possible!

+

Perhaps, sometime, while looking through the menu of your website browser, you’ve clicked on an option that says “View Source” and you’ve gotten a glimpse of some of the source code, that is normally hidden, that runs a website page.

+

Clicking on “View Source”

+

+

A source code snippet… this source code had been “minified” to improve website performance. I used a formatting tool to un-minify it.

+

+

In addition to an official standard library that contains all of the commonly used features of the language, Python programming language has a rich ecosystem of third-party tools that can be used to do powerful things.

+

One of the third-party tools in the Python ecosystem is called Scrapy. Scrapy can be used to create a Python program that can programatically follow a website’s URLs (links) in the source code to obtain, or “scrape” the structured data you are in search of and output it in a form that you can save and use.

+

Unlike a human being, a scraper can hypothetically do this on a massive scale, in a short amount of time, and on a schedule.

+
+
+

Making a Scraper for Hacktoberfest

+

Hacktoberfest, sponsored by GitHub and Digital Ocean, is a month-long celebration of open-source code. If you submit four pull requests (proposed contributions) to participating open-source projects on GitHub during October, and the pull requests are considered valid and merged, you will receive a t-shirt or have a tree planted in your name, up to the first 70,000 people.

+

If you are ever interested in getting involved in open source and don’t know where to get started, I sometimes give a talk about it called “Get a Jumpstart on Collaboration and Code Review in GitHub.” Check out my talk slides and script in my GitHub account.

+

While I was looking through GitHub repos (places where code is stored) to identify contributions I could make that would qualify for Hacktoberfest, I came across a repo called All the Places. All the Places project contains a collection of Scrapy scripts (a.k.a “spiders”) that can be used to scrape business websites for location data.

+

For a while now, I’ve been wanting to learn how to make a scraper, so I decided to make one of my own to contribute to the All the Places project for Hacktoberfest.

+
+
+

Considerations

+

To begin with, I attempted to make scrapers for several different websites and learned by trial and error about the challenges.

+

Firstly, because All the Places scrapers are intended to be used to collect geographical information, it’s required that location latitude and longitude information be scraped from the website. But, even if the latitude and longitude information is contained within the website, it’s not necessarily easily accessible. If the source code contains a Google Map URL that has the location latitude and longitude information within the URL, that information can be scraped directly. But, in one project I worked on, the Google Map URL contained the location address instead of its latitude and longitude, making that information much less straight forward to obtain.

+

Google Map URL that contains latitude and longitude data

+
https://www.google.com/maps/place/Taco+John's/@38.9728434,-95.2478613,15z/data=!4m5!3m4!1s0x0:0x9ed745c4be038bd6!8m2!3d38.9728434!4d-95.2478613
+
+
+

Google Map URL that contains an address

+
https://www.google.com/maps/dir/Taco+John's,+West+6th+Street,+Lawrence,+KS/
+
+
+

Secondly, there is a lot of inconsistency in the way that websites are structured. In an “easier” scenario, the website structure and its URLs will progress in a predictable way. For example, maybe the relevant URLs in a page listing states will only lead to city pages and the URLs in the city pages will only lead to restaurant pages. Unfortunately, the URLs in the Taco John’s website are inconsistent, which you’ll learn about later.

+

Thirdly, when scraping information from a page, you are at the mercy of the meticulousness of the developer who wrote the source code. Better structured and documented source code (for instance, that is structured using a schema) can make your life easier.

+

Snippet of HTML structured using PostalAddress Schema

+
<div class="information-address-content"><span class="coordinates" itemprop="geo" itemscope itemtype="http://schema.org/GeoCoordinates"><meta itemprop="latitude" content="38.9728433610435"><meta itemprop="longitude" content="-95.24786129593849"></span><address class="c-address" itemscope itemtype="http://schema.org/PostalAddress" itemprop="address"><span class="c-address-street" itemprop="streetAddress"><span class="c-address-street-1">1101 W 6th St </span></span><span class="c-address-city"><span itemprop="addressLocality">Lawrence</span><span class="c-address-city-comma">,</span></span> <abbr title="Kansas" aria-label="Kansas" class="c-address-state" itemprop="addressRegion">KS</abbr> <span class="c-address-postal-code" itemprop="postalCode"> 66044</span> <abbr title="United States" aria-label="United States" class="c-address-country-name c-address-country-us" itemprop="addressCountry">US</abbr></address></div>
+
+
+

However… inconsistent website structure and poorly written source code can also strengthen your problem solving muscles.

+

After a lot of experimentation with websites in the All the Places issues, I decided to identify a site on my own to scrape. I thought about restaurant chains in Kansas and Taco John’s immediately came to mind. When I lived in Lawrence, Kansas, I often went through the drive-through of the Taco John’s at 1626 W 23rd St (now closed) on Taco Tuesday, and picked up several tacos and an order of Potato Olés®. Yum.

+
+
+

How Location Pages Work on the Taco John’s Website

+

I set my Taco John’s scraper up to begin “crawling” at the main Taco John’s locations page. This locations page is an index of states where Taco John’s restaurants are located.

+

Taco John’s locations page (https://locations.tacojohns.com/)

+

+

Clicking on a URL in the locations page will usually open up an index page showing the cities where Taco John’s restaurants are located in the state.

+

Taco John’s state page example (https://locations.tacojohns.com/ks.html)

+

+

If a city contains more than one Taco John’s restaurant, clicking on the city URL will open an index page showing all of the restaurants in the city.

+

Taco John’s city page example (https://locations.tacojohns.com/ks/lawrence.html)

+

+

Clicking on one of these URLs will open up the restaurant page.

+

Taco John’s restaurant page example (https://locations.tacojohns.com/ks/lawrence/1101-w-6th-st.html)

+

+

If a city contains only one Taco John’s restaurant, clicking on the city URL will open up the restaurant page directly.

+
+
+

The Challenge

+

I said that clicking on a link in the locations page will usually open up a state page showing the cities where Taco John’s restaurants are located. But unfortunately, this is not always the case.

+

State page links on locations page

+
https://locations.tacojohns.com/co.html
+https://locations.tacojohns.com/id.html
+https://locations.tacojohns.com/il.html                            
+https://locations.tacojohns.com/in.html
+https://locations.tacojohns.com/ia.html
+https://locations.tacojohns.com/ks.html                           
+https://locations.tacojohns.com/ky.html
+https://locations.tacojohns.com/mn.html
+https://locations.tacojohns.com/mo.html
+https://locations.tacojohns.com/mt.html                       
+https://locations.tacojohns.com/ne.html
+https://locations.tacojohns.com/nd.html
+https://locations.tacojohns.com/oh.html
+https://locations.tacojohns.com/sd.html
+https://locations.tacojohns.com/tn.html
+https://locations.tacojohns.com/wa.html
+https://locations.tacojohns.com/wi.html
+https://locations.tacojohns.com/wy.html
+
+
+

Only one city in Arkansas (Russellville) has any Taco John’s location and that city has two. So, a state page is not required, but a city page is. The program needs to skip to a city page, then parse the location pages.

+

City page link on locations page

+
https://locations.tacojohns.com/ar/russellville.html
+
+
+

Three states (Michigan, Nevada, and New York), only have one restaurant in the state. So state and city pages are not required. The program needs to skip to a restaurant page.

+

Restaurant page links on locations page

+
https://locations.tacojohns.com/mi/stevensville/4107-red-arrow-highway.html
+https://locations.tacojohns.com/nv/reno/770-s-wells-ave.html
+https://locations.tacojohns.com/ny/jamaica/john-f--kennedy-international-airport.html
+
+
+

As a result, most of the links on the locations page are for state pages, one is for a city page, and three are for restaurant pages.

+

In programming, it’s important to “catch” exceptions, situations that differ from the norm, and plan for them in advance. Otherwise, the program might literally… not work.

+

My Scrapy program has specific instructions for how to parse each type of page. If the program always goes in the same order, from location page to state page, to city page, to restaurants page, using the correct set of instructions to parse the correct page, there’s no problem.

+

But, if the program follows a city or restaurant page link, but is parsed using the instructions for parsing a state page, there’s a problem. The program doesn’t work right, because the instructions don’t fit the page.

+

The program needs to know what type of page it’s parsing, so it can use the correct instructions.

+
+
+

The Solution

+

My solution involves regular expressions (regex).

+

A regular expression is an abstract pattern that a program can use to identify a combination of letters, numbers, or symbols.

+

Within the program, I’ve used regex to create a state_pattern, city_pattern, and location_pattern, to express the abstract patterns of the website state page, city page, and location page URLs.

+

State, city, and location page URL regex patterns

+
state_pattern = re.compile("^[a-z]{2}(\.html)$")
+city_pattern = re.compile("^[a-z]{2}\/.+(\.html)$")
+location_pattern = re.compile("^[a-z]{2}\/.+\/.+(\.html)$")
+
+
+

As the program crawls the URLs in the source code page, it will compare each URL to each regex pattern until it matches one. In that way, the program will know if the URL belongs to a state, city, or restaurant page.

+

The program will then call the function that contains the instructions for parsing that type of page.

+

Instead of processing the pages in an order, the program processes the pages by page type. In that way, no matter what path the links take, however long or short, the program will end up at a location page, outputting the data from that page.

+
+
+

Regex Pattern Explanation

+

Every location URL begins with https://locations.tacojohns.com/. The ^ character lets the program know that that part of the URL doesn’t matter to us. We are only interested in the unique part of each URL.

+

The unique part of every URL starts with a state code. The regex pattern [a-z]{2} will match any two letters between a and z, inclusive.

+

Every page ends with .html, which is a file ending. We can group this pattern together in parentheses. Because the . can be used in regex to match any character, we need to tell the program that we are matching a . literally. We can do that by putting a \ in front of it, to “escape” it. The $ after (\.html) indicates it’s the end of the pattern. This pattern will be used in all the regex patterns.

+

State pattern match example: https://locations.tacojohns.com/ks.html

+
state_pattern = re.compile("^[a-z]{2}(\.html)$")
+
+
+

In the city pattern, the state code is followed by a forward slash (/), then a group of characters for a city name. Because the / can also be used as a regex character, we need to make it literal by putting a \ in front of it, to escape it. The . can be used to match any character and the + indicates that pattern can occur one or more times.

+

City pattern match example: https://locations.tacojohns.com/ks/lawrence.html

+
city_pattern = re.compile("^[a-z]{2}\/.+(\.html)$")
+
+
+

The location pattern is similar to the city pattern, but the \/.+ patterns happens twice, once for a / and a city name, and again for a / and the location name.

+

Location pattern match example: https://locations.tacojohns.com/ks/lawrence/1101-w-6th-st.html

+
location_pattern = re.compile("^[a-z]{2}\/.+\/.+(\.html)$")
+
+
+

If you want to get better at Regex, I recommend doing Regex Crosswords!

+
+
+

Stepping Through the Program

+

This blog post assumes that the Python programming environment required is already set up on the computer.

+

You can see the public code here: https://github.com/alltheplaces/alltheplaces/blob/master/locations/spiders/taco_johns.py

+

The Python Standard Library regex module is imported from Python, as well as the Scrapy package, and a GeojsonPointItem() class that the data properties are passed into.

+
import re
+
+import scrapy
+
+from locations.items import GeojsonPointItem
+
+
+

The project is set up. Although not extremely relevant for our purposes, Scrapy uses object-oriented programming. download_delay is optional, but can make the program performance more consistent.

+
class TacoJohns(scrapy.Spider):
+    name = "taco_johns"
+    allowed_domains = ["tacojohns.com"]
+    download_delay = 0.2
+    start_urls = (
+        "https://locations.tacojohns.com/",
+    )
+
+
+

The state page, city page, and location page URL patterns as regex. These patterns will be used throughout the program.

+
    state_pattern = re.compile("^[a-z]{2}(\.html)$")
+    city_pattern = re.compile("^[a-z]{2}\/.+(\.html)$")
+    location_pattern = re.compile("^[a-z]{2}\/.+\/.+(\.html)$")
+
+
+

The program begins at the start_url, which is the main locations page. The program locates the URLs in the source code, and compares each one to the regex patterns. Depending on which regex pattern the URL matches, the program will call the parse_state, parse_location, or parse_city function next.

+
    def parse(self, response):
+        urls = response.xpath('//li[@class="c-directory-list-content-item"]//@href').extract()
+        for url in urls:
+            if (self.state_pattern.match(url.strip())):
+               yield scrapy.Request(response.urljoin(url), callback=self.parse_state)
+            elif (self.location_pattern.match(url.strip())):
+                yield scrapy.Request(response.urljoin(url), callback=self.parse_location)
+            else:
+                yield scrapy.Request(response.urljoin(url), callback=self.parse_city)
+
+
+

If the URL matched the state_pattern regex pattern, the parse_state function has now been called. Because the entries on the state page can lead to either a city page or a location page, the URLs will be compared to the city_pattern and location_pattern and depending on which regex pattern the URL matches, the program will call the parse_city or parse_locationfunction next.

+
    def parse_state(self, response):
+        urls = response.xpath('//li[@class="c-directory-list-content-item"]//@href').extract()
+        for url in urls:
+            if (self.location_pattern.match(url.strip())):
+                yield scrapy.Request(response.urljoin(url), callback=self.parse_location)
+            else:
+                yield scrapy.Request(response.urljoin(url), callback=self.parse_city)
+
+
+

If the URL matched the city_pattern regex pattern, the parse_city function has now been called. These URLs will only lead to a location page, so the parse_location function is called.

+
    def parse_city(self, response):
+        urls = response.xpath('//*[@class="c-location-grid-item-link page-link hidden-xs"]//@href').extract()
+        for url in urls:
+            yield scrapy.Request(response.urljoin(url), callback=self.parse_location)
+
+
+

All roads lead to the location page, which will contain the location details.

+

See the All the Places project DATA_FORMAT file for information about the types of data that can be collected. properties creates a structured model for the data and indicates where to find each piece of data within the source code. The scraped properties data will be passed into the imported GeojsonPointItem() class as a subclassed scrapy.Item parameter. The properties will be set as Scrapy fields and outputted in the terminal.

+

The developers of this website formatted the source code using a PostalAddress Schema, which made the data easier to locate and parse.

+
    def parse_location(self, response):
+
+        properties = {
+            'ref': response.url,
+            'name': response.xpath('//div[@itemprop="name"]//text()').extract_first(),
+            'addr_full': response.xpath('normalize-space(//*[@itemprop="streetAddress"]//text())').extract_first(),
+            'city': response.xpath('//span[@itemprop="addressLocality"]//text()').extract_first(),
+            'state': response.xpath('//*[@itemprop="addressRegion"]//text()').extract_first(),
+            'postcode': response.xpath('normalize-space(//span[@itemprop="postalCode"]//text())').extract_first(),
+            'country': "USA",
+            'phone': response.xpath('//span[@id="telephone"]//text()').extract_first(),
+            'website': response.url,
+            'lat': response.xpath('//*[@itemprop="latitude"]/@content').extract_first(),
+            'lon': response.xpath('//*[@itemprop="longitude"]/@content').extract_first(),
+        }
+
+        yield GeojsonPointItem(**properties)
+
+
+

One restaurant’s data output in the terminal

+
2020-10-25 15:09:08 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://locations.tacojohns.com/ks/lawrence/1101-w-6th-st.html> (referer: https://locations.tacojohns.com/ks/lawrence.html)
+2020-10-25 15:09:08 [scrapy.core.scraper] DEBUG: Scraped from <200 https://locations.tacojohns.com/ks/lawrence/1101-w-6th-st.html>
+{'addr_full': '1101 W 6th St',
+ 'city': 'Lawrence',
+ 'country': 'USA',
+ 'extras': {'@spider': 'taco_johns'},
+ 'lat': '38.9728433610435',
+ 'lon': '-95.24786129593849',
+ 'name': "Taco John's",
+ 'phone': '(785) 843-0936',
+ 'postcode': '66044',
+ 'ref': 'https://locations.tacojohns.com/ks/lawrence/1101-w-6th-st.html',
+ 'state': 'KS',
+ 'website': 'https://locations.tacojohns.com/ks/lawrence/1101-w-6th-st.html'}
+
+
+
+
+

Wrapping Up

+

This was a lot of fun. I know I learned a lot about Scrapy and some new things about how websites work. I hope you learned something too.

+

Happy scraping! :)

+
+
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/djangocon-us-2019-recap.html b/djangocon-us-2019-recap.html new file mode 100644 index 00000000..351e989f --- /dev/null +++ b/djangocon-us-2019-recap.html @@ -0,0 +1,337 @@ + + + + + + + + DjangoCon US 2019 Recap — Portfolio 0.1 documentation + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

DjangoCon US 2019 Recap

+

Published October 28, 2019

+
+

Description

+

DjangoCon US 2019 took place at Mission Valley Marriott in sunny San Diego from September 22-27. Eldarion’s Katherine Michel shared some insight into what that experience was like and what’s on the horizon for Django!

+
+
+

Blog Post

+

+

Conference attendees out by the pool; photo credit: Bartek Pawlik (https://bartpawlik.format.com/)

+

For the second year in a row, DjangoCon US took place in sunny San Diego and it was great to be back. San Diego is a thriving port city with palm trees, picturesque beaches, and perfect weather year-round. It’s hard to imagine anyone not loving this fun location. The conference returned to the gorgeous Mission Valley Marriot, where attendees have a view of a sparkling blue pool in the courtyard surrounded by palm trees.

+

The format for this year was similar to past years, with one day of tutorials, three days of talks, and two days of sprints, but with one notable difference. One two-track talk day was replaced with a one-track deep-dive day.

+

The conference was a huge success. Tickets sold out for the second year in a row and the talk lineup was impressive. The deep-dive day in particular was a big hit. Attendees I spoke to enjoyed hearing from experts in the field. The sprint days were also well attended, including a “How to Contribute to Django” workshop that resulted in quite a few people contributing to Django core.

+

Also, like DjangoCon US 2018, DjangoCon US 2019 was visibly diverse, I believe the most diverse conference I have ever been to. There were many faces from underrepresented groups in the crowd and I was thrilled to find a line at the women’s bathroom throughout the week. It’s amazing to see the progress the PyCon US and DjangoCon US communities have made in drastically increasing diversity in just a few years.

+
+
+

Monday

+

+

Kojo Idrissa kicking off DjangoCon with Orientation; photo credit: Bartek Pawlik (https://bartpawlik.format.com/)

+

Monday kicked off with an Orientation and Welcome led by DEFNA North American Ambassador and DjangoCon Organizer Kojo Idrissa. Notably, Kojo asked, what if the audience were primarily black women in their 40s to 60s? White men might start to wonder if they fit there. That is what underrepresented people are dealing with. All are welcome at DjangoCon US.

+

Matt Mitchell, a security expert who specializes in working with marginalized groups around the world, gave the opening keynote, “Building Community and Supporting Others.” Matt compared community to the Model/Template/View paradigm (MTV), gave some examples of people and groups who dig deep to find inner strength, including Sheroes, Knowledge House, Torchbox, and Laura Tich of SheHacks, and challenged the audience to see the beauty in the community and be kind to each other.

+

+

Matt Mitchell; photo credit: Bartek Pawlik (https://bartpawlik.format.com/)

+

A few other talks that resonated with me:

+

In “The Unspeakable Horror of Discovering You Didn’t Write Tests,” Melanie Crutchfield explained how she went from not even having one little digusting kale testing leaf in her app Five Up, to wanting to eat that disgusting testing vegetable for real. Yay!

+

Peter Baumgartner gave a detailed overview of hosting, configuration, web server, and asset options and tradeoffs in “Prepping Your Project for Production,” using special slides by Joni Trythall, our DjangoCon US Website Designer!

+

Casey Faist, Heroku’s Python Platform Maintainer, gave a great talk, “Everything you need to know but were afraid to ask about Data Classes” about the ins and outs of Python Data Classes. Heroku is special to me, as the first platform I ever deployed a Django app to. I’m thrilled that I had the chance to meet Casey at PyCon US and further chat at DjangoCon US!

+

After a very popular DjangoCon US 2018 talk about uncovering gender bias in Harry Potter, Eleanor Stribling followed up in 2019 with “Think Like a Product Manager: Straightforward frameworks for building great products,” which provided a product management black box for non-product managers.

+

Monday ended with an Opening Reception that evening on the Marriott Lawn. Guests enjoyed drinks and food from buffet-style food stations… the mac and cheese bar was a huge hit!

+

+

Opening Reception; photo credit: Bartek Pawlik (https://bartpawlik.format.com/)

+
+
+

Your Web Framework Needs You

+

At DjangoCon US 2018, Carlton Gibson, Django Fellow, gave a talk “Your Web Framework Needs You.” Carlton acknowleged that the community is more diverse than ever, but the core contributors have continued to be white guys, many of whom have been associated with Django for a very long time and are no longer even contributing. The talk was a call to action to community members to contribute to the Django core code. In short, there is not a quick fix, but change is a priority.

+

As a side note, after DjangoCon US 2018, a draft DEP dissolving Django Core and creating a new model of governance was merged into the Django organization. This DEP is in part intended to fix some of the problems discussed by Carlton in his talk. James Bennett, the author of the DEP, explained the changes in his blog post “Core no more.”

+

This year, Carlton gave a “Framework Update.” Progress is happening in Django core: the 1328 accepted tickets that existed last year were reduced to 1262 this year, with over 1000 new tickets opened; more than 1200 commits to master branch were made from 290 separate contributors, including new contributors and more contributors overall. Carlton gave examples of areas where individuals or self-organized groups could make improvements to Django core and its docs that could have a massive positive impact. Carlton again extended the invitation, “You’re web framework still needs you! Come and join us.”

+

+

Carlton Gibson; photo credit: Bartek Pawlik (https://bartpawlik.format.com/)

+
+
+

Tuesday

+

Jessica Rose kicked off Tuesday with a keynote about a very important topic: “Burnout and Balance.” Using cognitive psychology and humor, she explained what occupational burnout is, the warning signs (based on the Mayo Clinic diagnostic survey for burnout), and strategies for preventing it or reducing the negative impact of it. I found these strategies very practical and plan to apply them in life. A few strategies in particular: take care of yourself first (“put on your own airmask before helping other people”), invest your energy selectively, and learn to say no.

+

+

Jessica Rose giving a burnout demonstration; photo credit: Bartek Pawlik (https://bartpawlik.format.com/)

+

A few other talks that resonated with me:

+

In his talk “Prefetching for Fun and Profit,” Mike Hansen walked us through what pre-fetching is, the problem it’s trying to solve, and how it is implemented. In the process, Mike took a deep dive into the Django code. He suggested that people should dig into the Django internals more often and use their knowledge of it to improve their own code, instead of going directly to Stack Overflow. I like that.

+

As a maintainer of Pinax, I’m always on the lookout for new ways to improve our process. Luca Bezerra’s talk “Pull Requests: Merging good practices into your project” provided some good food for thought. Plus, the talk ended with one of Vinta’s trademark checklists. I love a good checklist!

+
+
+

Thank You Dinner

+

As a DEFNA Board Member and DjangoCon US Website Chair, I was treated to dinner on Tuesday evening at the nearby Yard House restaurant, along with speakers, emcees, patrons, and other organizers. It was a pleasure to attend. The atmosphere was warm and relaxed, filled with good conversation and laughs. I got to know my fellow-attendees better.

+

+

Special “thank you” dinner; photo credit: Bartek Pawlik (https://bartpawlik.format.com/)

+

Plates of appetizers were passed around the tables to share, filled with Wisconsin fried cheese curds, fried mac and cheese, jumbo Bavarian pretezel, fried calimari and poke nachos. I tried calimari, poke, and ahi for the first time. The mini chocolate soufflé cake topped with vanilla ice cream that I had for dessert was divine.

+

After dinner, a cake was brought out for a special recognition of the longtime service of DjangoCon US volunteer Ken Whitesell. Thank you, Ken!

+

+

Ken being honored; photo credit: Bartek Pawlik (https://bartpawlik.format.com/)

+
+
+

Deep-Dive Day

+

+

Deep-dive day; photo credit: Bartek Pawlik (https://bartpawlik.format.com/)

+

Wednesday was the first ever DjangoCon US deep-dive day!

+

The future of Python and Django has been on the minds of many lately. Community members have been asking how Python can remain relevant and vibrant, instead of becoming a legacy language.

+

With the async and await keywords having been introduced in Python 3.5, Python is at a crossroads. +The new async model is much more efficient than the traditional sync threading model, and can provide functionality that makes Python and Django hugely scalable and more competitive with major players such as Node and Go.

+

Unfortunately the sync and async models are largely incompatible.

+

On the other hand, while sync is operating system managed and async is runtime managed, increasingly more code is being run in the browser. Could Python be run natively in the browser?

+

What could be more timely than several deep-dive day talks grappling with these subjects?

+
+

The Natural State of Computers

+

Amber Brown, maintainer, and longest standing contributor of the asynchronous networking framework Twisted, started the day with her keynote “The Natural State of Computers.”

+

I was thrilled that morning when I met Amber at breakfast.

+

+

Amber Brown; photo credit: Bartek Pawlik (https://bartpawlik.format.com/)

+

In her keynote, Amber gave a review of the computer architecture and performance landscape. Amber argued that computers are not getting faster and won’t. All of the easy options have already been used to improve computer hardware performance. The alternative is to become more efficient, and async IO is far more efficient than traditional techniques that require blocking.

+

Amber believes that computer performance is driving the async story. She said programming languages need a good async story, or they will lose users. async is nearly universally supported among operating systems and has been around for a long time. In the not so distant past, Node was similar to traditional Python, bound by single thread limits, until async support was added. Python then lost users to Node.

+

The tide started turning when async was added to Node. Languages can no longer opt out of async support. While the Python GIL prevents the problems created by multi-threading, it also makes it difficult to use multi-threading in Python. Async is an alternative and can improve the Python async story.

+

Amber gave a hat-tip to Andrew Godwin and other contributors who are bringing native async to Django. Amber said adding async to Django will bring async into the Python mainstream. The sky will be the limit.

+
+
+

Async Django

+

The Django community is embarking on one of the largest changes in Django’s history: adding async support to Django core, led by Andrew Godwin.

+

Andrew’s deep-dive day talk “Just Add Await: Retrofitting Async Into Django” was definitely a highlight of the week for me.

+

Andrew has done extensive research about how to add async support into Django in a safe, backwards compatible way that maintains the familiarity of the Django API. His approach is detailed in DEP 0009 (Async in Django), which he authored.

+

+

Talk slide, current Django high-level architecture plus async

+

Andrew explained the challenges and opportunities of adding async to Django and gave an update on the work that has been done and is planned for the future:

+
    +
  • Phase One is complete. ASGI support was merged into Django 3.0 (PR), but can’t do much yet other than speak to ASGI servers such as Daphne and Uvicorn

  • +
  • Phase Two is in process. Andrew has async def views working in a branch right now (branch), but performance is a struggle at the moment. Once async views are working, a lot of parallel work can begin in bringing async to other parts of Django.

  • +
  • Phase Three, redefining the ORM for async, involves a lot of research, vision, and implementation work.

  • +
+

Code development and maintenance are not cheap and an initiative of this scale needs to be properly organized and funded. If you are interesting in helping, Andrew has outlined some ways to help on the Async Project Page

+

Andrew had a “Thanks” slide at the end of his talk, but the community should be thanking Andrew for his hard work in bringing async to Django!

+

In addition to Andrew’s talk, I highly recommend watching Tom Christie’s DjangoCon Europe 2019 talk, “Sketching Out a Django Redesign.” Tom contrasted sync and async, explained the benefits of async and why it matters to the longterm success of Django, gave an overview of the ASGI landscape, and praised Andrew’s plan of progressively adding async into the Django stack as very achieveable. He believes that while nothing beats Python for productivity, by adding the performance provided by async, Python will hit its sweet spot.

+
+
+

Python and WebAssembly

+

In his talk “WASM Matter,” Dr. Russell Keith-Magee talked about the emerging opportunity to use WebAssembly (WASM) to run Python code in the browser.

+

Russell told the story of Java and JavaScript. In the mid-90s, Java promised to be the language you could write once and run everywhere, replacing all other programming languages. JavaScript was invented around the same time. Unlike Java, and Python, JavaScript didn’t have a standardized byte code format or virtual machine that would make it cross platform. It just worked in the browser. Because of the importance of the browser, developers have tried to “reinvent the universe” using JavaScript. This might have given the appearance that JavaScript would one day become the universal language Java once promised to be. But rather than one language being universal, it might be that the JavaScript runtime becomes universal for programming languages through the use of WASM.

+

Russell explained what WASM is and how it works. WASM can take code such as Python, that would normally be compiled and run in a virtual machine via a computer operating system, and instead compile it into a ready-to-use binary format that can be run in the browser. Russell gave a review of the landscape, starting with emscripten, a tool for compiling code Clang can compile (such as C) into asm.js and WASM binary instead.

+

Russell gave a few promising ways of using Python and WASM together

+
    +
  • The Pyodide project uses enscripten to compile the CPython source code to WASM. The result can be used to deploy a Python shell in the browser completely clientside, similarly to a Jupyter notebook session. Because it’s big, the smaller implementation Micro Python could be used alternatively.

  • +
  • Russell’s own experiment is Batavia, which implements a CPython virtual machine in pure Javascript, which provides a Python REPL in the browser. Bytecode is run directly, no parsing or compiling needed.

  • +
+

Russell ended by mentioning the great organization BeeWare.

+

For a view of the larger picture of the “Black Swan” challenges facing the Python ecosystem as a whole, I also highly recommend watching Russell’s excellent keynote from PyCon US 2019.

+
+
+

Django Framework Deep-Dives

+

In addition, several stellar talks further explained important aspects of the Django framework itself:

+ +
+
+

Deep-Dive Day Wrap Up

+

Deep-dive day ended with Frank Wiles making a call to action for corporate sponsorship of Django Software Foundation.

+

Conference Chair Jessica Deatz and Co-Chair Sara Gore then gave the conference closing comments and were presented with special framed photos in appreciation for their hard work.

+

+

Jessica and Sara closing out yet another wonderful conference; photo credit: Bartek Pawlik (https://bartpawlik.format.com/)

+
+
+
+

Sprints

+

Sprints took place on Thursday and Friday

+

On the first day of sprints, Carlton Gibson led a workshop “How to Contribute to Django.” More people than expected showed up and we had to move to a larger area.

+

+

Carlton Gibson helping at a table of sprinters; photo credit: Bartek Pawlik (https://bartpawlik.format.com/)

+

While we were installing Django, it was pointed out that a bug commonly occurs while installing Django on Mac OS. This bug can be circumvented by using the django-docker-box tool. I went ahead and used django-docker-box, which probably sped up my installation process and saved me some frustration. It was great to see so many people sharing knowledge and trouble shooting together.

+

Later in the day, I made my first PR to Django core. Yay!

+

In the PR, I added django-docker-box to the Django docs as an installation option. Hopefully, drawing attention to this option will have a big impact in making the local setup process easier for others.

+

Due to a sick computer and conference travel, Django Fellow Mariusz Felisiak assisted me in updating and merging this important PR. I’m proud to have left the campground better than I found it, as my friend Jeff would say.

+

The workshop notes are open source for anyone who would like to use them to contribute!

+

A special shoutout to Django Core Dev Chris Beaven of Lincoln Loop who personally assisted people at my table with troubleshooting.

+

The Sprints also included an “Intro to Contributing to Open Source” workshop led by Jeffrey Eliasen, as well as a Git Help Desk.

+
+
+

Sight Seeing

+

If the conference wasn’t amazing enough, I had time to do some spectacular sightseeing in San Diego.

+

Here are some highlights:

+

The night of my arrival, I enjoyed a simple, but magical evening in downtown San Diego’s Little Italy district. After eating delicious alfredo and zucchini pasta for supper at Landini’s Pizzeria, I wandered through the large, open-air piazza. People relaxed at tables, eating ice cream and Italian food, under the colorful lights strung overhead, amid the sound of accoustic guitar music and water flowing in a nearby fountain.

+

+

Little Italy piazza; photo credit: Katherine Michel

+

I happened to look down the street at the marina in the distance. For several breathtaking minutes, I gazed at the boats and water dramatically illuminated by a pastel sunset. Wow!

+

+

Looking down the street at the sunset illuminating the marina; photo credit: Katherine Michel

+

In 2018, I traveled to Coronado Island by bus and got off at the Hotel del Coronado bus stop in search of Coronado Beach. Having known nothing in advance about the location, I was gobsmacked to find a beach-front hotel that felt like a movie set. Walking around back, I found the greenest of manicured grass, palm trees rising high into the air, and in the distance, Coronado Beach glittering gold under the sun. It was a jawdropping moment that I’ll never forget.

+

This year, I wanted to see some other San Diego beaches, so I traveled to Mission Beach and Ocean Beach.

+

Walking along Mission Beach boardwalk, for the first time, I experienced the quintessential California culture I had read about and seen on TV. On the strip, there were brightly painted taco, ice cream, and surf shops. The boardwalk was lined with cottages and palm trees. In the distance, beachgoers sunbathed, swam, made sand castles, ran along the water and played beach volleyball. Surfers in body suits carried their surfboards to and from the ocean. Rollerbladers deftly maneuvered through the crowds.

+

+

Mission Beach; photo credit: Katherine Michel

+

At Ocean Beach, I walked to the end of the pier, the longest concrete pier on the west coast at 1,971 feet, for a panoramic view of the ocean and beach.

+

+

Walking to the end of Ocean Beach Pier; photo credit: Katherine Michel

+

+

Looking out at Ocean Beach from the pier; photo credit: Katherine Michel

+

Afterward, I returned to San Diego proper and embarked on a tour of Tijuana. For me, an important part of having the opportunity to travel is to learn about and enjoy the local culture and this was the perfect opportunity to do that. I was amazed to find out that the border between the US and Mexico can be reached from downtown San Diego in about 45 minutes by Trolley. Led by a tour guide who grew up Tijuana, we were issued one-day visas, then walked into Mexico. We went to the Tijuana Wax Museum, walked the downtown, ate tacos, and went to a club.

+

+

Walking through a street market in Tijuana; photo credit: Katherine Michel

+

Later in the week, I walked the embarcadero, went to the Midway museum, and took a cruise of the harbor. With a clear blue sky and water the gorgeous pictures practically take themselves at the embarcadero. The Midway museum was incredible. I particularly enjoying standing at the end of the deck on a walkway suspended above the ocean, then taking the Bridge Tour, which included the Flight Control, Chart Room, Navigation Bridge, and Admiral and Captain’s Quarters. And the harbor cruise was a great way to relax at the end. The ship circled the bay with the Captain pointing out the notable sights. The California sea lions were a highlight for me, as well as the stunning San Diego skyline.

+

+

Beautiful view along the embarcadero; photo credit: Katherine Michel

+

+

Midway Bridge and plane; photo credit: Katherine Michel

+

+

View of the Midway Hangar Deck from the Navigation Bridge; photo credit: Katherine Michel

+

+

View of the San Diego skyline from harbor cruise; photo credit: Katherine Michel

+

That night, I went to the Taco Stand where I enjoyed a Carne Asada Taco and Grilled Pescado Taco (Mahi Mahi). I had never had a fish taco before. The combination of grilled fish, cabbage, and chipotle sauce was delicious in a way I hadn’t anticipated. Thank you to Trey Hunner for one of many great recommendations.

+

+

Yummy tacos at Taco Stand; photo credit: Katherine Michel

+

Afterward, for dessert, I visited Salt and Straw ice cream shop in Little Italy. Their ice cream cups are a familar sight in Little Italy. I am still dreaming of the Sea Salt with Caramel Ribbons ice cream I had there that night. Can’t wait to go back sometime.

+

+

Delicious Salt and Straw ice cream; photo credit: Katherine Michel

+
+
+

Join Us?

+

If you enjoyed this blog post, you might enjoy reading my PyCon US 2019 blog post, or watching the replay of the DjangoCon US 2018 “State of Django” panel, in which several DEFNA Board Members, including myself, and other community members talk about our efforts.

+

My DjangoCon experience couldn’t have been better. I learned a ton, networked with friends new and old, and had some once-in-a-lifetime sight seeing moments. Thank you to Chair Jessica Deatz, Co-Chair Sara Gore, and all of the organizers, speakers, and attendees who made DjangoCon US 2019 a special conference.

+

Join us next year… ?

+

+

Organizers, including me; photo credit: Bartek Pawlik (https://bartpawlik.format.com/)

+
+
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/djangocon-us-2023-recap.html b/djangocon-us-2023-recap.html new file mode 100644 index 00000000..4d3b1d74 --- /dev/null +++ b/djangocon-us-2023-recap.html @@ -0,0 +1,900 @@ + + + + + + + + DjangoCon US 2023 Recap — Portfolio 0.1 documentation + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

DjangoCon US 2023 Recap

+
+

Table of Contents

+ +
+
+

Intro

+

Disclaimer: the content of this post is a reflection of my career journey and not specific to my work at JPMorganChase.

+

DjangoCon US 2023 took place from October 16-20 in Durham, North Carolina. It was the sixth DjangoCon US I’ve had the privilege of attending, and in my opinion, the best one yet.

+

Attendees (photo credit: Bartek Pawlik (https://bartpawlik.format.com/)) +

+

back to top

+
+
+

Pre-Conference Activities

+
+

DEFNA Board Dinner

+

"Thank you to our DEFNA President Peter Grandstaff and Two Rock Software for treating fellow DEFNA Board Members in Durham for DjangoCon US to a magical dinner last night at Parizade. The apple pie mezcal margarita, linguini and clams, cookie and ice cream dessert, and company were stellar."

+

Things got off to a great start with a DEFNA Board dinner at Parizade on Saturday night.

+

According to every person I spoke to who had eaten there before, you can’t go wrong. Everything is so good. I’d never eaten linguini and clams before, but it sounded really good. I decided to be adventurous and try it. If you won’t do something new on the eve of DjangoCon US, when will you? I chose well.

+

It was a rare opportunity to spend time in person with other board members and enjoy a perfect meal.

+

Wow… +

+

Apple Pie Mezcal Margarita (“Del Maguey Vida Mezcal, triple sec, lime juice, apple pie syrup, salted rim”) +

+

Linguini and clams (“chorizo, cherry tomatoes, toasted garlic, white wine sauce, tarragon bread crumbs”) +

+ +

DEFNA Board (photo credit: Bartek Pawlik (https://bartpawlik.format.com/)) +

+

back to top

+
+
+

Django Girls Workshop

+

I love a good cup of coffee. On Sunday, I ventured to nearby Cocoa Cinnamon coffee shop. I had a Dr. Durham Latte (organizer recommended).

+

Cocoa Cinnamon Coffee Shop +

+

Dr. Durham Latte (“House made vanilla bean syrup, maca root, and ginger topped with black lava salt”) +

+

With coffee in hand, I was looking for the Durham Convention Center to help with organizing, got lost, and serendipitously stumbled upon the Django Girls Workshop hosted at the office of our wonderful, longtime partners Caktus Group. I was reunited with my friends Dawn Wages, Jay Miller, Jason Judkins, Rebecca Conway, and Tim Allen. It was a great time at an event where lives are changed. The event featured a majority of Black participants! While at the workshop, I enjoyed food from Neomonde Mediterranean (organizer recommended), caught up with my friends, and picked up some swag!

+

So good to be welcomed in by my friend Tim :) +

+

Django Girls lunch from Neomonde Mediterranean +

+

I’ve always wanted one of these shirts! +

+

back to top

+
+
+

Swag Stuffing

+

I eventually made it to the Durham Convention Center for swag stuffing! Many hands make light work.

+

Swag stuffing operation (I spy a DEFNA sticker!) +

+

back to top

+
+
+

Django Social

+

Later that night, I attended Django Social at Ponysaurus. The event was hosted by Jason Judkins, DjangoCon US Organizer, and Jon Gould of Foxley Talent, DjangoCon US Sponsors.

+

Jon and company have started a network of Django meetups in the UK called Django Social. Jason is starting a Raleigh-Durham chapter and this was the kickoff.

+

Not being a fan of beer, I had a Ponysaurus signature Beer Cocktail called a Gosé Margarita (lime juice, triple sec, & tequila, topped with Gosé beer).

+

Gosé Margarita +

+

"Thank you to Jason Judkins and Jon Gould for generously hosting a wonderful Django Social event tonight on the eve of DjangoCon US. I enjoyed meeting and getting to know the new Python Software Foundation Executive Director Deb Nicholson, spending time with two of my favorite Python/Django authors Eric Matthes and William Vincent, and catching up with my wonderful Revsys friends Frank and Jeff, among many interesting conversations."

+

back to top

+
+

Meeting the New PSF Executive Director Deb Nicholson

+

During the event, I happened to find myself having a conversation with a woman who really knew a lot about open source and events! It turned out to be the new Python Software Foundation Executive Director Deb Nicholson. Serendity strikes again. I love it when that happens. :) She was accessible throughout the conference, and it was a wonderful place to get to know her. Check out her Monday talk Meet-ups: A Grand Vision for a Humble Endeavor.

+

Me and PSF Executive Director Deb Nicholson later in the week +

+

back to top

+
+
+

A Chance to Hang Out with Old Friends and Make New Friends

+

Hanging out with favorite Python/Django authors Eric Matthes and William Vincent, and my wonderful Revsys friend and fellow DEFNA Board Member Jeff Triplett +

+

back to top

+
+
+
+
+

Monday

+
+

Meeting the New Django Fellow Natalia Bidart

+

On Monday, I ate breakfast with our new Django Fellow Natalia Bidart. I was thrilled to meet her! We talked about our work, what her experience has been like so far as a Django Fellow, and she introduced me to the art of drinking maté.

+

back to top

+
+
+

Kojo Idressa and Peter Grandstaff Kick Off the Conference

+

DEFNA North America Ambassador Kojo Idressa kicked of the conference with the the kind of Orientation and Welcome that only he can deliver.

+

Thank you Kojo for setting the stage for a wonderful conference.

+

“All of you are beyond welcome and we are thrilled you are here.”

+

Kojo also educated the audience about the concept of a Self Care Sprint. It’s important to take time for yourself, as needed.

+

Self Care Sprint +

+

During the Opening Remarks, Conference Chair Peter Grandstaff asked everyone to be kind and make this conference a great place for everyone else. “If you see someone engaging in inappropriate behavior, here’s a phrase you can use, ‘Hey, we don’t do that here.’”

+

A powerful tool borrowed from PyCon Australia and written about by Eric Holscher of Read the Docs and Write the Docs for setting norms: “Hey, we don’t do that here.” +

+

back to top

+
+
+

Finding Purpose in Open Source Through Community Building

+

Abigail Mesrenyame Dogbe delivered the keynote Finding Purpose in Open Source Through Community Building.

+

When Abigail was young, she didn’t like math, science, and computers. Her parents would show her how to do a chore, then leave her to do it herself. She credits them with having taught her how to bring people into open source. That is her purpose in life.

+

In 2017, after her undergraduate studies, she took part in a Django Girls workshop with DjangoCon US Organizer Noah Alorwu as her mentor. She was encouraged to give back by teaching other women how to code. She went on to be an organizer or mentor at 25 events with 500+ participants in cities and and remote areas of Ghana. She was happy to be the first female mentor, but not satisfied. She encouraged other women to become involved.

+

Only two years later, at PyCon Africa Django Girls workshop in Ghana, all of the coaches were women. It was a proud moment and a result of that effort.

+

Abigail told the stories of six people she had met through her open source work. Some were shy or inexperienced. Others were more established. Some were coders, some weren’t. Some had a passion. Others were trying to figure out where they could fit in. She was able to get to know them and see their potential. Like her parents, she taught them how to do tasks, then left them on their own to grow into leadership and perhaps find themselves in the process. She has been able to “10x” her impact this way.

+

Abigail talked about some of the challenges faced:

+
    +
  • Lack of opportunities (especially for junior developers)

  • +
  • Lack of paid open source work

  • +
  • Lack of resources

  • +
  • Travel and visa difficulties

  • +
+

Abigail missed out on some high profile international speaking opportunities due to visa denials. Being a US grad student has opened doors.

+

Abigail talked about organizers who have grown the Africa Python/Django community, looked out for her, and pushed her outside of her comfort zone.

+

She is currently on a journey to become an open source program manager, using all of her lessons learned. Contributing to open source has helped her develop resilience, embrace discomfort, achieve personal growth, and find purpose.

+

Her organizer resume is impressive: Django Girls, PyLadies Ghana, PyData Ghana, PyLadies Morovia, PyLadies Zambia and other PyLadies communities, PyLadies Global, PyCon Ghana 2018, PyCon Africa, PSF internship, Everything Open Research (a non-profit she started), and DE&I research

+

She invited the audience to DjangoCon Africa in Zanzibar, Tanzania from November 6-11. Another PyCon Africa is also in the works.

+

She asked the audience to consider how they are helping bring people into open source, especially people who do not necessarily love coding. She hopes her story will inspire others to give back to their local communities.

+

Abigail and I have been following each other on social media for quite a while. I was really excited to meet her in person!

+

Me and Abigail +

+

"Don’t have stats, but this feels like the most diverse DjangoCon US I’ve ever been to. Particularly excited at how many Africans we have speaking and attending, starting with Abigail Mesrenyame Dogbe‘s inspiring keynote “Finding Purpose in Open Source Through Community Building.” #DjangoConUS"

+

back to top

+
+
+

HTML-ivating your Django web app’s experience with HTMX, AlpineJS, and streaming HTML

+

Chris May has been a long-time appreciator of the Django community and wants to give back by elevating the experience of your Django app through his talk HTML-ivating your Django web app’s experience with HTMX, AlpineJS, and streaming HTML.

+ +

Chris began by talking about the prevalent architectural pattern of SPAs. +

+

Chris believes that better user experience drove their popularity. +An initial page load downloads a JavaScript application that handles all interactions and uses APIs to communicate with servers. As the data changes, the page is updated with small payloads without reloading the page. Users enjoy dynamic and engaging interfaces.

+

But, SPAs have been overused. +"SPAs incur complexity that simply doesn't exist with traditional server-based websites: issues such as search engine optimization, browser history management, web analytics and first page load time all need to be addressed. Proper analysis and consideration of the trade-offs is required to determine if that complexity is warranted for business or user experience reasons. Too often teams are skipping that trade-off analysis, blindly accepting the complexity of SPAs by default even when business needs don't justify it. "

+ +

Spa user experience is no longer an advantage.

+

Chris referred to a real life case study Making the world’s fastest website, and other mistakes by Taylor Hunt, a developer at a supermarket chain. Taylor knew their web app needed a better experience and wanted to record what customers experienced.

+

He bought several popular phones, gave them to people, and recorded them performing a task. He asked them to load either the production web app, super market chain native app, or the competitor amazon.com or walmart.com apps. Once loaded, search for eggs, add the first result to the shopping cart, and start the checkout process.

+

Chris showed a video of the results.

+

Each app takes a significant amount of time to accomplish the task, sometimes with a lag between the time the user touches the device and app response. The apps took between 59 seconds and 4 minutes to finish.

+ +

Ranging from 59 seconds to 4 minutes to finish +

+

Taylor knew it could be better and had a vision: “Be so fast it’s fun on the worst devices and networks our customers use.”

+

He found some advice from 2017- for optimal website performance, establish a budget of 130 kb or less (first download- HTML, CSS, JavaScript). Due to the third party JavaScript data collection tools and use of ReactJS and Redux in the production app, he could not meet the budget as a SPA app. He decided to focus on HTML, with minimal CSS and laser-focused JavaScript that required complex interactivity.

+

His demo app was the functional equivalent of the production app (using same phone, internet, server, APIs, data), with a drastically elevated experience. Much quicker to load and interact with, it finished in 20 seconds.

+

20 seconds to finish! +

+

Due to the capabilities of new tools, Django websites can be just as friendly as SPAs and much easier to maintain. In the talk, Chris would show us how.

+

Chris told the story of Caleb, a Laravel developer at Titan, one of the best PHP shops. He realized there was a significant cost and complexity to SPAs, so he decided to default to traditional web apps and only choose a SPA when needed. But, after starting to create a web app, he would always feel a gravitational pull back to SPA. He realized the seminal decision causing this would be when you decide to return JSON from the server. You need JavaScript on the page to receive the request. If you return HTML, you need much less JavaScript on the page to handle it. He created a framework called Livewire for Laravel Developers.

+ +

Python and Django devs have adopted a different framework called HTMX that is growing in popularity. HTMX enables JavaScript-like functionality, without the use of JavaScript, such as re-rendering part of a page using AJAX at the cost of just 14 kb.

+

Alpine was created to support Livewire. According to Chris, it’s an incredible framework that can create rich interactions with very little JavaScript. Its focus is the in-page experience. You can use it to create mobile components, make dynamic forms. It is reactive, so any data on the page associated with HTML will updated when changed.

+

HTMX and Alpine together can enable you to give your users a SPA-like experience for less than 30 kb.

+

Five components of elevated experiences: remove whole page refreshes for every interaction- accomplished with HTMX, use small pyaloads form the server to update the interface- accomplished with HTMX, update HTML as a result of changes in data- accomplished with Alpine, empower rich on-page interactions- accomplished with Alpine, be fast

+ +

These two frameworks, along with Tailwind CSS have brought the joy of web dev back to his life. He hadn’t realized how much it had faded over time.

+

Developer Experience boost: Both frameworks can use HTML attributes to control behavior, locality, remove your JS build system, write mostly Python and HTML, easier maintenance, faster iteration cycles

+ +

Chris then wanted to focus on the “Be fast” component of elevated experience, which he said could trump the rest.

+

SPAs using React and other JavaScript frameworks have a hidden cost- time to boot up.

+ +

Chris went back to the production app and demonstrated that the JavaScript prep took so much phone resource that it caused the text input to lag. The eggs search was deleted and the app then attempted to find 360,000 items and summarize them on the page instead. The user would then have to research, taking over a minute and a half.

+

In the demo app, the transaction happens very quickly, before the app has finished loading. As soo as the search bar appears, it is able to be used for a search. Critical elements are delivered as quickly as possible, and the user is not prevented from accomplishing their goal.

+

Chris wants Python developers to be able to do this.

+

Currently, Python will obtain all of the data, put it in the template, then send it in the response. This is ok, but can hurt user experience.

+

Chris proposes that when the request comes in, we start sending the template as soon as we can and continue sending pieces of it as they become available, until it’s done. This can be done using streaming HTML technology that has been around since 1997. Every browser is already optimized to use it.

+ +

Chris created a recommendation engine and engineered it to take up to five seconds to load recommendations on the homepage.

+ +

If the CSS container element does not have four items, the page will render the CSS skeleton elements shaped like the eventual content. This will prevent the page from jumping around as it renders. Each recommendation will be sent when it is ready. Meanwhile, the user can use the site.

+ +

He demonstrated how to create the demo functionality in Django using Django 4.2’s new StreamingHttpResponse async functionality. Unfortunately, as of the conference, this pattern only works with Jinja templates.

+

He also showed some patterns that work with Django templates too.

+

Option 1: Split templates into parts, yield each one via Django 4.2's new async iteration in

+

Option 2: Render a view, subscribe to HTMX Server-Side Events, send the slow parts to the page when they're ready

+ +

These are not the only options. Chris has created a web-async-patterns repo in PyHAT-stack GitHub organization. He wants your contributions. He believes that the community can create better patterns that empower us and enable Django to do new things.

+

Chris closed by summarizing what created an exception experience. +Exceptional Experiences with Django: Using  to stream critical elements to the user as quickly as possible, use HTML fragments to update parts of the page with HTMX, leverage scoped down frameworks like Alpine.js to power rich interactions

+

back to top

+
+
+

Fried Green Tomatoes :)

+

At lunch… trying a fried green tomato for the first time! +

+

back to top

+ +
+
+

What Can the DSF Do for Me? What Can I Do for the DSF?

+

Chaim Kirby, Django Software Foundation (DSF) President, asked What Can the DSF Do for Me? What Can I Do for the DSF?

+

+

What can the DSF do for me? He gave a report card:

+
    +
  • Support development of Django by sponsoring sprints, meetups, gatherings and community events: B

  • +
  • Promote the use of Django among the World Wide Web development community: D

  • +
  • Project the intellectual property and the framework’s long-term viability: A

  • +
  • Advance the state of the art in web development: no grade

  • +
+

Chaim gave a special thanks to DSF Board Assistant Catherine Holmes: “Honestly, we could disappear and if Catherine sticks around, things keep going.”

+

What can I do for the DSF?

+

Chaim announced two new initiatives:

+
    +
  • Change to DSF membership qualification

  • +
  • DSF Working Groups

  • +
+

In the past, DSF membership has been available to people who shared IP with the DSF- that is, literally wrote code or documentation.

+

DSF membership will now go beyond code or documentation to recognize the myriad of ways that people support the Django community. It will be predicated on making meaningful contributions toward the purpose of the DSF.

+

The DSF is also changing how its day-to-day work gets done by re-distributing power from the DSF Board to working groups. The working groups will be tracked in the DSF Working Groups GitHub repo. If you have an idea for how to better achieve a DSF goal, there is a process and template. You can nominate yourself to define a working group and the board will review, with the potential for a budget.

+

Chaim gave a special thanks to Jacob Kaplan-Moss for taking the lead on the DSF Working Groups initiative.

+

For more info, check out Jacob’s blog post Announcing DSF Working Groups.

+

During the sprint, Jacob also submitted a pull request to update the Django Enhancement Process (DEP) process docs.

+

Jacob talking to attendees about the new DSF Working Groups initiative +

+

It’s great that the creators and early architects of Django continue to be engaged with and accessible to the community. Check out this DjangoCon 2008 Schema Evolution Panel that Django Co-Creator Simon Willison recently unearthed featuring himself, Andrew Godwin, and Russell Keith-Magee. :)

+

back to top

+
+
+

Parts and Labor, The Parlour, and Back to the Hotel

+

That night, I walked with a group of fellow conference-goers to Parts and Labor for light food and drinks.

+

Parts and Labor margarita +

+

Afterward, I had a scoop of chocolate ice cream from The Parlour (organizer recommended).

+

The Parlour +

+

Parlour flavors +

+

Back at the hotel, a late night chat… great crew :) (© 2023 Paolo Melchiorre CC BY-SA 4.0) +

+

Incidentally, on the first sprint day, Paolo, along with Will Vincent, presented μDjango, a single file Django micro project. Read about its inception on Paolo’s blog.

+

back to top

+
+
+
+

Tuesday

+
+

Hallway track

+

Ken Whitesell at the registration desk +

+

back to top

+
+

Django Social T-Shirt

+

On Monday, I was fortunate to come into the possession of one of Foxley Talent’s Django Social T-shirts. :)

+

"Couldn’t resist wearing this super cute Django Social shirt from Jon and company. I’ve been to a Django Social in Durham now. Hoping to make it to one in the U.K. eventually!"

+

Me wearing my Django Social T-shirt with Django Social Organizer and Foxley Talent Principal Jon Gould +

+

back to top

+
+
+

Coherence Demo

+

Two members of our party at Parts and Labor had founded a startup called Coherence.

+

On Tuesday, I stopped by their sponsor table for a demo.

+

Coherence demo +

+

Coherence is an alternative to traditional PaaS built on top of AWS and GCP that provides:

+
    +
  • Full-stack previews

  • +
  • Build pipelines

  • +
  • Static and production environments

  • +
  • Cloud IDEs

  • +
  • Hosted web-based SSH tools for secure & audited access to REPL or databases in each environment

  • +
  • Polished UI for admin and deployments

  • +
  • Infrastructure-as-code

  • +
+

Check out the docs!

+

Coherence brand +

+

back to top

+ +
+
+ +
+

Don’t Buy the “AI” Hype

+

While DjangoCon US 2022 Chair Logan Kilpatrick, first DevRel hire at OpenAI, is busy getting OpenAI’s first developer conference OpenAI DevDay off the ground, Tim Allen, gave an impassioned talk Don’t Buy the “AI” Hype the he had put together at the last minute to fill an open slot.

+

Tim has been writing code since 1980. Over the years, he has seen a lot of tech trends and hype, and has been involved in some of it. He has never seen anything like what he calls the “AI” hype cycle. According to Tim, it’s next level. At the risk of sounding “like an old man yelling at kids to get off my lawn,” he wants to provide a warning.

+

Tim on stage +

+

Tim cited a KPMG report that says that 93% of senior business leaders believe that generative AI will provide value for their businesses. He does not dispute that.

+

He compared the Gartner Hype Cycle for Emerging Trends 2023 with generative AI at the peak that he calls “Mount Hype” with the Dunning-Kruger effect curve. He believes the similarity is not a coincidence.

+

Tim gave an entertaining rundown of technology trends over the past 25 years. They were all useful tools in the technology toolbox, but did not live up to the hype. According to Tim, the media builds the technology up to “Mount Hype” for clickbait, then tears it apart in its descent. By blinding the world with hype and fear, it’s impossible to find the true utility of these new technologies and use them to improve the human condition.

+

Tim told the story of the startup he built as a web portal for Second Life virtual world. Hyped to the max, Second life was the media’s darling, then became its whipping boy.

+

He says among generative AI companies, it’s now an arms race, and the race to the bottom “is dangerous.” He puts “AI” in quotation marks, because he says it’s not AI, it’s machine learning models, a subset of AI. “It’s not artificial and it’s not intelligent.” It’s dangerous to give these attributes to machine learning models. By saying that models “hallucinate” (a.k.a. make things up) we are removing the responsibility of the programmer and model trainer to be ethical.

+

With these falsehoods becoming part of the permanent record, we risk the line of collective truth becoming so blurred, it’s invisible.

+

He believes that a large portion of our population have been left behind by the education system and are easily misled. He fears that we are unprepared for the effect of generative AI on future elections.

+

He doesn’t have an easy answer, but says that as technologists we must be responsible stewards and do better.

+

“We’ve got to stop falling for it.”

+

back to top

+
+
+

An Approach to Lightweight Tenancy Management Using Django Rest Framework

+

Having implemented multi-tenancy myself, I thought Eliana’s talk An Approach to Lightweight Tenancy Management Using Django Rest Framework would be an interesting one to attend, and it was.

+

In a single-tenancy architecture, each tenant has its own application instance and its own database, physically isolated.

+

In a multi-tenancy architecture, all tenants share the same database and application instance, but each tenant is isolated from the rest, and you have to implement the isolation. A user can belong to multiple tenants, but can only access resources from the tenants to which they belong.

+

“Multitenancy is a software architecture where a single software instance can serve multiple, distinct user groups.”- Red Hat’s definition

+

According to Eliana, multi-tenancy is more common when a company uses your product and will have its own users, not when you market directly to the end user.

+

She referred to Slack as a possible example of multi-tenancy architecture: each workspace is a tenant, isolated from each other, and users can access multiple workspaces, but can only access workspaces to which they belong, and information does not cross from one workspace to another.

+

Eliana showed an example app that was an abstraction of the requirements from a number of different multi-tenant websites that she and her colleagues had implemented.

+

Example

+
    +
  • The tenants are represented as companies

  • +
  • The resources are represented as company reports

  • +
  • The user can access many companies (an example user is a fractional account who does accounting for multiple companies)

  • +
+

Key points

+
    +
  • Effectively nest API routes so resources fall under the specific tenant

  • +
  • Consistently restrict access to resources

  • +
  • Centralize checks in a single place to avoid code duplication

  • +
+

They used drf-nested-routers package to nest resources under a specific tenant.

+

URL example: tenant/<tenant-id><some-resource/<resource-id>

+

In order for this to work, a few lines of code need to be added to urls.py.

+ +

If there is a company_id 23 associated with a report with id 1 and a company_id 5 associated with a report with id 2:

+

A GET request to companies/23/reports/1 will return a 200 HTTP status +A GET request to companies/5/reports/1 will return a 404 HTTP status

+

She then explained how they write a custom viewset and overrided the initial() method to implement tenancy check functionality to restrict user access to resources.

+

First they check that the user is logged in and get the company primary key from the URL. If either is missing an exception is raised. They then get the user from the request. Instead of looking up the company using the primary key, they look for it within the user’s set of companies. The company needs to exist and be among the user’s set of companies in order for it to be returned.

+

Eliana and her colleagues would occasionally forget to filter by company which would result in accidentally leaking information from other tenants. As a bonus, she demonstrated how they created a custom model manager to avoid this.

+

They would override the filter() method and check if company_id or company is in the kwargs. If not, the MissingCompanyException is raised. If either exists, company is filtered like intended with the kwarg.

+ +

back to top

+
+
+

Speaker and Organizer Dinner

+

After the conference activities and group photo, I attended the complimentary speaker and organizer dinner at The Pit. The food was really good!

+

The Pit dining room +

+

Another delicious southern-style meal! +

+

A wonderful conference partner Discover Durham generously provided city guides for swag bags and gift boxes by City Box Durham for organizers and speakers.

+

City Box Durham gift boxes +

+

back to top

+
+
+
+

Wednesday

+
+

Testing Modern Web Apps Like a Champion

+

My friend Andrew “Pandy” Knight delivered the Wednesday morning keynote Testing Modern Web Apps Like a Champion.

+

Andy is a local and learned development through Django. At DjangoCon US 2019, he gave a Selenium tutorial. It was special for him to be back four years later giving a keynote about testing.

+

Andy introduced us to Suki, his French bulldog. He created Bulldoggy Reminders app to help him take care of his dog.

+

Users can log in. On the left side are the reminders lists they have created. On the right side are the items in a list. Users can dynamically add items to lists, rename lists, and delete lists. When an item is completed they can strike through it by clicking on it.

+

The app was made with FastAPI, HTMX, and stores data in TinyDB.

+

Bulldoggy app architecture +

+

Andy singing the praises of HTMX +"Another high level endorsement of HTMX: “HTMX is a great way to democratize front-end development.” Andrew Knight"

+

Testing is an art and a science, Andy said. Development and testing are two sides of the same coin.

+

This talk was a bookend for a keynote Andy did at PyTexas that focused on the full-stack Python development of Bulldoggy Reminders app.

+

In this talk, Andy would be talking about how to test the app.

+

“Testing is hard.”

+

Testing Challenges +

+

Historically, testing strategy has been built around the Test Pyramid that has probably been around longer than Andy has been in a professional environment. :)

+

According to the strategy, we want a lot of unit tests. They are white box, next to the code, low level, very fast, touching the Python methods. Moving up the pyramid, if we have UI, we want to test the widget library as components. Moving up the pyramid, we reach API testing. We make a request, get a response, verify a 200 code. They take a bit longer to run and there could be network issues, but they are ok. We reach UI tests. We want to do as few of them as possible. They are the most complex, longest, slowest, most brittle, most prone to flakiness, the riskiest.

+

Test Pyramid Scheme +

+

“We have developed an entire testing strategy with this pyramid around presumptions that certain types of tests are good and bad. And I’m here to tell you today that’s bull crap. Every type of test adds value in unique, special ways. To try to label some as good and bad is not healthy for us as we approach the quality of our applications. I could argue that UI tests are the valuable ones because they are the ones that are testing your application as a user would.”

+

Modern testing goals- let’s break away from the pyramid and its preconceived notions +

+

While testing can be challenging, our approach to testing doesn’t need to be.

+

Writing good tests: follow the Arrange-Act-Assert method:

+
    +
  • Arrange things in the system

  • +
  • Act on the target behavior

  • +
  • Assert expected outcomes

  • +
+

Arrange-Act-Assert works for all types of functional tests, whether they are unit, component, API, or UI. This pattern came up over and over again in the talk.

+

Can’t we just use pytest or unittest? Andy loves pytest. He is a pytest stan and thinks it is the best testing framework in any language, but…

+

pytest and unnitest cannot test web apps or frameworks. They provide the structure for writing test cases. You need to add the “magic sauce” inside the test cases. pytest alone is not the answer.

+

What about Django’s testing support? Django has an awesome test client. Django testing support is probably some of the best Andy has seen in a Python web framework, but…

+

You are going to be limited to “white box” testing of calling methods and functions directly from the code. You’re not going to be able to test the app like a user by opening up a browser and clicking around or calling the API with a REST client.

+

Andy pointed out the “white box” unit testing at the bottom of the pyramid and “black box” testing of the components above.

+

Tools for black box testing… Cypress and Playwright can do all of these things +

+

Focusing on open source tools, Andy went over how to do component, API, and UI testing, with examples and pitfalls from his own personal experience.

+

Web Test Automation Tool Comparison +

+

Tips for testing modern web apps like a champion +

+

Afterw the talk, I had the chance to catch up with Andy. His talk has rekindled my desire to get better at testing and reminded me of what a great resource Test Automation University is. He gave me a card resource too!

+

A gift from my friend Andy +

+

back to top

+
+
+

Inside Out: My Journey of Understanding Inclusion

+

This year, along the lines of my fellow DEFNA board member Jeff Triplett’s annual DjangoCon US Talks I’d Like to See list, I created my own Talk Topic Ideas List and posted it on social media.

+

"The @djangocon US CfP closes May 15th. We'd LOVE to receive your talk proposal! If you need some inspiration, I've written up a list of possible topics. What topics would you like to learn more about? ❤️🐍"

+

Tim Schilling, who has done an incredible job of taking over my former role of DEFNA Corporate Secretary and driving a lot of improvement across DEFNA and DjangoCon US, tooted to me and Natalia in response.

+

"@kati @djangocon Oh, I really like this one on your list: > Learning more about our new fellow :) @nessita are you submitting a talk?!"

+

It kicked off a conversation that led to her giving the talk Inside Out: My Journey of Understanding Inclusion on Wednesday.

+

"@CodenameTim @kati @djangocon I've been thinking about this a lot, and I would be most thrilled to prepare a talk. Currently, one of the topics I'm feeling most passionate about is Diversity And Inclusion, so I'd be excited to share my view, thoughts and my experience on the matter. Would that be a talk you'd like to see/attend?"

+

In her talk, Natalia gave some examples of prejudice that she has faced as a woman. Thank you Natalia for putting into words the type of that experiences I’ve also had, but have questioned.

+

She explained what unconscious bias is and that we are unaware of it. Her hope is that we will reflect on our unconscious biases to improve the Django community as a whole.

+

She then talked about the conflicting standards women are expected to meet. I personally found this to be a very powerful part of her talk.

+

Double Bind +

+

Double Bind Paradoxes +

+

Double Bind from Barbie movie +

+

Natalia went on to talk about cultural aspects too and recommended Ned Batchelder’s PyCon US 2023 keynote People: the API User’s Guide and the book The Culture Map by Erin Meyer.

+ +

Thank you to Natalia for embracing our community and generously asking for reflection about an important subject. I hope she found our conference to be very welcoming in return.

+

“I had to stand in line at the women's bathroom. I’ve never had to do that before at a conference.” Natalia Bidart at #DjangoConUS

+ +

I’ve chatted with women recently about the additional overhead women and other underrepresented people often have from doing extra work to change the system. It can be exhausting. I am looking forward to getting to know Natalia’s development work.

+

back to top

+
+
+

DjangoCon Africa

+

Daniele Procida has been involved in organizing and attending African PyCons for nearly a decade now. He spoke of the special challenges, including questions of safety.

+

Daniele said we should not just be asking these questions about African events. We should be asking them about events in all countries, including our own. Other countries need to come with safety warnings as well.

+

African PyCons are creating safe spaces through codes of conduct. It’s an investment in courage. “This is what we do and this is how we are.”

+

He also pointed out that African PyCons and DjangoCon operate on a shoestring budget. For example, PyCon Namibia’s total conference budget was less than $7,000 USD. The conference finished with a balance of just over $100 USD.

+

Daniele asked DjangoCon Africa Keynoter and Organizers to come up to the stage.

+

Wonderful people I am proud to call friends: Daniele Procida, Kojo Idressa, Sheena O’Connell, Abigail Mesrenyame Dogbe, Dawn Wages, Noah Alorwu +

+

Daniele praised DjangoCon US for doing exactly the same work from another part of the world. “I haven’t seen so many African and Black faces, non-white faces, as a proportion at an event outside Africa.”

+

DjangoCon Africa 2023 will take place in Tanzania, Africa in November and DjangoCon Europe 2024 will take place in Vigo, Spain in June 2024.

+

I hope to go to both someday.

+

One day at lunch, I had the pleasure of eating with a table of Africans: Richard Ackon, Abigail “Afi” Gbadago, Noah Alorwu, Ntale Geofrey, and Benedict Kofi Amofah. I learned that Ghanians are laid back and Ugandians are tribal. We had the chance to speak at length about our cultures. It was a really fun conversation!

+

New friends… beautiful on the inside and out! (photo courtesy of Abigail Mesrenyame Dogbe) +

+

Later in the week, a Black attendee told me that when he attends a conference in the U.S. or Europe, he is sometimes the only Black person in attendance. DjangoCon US was a very different and wonderful experience.

+

By one organizer’s count, we had around 10 Black speakers.

+

Check out the Black Python Devs write-up about their DjangoCon US experience.

+

"This makes me smile. ❤️ We are nowhere near where we want to be on diversity, but making big strides. I think this was the most fun DjangoCon US I've been to so far, and the growing diversity played a big part in that."

+

back to top

+
+
+

Another Great Adventure

+

After conference activities, as usual, hanging around in the lobby led to a great adventure. Hanging around in a lobby once led to me sitting next to Python creator and BDFL Guido van Rossum at an impromptu group dinner and chatting with him about the early days of Python.

+

On this night, I ended up having dinner with Jacob Kaplan-Moss, Andrew Godwin (Django Core Dev, Django Async Architect, South creator, and the only person who has attended every DjangoCon US), Frank Wiles (Revsys Founder and Partner, and former DSF President), and Tim and and Charles of the Wharton School, my past client.

+

We ate at a restaurant called It’s a Southern Thing. The food was high quality and the service was great. I had the Crispy Catfish.

+

Crispy Catfish (“Crispy cornmeal fried catfish served over a bed of red beans & rice; made with beef sausage, holy trinity, creole spices, finished with a creole mustard aioli”) +

+

Our table after an incredible meal! +

+

Afterward, led by Tim, we had ice cream at a novel ice cream shop called Simon Says Dip This. Tim said he’s never seen an ice cream shop like this anywhere else. Vanilla soft serve has a core, dip, and topping of your choice.

+

Simon Says Dip This Counter +

+

Final product… wow! (chocolate core, bourbon dip, and strawberry topping) +

+

back to top

+
+
+

Conference Conclusion

+

I came away from Durham with many new friends, renewed optimism, and some amazing swag.

+ +

Conference badge +

+

Prized possessions +

+

Proud to be a DEFNA Board Member and DjangoCon US Organizer +

+

Standing ovation for organizers +

+

DjangoCon US Organizers (photo credit: Bartek Pawlik (https://bartpawlik.format.com/)) +

+

back to top

+
+
+
+

Sight Seeing and More Food!

+

I consider getting to know the host city to be an important part of the conference experience.

+

back to top

+
+

Sarah P. Duke Gardens

+

After doing a bit of research, I chose the Sarah P. Duke Gardens as my top priority for sight seeing. After spending time there, I can personally report that if you are in Durham, it is an absolute must see. Some of the scenes there were simply stunning! A local pointed out to me that it’s a different garden every month depending on which plants are in bloom.

+

Pink flowers +

+

Glorious nature +

+

H.L. Blomquist Garden of Native Plants Pavilion +

+

Fish pool, historic terraces, and Cindy Brodhead Pergola +

+

South Lawn +

+

Red Bridge +

+

Wooden Bridge +

+

back to top

+
+
+

Duke Chapel

+

After visiting the gardens, I made the quick walk over to the Duke Chapel. Not only was the chapel gorgeous, but the Conference for North Carolina Chapter of the American Choral Directors Association was taking place. A choir that must have been made up of elite children singers happened to be practicing. I’ve stumbled into some jaw-dropping experiences while traveling. This was another one. Together, the music and surroundings were magical.

+

+ + +

+

back to top

+
+
+

Museum of Life and Science

+

I also visited the Museum of Life and Science. The Butterfly House in particular was a really special experience. I was also happy to have a second change to see lemurs. Duke University has the largest population of lemurs in the world outside of Madagascar, but unfortunately, its tours were booked through the rest of the year. The Museum of Life and Science has a Lemur Exhibit. I enjoyed observing these beautiful animals. The Farmyard, Insectarium, and Aerospace exhibits were also really fun and interesting.

+

Unfortunately, the train that takes passengers around the museum’s 84 acres was not in operation at the time of my visit. I know I would have really enjoyed it.

+

Lemurs +

+

Lemur Exhibit +

+

Lemur +

+

Butterfly House path +

+

Butterfly House path +

+

Butterfly House butterfly +

+

Butterflies with “eyes” eating fruit +

+

Insectarium- cockroaches +

+

Insectarium- tarantula +

+

back to top

+
+
+

Parizade

+

More pics from the incredible Parizade!

+

Amazing ambiance +

+

Cookie and ice cream desert +

+

back to top

+
+
+

Loaf

+

After having read rave reviews about Loaf bakery, I had to pay a visit. It did not disappoint. I ordered a ham and gruyere croissant, a walnut sea salt brownie, a pain au chocolat, and 5 pumpkin chocolate chip cookies.

+

+

+

Ham and gruyere croissant +

+

Walnut sea salt brownie +

+

back to top

+
+
+

Pizzeria Toro

+

For dinner one night, I ordered takeaway from Pizzeria Toro, right around the corner from the Marriott. I had a mouthwatering red-sauce pizza with shredded mozzarella, black olives, mixed mushrooms, and fennel sausage.

+

Cool atmosphere! +

+

Yum! +

+

back to top

+
+
+

Simon Says Dip This

+

More pics from the amazing Simon Says Dip This!

+

Dip being poured on +

+

Toppings to choose from +

+

back to top

+
+
+

Press Coffee, Crepes,and Cocktails

+

After having read rave reviews about Press Coffee, Crepes, and Cocktails at the American Tobacco Campus, I simply had to visit. I was keen to have a seasonal Black Forest Latte. I finally had the opportunity on the first day of sprints. The atmosphere was bright and cute. The food was excellent. I think this was the first time that I’ve ever had a savory crepe.

+

Coffee Bar +

+

Bar bar +

+

Black Forest Latte… the foam was silky smooth. Delicious! (“a combination of our house-made chocolate-sauce and cherry syrup”) +

+

The Down Home breakfast crepe (“bacon with scrambled eggs and hoop cheese”) +

+

The inside +

+

back to top

+
+
+
+

In Closing

+

The talk replays will be available on the DjangoCon US YouTube channel in a few weeks.

+

Can’t wait for next year! :)

+

"As usual, I've tried to squeeze every last bit of experience out of DjangoCon US and have done about as much as I humanly can. 🤣 Today is a day for relaxed sprinting, catching up with a few more people, and flying back to Plano. I'll write up a proper blog post soon with thoughts about talks, the people I met, sightseeing, and food. For the moment, suffice it to say, this conference just gets better every year and that is because of the people. Everyone is welcome and everyone makes it a better place. This community is changing the world for the better through shared humanity and technology. And, it's not a coincidence that it started in wonderful Lawrence, Kansas."

+

djurham +

+

back to top

+
+
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/djangocon-us-2023-topics-inspiration-list.html b/djangocon-us-2023-topics-inspiration-list.html new file mode 100644 index 00000000..6b2cb74a --- /dev/null +++ b/djangocon-us-2023-topics-inspiration-list.html @@ -0,0 +1,211 @@ + + + + + + + + DjangoCon US 2023 Topics Inspiration List — Portfolio 0.1 documentation + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

DjangoCon US 2023 Topics Inspiration List

+

Published May 6, 2023

+

New Features and Future Outlook

+
    +
  • New Django features

  • +
  • New Python features of interest to Django devs

  • +
  • Django retrospective (where it has been, where it is now, is it in a good place relative to itself and other web dev frameworks?)

  • +
  • What’s on the horizon or could/should be on the roadmap

  • +
+

Opinionated Django

+
    +
  • Django deployment options and tradeoffs in 2023

  • +
  • Different ways of doing things in Django and when to use which option

  • +
  • The best tools/packages to have in your Django toolbox in 2023

  • +
  • Favorite workflows, Git, CI/CD, GitHub Actions, local/prod, developer experience tools, etc.

  • +
+

How to Raise Your Game

+
    +
  • Practical async (going beyond the docs and a few tutorials to using day to day)

  • +
  • Security (OWASP 10 and Django)

  • +
  • Testing (pytest, Playwright, Selenium, etc).

  • +
  • Type hinting

  • +
  • Lesser known, but highly useful Django features

  • +
  • Database optimization

  • +
  • Website optimization

  • +
+

Python Packaging and Open Source

+
    +
  • New developments in Python/Django packaging

  • +
  • Adventures in open source Django development

  • +
  • How to get started with open source, Django open source, packaging

  • +
+

Novel uses for Django

+
    +
  • Experimental apps

  • +
  • Historically relevant apps

  • +
  • Your interesting Django story/adventure

  • +
  • Lessons from managing/scaling Django in a unique or difficult way in your company

  • +
  • Prototyping with Django for fun and profit

  • +
+

New-ish or Experimental Technologies

+
    +
  • Co-Pilot, ChatGPT, etc. for Django devs

  • +
  • PyScript

  • +
  • WASM

  • +
  • React/HTMX debate

  • +
  • Using JavaScript and Django together: Alpine, Svelte, etc.

  • +
  • Tailwind

  • +
  • Datasette

  • +
  • What tools I haven’t heard about, but would want to know about

  • +
+

How to Use/Better Use Popular Add On Tools (Admin, API, etc.)

+
    +
  • Wagtail

  • +
  • Butter CMS

  • +
  • Django Rest Framework

  • +
  • Fast API

  • +
+

Team, Leadership, Building, Learning

+
    +
  • Product management (features, prioritization, OKRs, teamwork, etc.)

  • +
  • Lessons from software engineering management

  • +
  • Interesting mental models, productivity methods, learning approaches, the counter-intuitive

  • +
  • Educators/authors in our community (their experiences and thoughts about how to learn effectively)

  • +
+

Django Fellows

+
    +
  • Getting to know what they do, how core works

  • +
  • Contributing to Django

  • +
  • Learning more about our new fellow :)

  • +
+

Addressing Hard Topics/Making New Progress

+
    +
  • How to bring more diversity to: our steering council, core dev, contributor base, community

  • +
+

For even more ideas, see my fellow DEFNA Board Member Jeff Triplett’s list.

+
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/djangocon-us-2024-recap.html b/djangocon-us-2024-recap.html new file mode 100644 index 00000000..91acfb3d --- /dev/null +++ b/djangocon-us-2024-recap.html @@ -0,0 +1,901 @@ + + + + + + + + DjangoCon US 2024 Recap — Portfolio 0.1 documentation + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

DjangoCon US 2024 Recap

+
+

Table of Contents

+ +
+
+

Intro

+

Disclaimer: the content of this post is a reflection of my career journey and not specific to my work at JPMorganChase.

+

DjangoCon US 2024 took place from September 22-27 in Durham, North Carolina at the Durhan Convention Center. It was the seventh DjangoCon US I’ve had the privilege of attending and an absolute blast!

+

Attendees (photo credit: Bartek Pawlik (https://bartpawlik.format.com/)) +

+

back to top

+
+

Venue Selection

+

If you want to bring DjangoCon US to your city or volunteer, we want to hear from you!

+

My fellow DEFNA Board Member Adam Fast gave a lightning talk about our search for a venue for 2025 and beyond. Cost continues to be a challenge and our sponsorship is down.

+

As they say in open source, “Given enough eyeballs, all bugs are shallow.” Perhaps with the eyeballs of the entire community, we can find an acceptable course of action.

+ +

back to top

+
+
+

DjangoCon US Website and Design

+

A number of people have commented that they’ve really loved the t-shirt and bag this year.

+

Our wonderful designer Joni Trythall of YupGup did a DjangoCon US Design Reflection featuring all of our designs since 2018.

+

As a DEFNA Board Member, I’ve had the pleasure of collaborating with Joni in bringing all of these designs to life. They are so beautiful!

+

Thank you to Joni for a special shoutout at the end of her post.

+

In addition, we did a refactor of our DjangoCon US website backend this year. It’s easier to get up and running and has a well documented style guide.

+

Feel free to fork it and use it in line with the license.

+
+
+
+

Pre-Conference Activities

+
+

Sightseeing and Some Great Meals

+

I feel privileged to be able to travel. I make the most of every opportunity to get to know a place better: seeing the unique sights, experiencing what makes the culture special, and enjoying the celebrated local cuisine.

+

In Durham, I had the chance to revisit the incredible Sarah P. Duke Gardens and see a few other attractions for the first time. Also, although most of my meals were provided through the conference, I enjoyed some outstanding meals in downtown Durham restaurants.

+

Here are a few of my favorite moments from the trip. See more photos and anecdotes later in this post.

+

Sarah P. Duke Gardens Red Bridge… jaw dropping scenes +

+

21c Museum Hotel… the bathroom window is transparent until you turn the lock, then it becomes opaque +

+

The Durham Hotel lobby… wow! +

+

Mother and Sons… Squid Ink Tonnarelli, NC Shrimp, uni, fennel, scallions +

+

Press Coffee, Crepes, and Cocktails… oh my, this berries crepe was absolutely delicious. I had a banana bread latte too that was chef’s kiss. +

+

I’ve always wanted one of these! A nice visual metaphor taken along the side of the conference hotel during Centerfest Fine Art Festival. +

+

Unscripted rooftop pool +

+
+
+

Black Python Devs Leadership Summit

+

It was an honor to have been invited to attend the Black Python Devs Leadership Summit as a distinguished guest.

+

The event took place at the Caktus office. I attended the afternoon session.

+

The session kicked off with a keynote by Wesley Faulkner.

+

Wesley gave some sobering stats, then gave practical advice for how to observe, predict, and improve your surroundings, the benefits and risks.

+

+

+

Interactive speakers

+
    +
  • Loren Crary (filling in for Tim Schilling): PSF

  • +
  • Afi Gbadago: BPD Open Source Program

  • +
  • Kudzayi Bamhare: Creating ecosystems- conducting a beginner Python workshop in Zimbabwe in partnership with Uncommon teaching hub

  • +
+

BPD Vice-Executor Velda Kiara led a panel with with community leaders about topics concerning Black Leaders in Python.

+

Panel participants Benedict Koji Amofah, Jeff Triplett, Loren Crary, Monica Oyugi, and host Velda Kiara +

+

After the panel, we took part in breakout sessions. My group had a thoughtful and spirited conversation about newcomer psychological safety moderated by Alex Oladele and Paul Everitt.

+

The event ended with a fun happy hour.

+

Me, Abigail Afi Gbadago, and Velda Kiara after the summit! +

+

I am so proud of them for the role they played in organizing an outstanding event. It had a lot of heart.

+

BPD Founder Jay Miller announced that the next leadership summit will be somewhere in Africa.

+

The morning and afternoon replays are available on the info page.

+
+
+

Rooftop View of Durham

+

After the summit, a DjangoCon US attendee who lives at One City Center took a group of us up to the 28th floor for an incredible view of the Durham skyline.

+

Video of the skyline

+

One City Center rooftop pool +

+

back to top

+
+
+

Swag Stuffing

+

On Sunday, I continued my tradition of swag stuffing. Conference pro-tip: it’s a great opportunity to meet people!

+

back to top

+
+
+

Django Social

+

For the second year in a row, Foxley Talent spearheaded a Django Social event at Ponysaurus Brewing Company. Thank you to REVSYS for sponsoring as well.

+

A sign of a fantastic event: it was over before I knew it. I had the chance to catch up with “old” friends and meet new ones.

+

Djangonauts at Ponysaurus +

+

back to top

+
+
+
+

Monday

+

Orientation Chair Kojo Idressa and Conference Chair and DEFNA President Peter Grandstaff kicked off the conference.

+
+

Keynote - Power to the People who Teach the People by Sheena O’Connell

+

Sheena has been an educator since childhood and began working for an education non-profit called Umuzi in 2018. She is interested in metacognition, how people learn.

+

She began her talk by describing the education status quo: common learning anti-patterns, what a normal classroom looks like, and normal success distribution.

+

She introduced Bloom’s 2 Sigma Problem. “The average student tutored one-to-one using mastery learning techniques performed two standard deviations better than students educated in a classroom environment.”

+

Mastery learning techniques +

+

A few advantages of mastery-based learning:

+
    +
  • Social contract- students are more motivated due to buy-in

  • +
  • It helps students develop a growth mindset

  • +
  • It helps the teacher master teaching (“did I do a good job of teaching?”)

  • +
+

A few thoughts on learning

+
    +
  • The power of compounding over time

  • +
  • If you teach one person, it can impact many others

  • +
  • Struggle is good, teach students how to learn

  • +
  • Some teaching techniques are more powerful than others

  • +
  • “Trust no one”

  • +
  • “You can’t teach a person to ride a bicycle by riding a bicycle for them.”

  • +
+

“Education is not the filling of a pail, but the lighting of a fire.”

+

Sheena has started The Guild of Educators.

+

More useful to me resources

+ +

back to top

+
+
+

Choosing Wisely: SPA vs. HTMX for Your Next Web Project by Chris May

+

Last year, in his talk HTML-ivating your Django web app’s experience with HTMX, AlpineJS, and streaming HTML, Chris introduced the idea that you can have a SPA-like exerience in Django without using SPA tools.

+

I wrote about it in my DjangoCon US 2023 Recap.

+

In that talk, he referenced a Thoughtworks article SPA by Default and Tayor Hunt’s Making the World’s Fastest Website and Other Mistakes

+

According to Thoughtworks, “Too often teams are skipping [that] trade-off analysis, blindly accepting the complexity of SPAs by default even when business needs don’t justify it.”

+

Taylor Hunt refactored a React/Redux grocery store SPA app for a much improved experience by using just HTML, CSS, and laser-focused JavaScript.

+

Chris started this year’s talk off by asking some questions: Are you using a SPA? What would make you change? When do you think you should use a SPA? Why would you want to use HTMX versus SPA? What tools are you favorite tools? Are you using them well?

+

SPA downsides

+
    +
  • Slow startup time

  • +
  • Bad user experience on slow devices

  • +
  • “A massive investment in controlling complexity is the only way to scale JS-driven frontends.” Alex Russell in The Market for Lemons

  • +
  • “Not only does JavaScript cost 3x more in processing power, byte-for-byte, than HTML and CSS, but it also removes the browser’s ability to parallelise page loading.” Alex Russell in Caprock

  • +
  • “When using JavaScript you pay a performance tax no less than four times.” Tim Kadlec in The Cost of JavaScript Frameworks

  • +
+

How the front-end is coping +

+

When SPAs could be worth their weight (Alex Russell in Caprock) +

+

When or when-not to SPA (Alex Russell in Caprock) +

+

Chris pointed out Katie Sylor-Miller’s “Component Islands” pattern as showing promise. “Removing the need for a root JavaScript component greatly reduces complexity.” The brower can handle most things without JavaScript.”

+

Streamed HTML Components +

+

Chris introduced tools that can be used to create a SPA-like experience

+ +

Three HTMX success stories

+ +

Notably, OpenUnited developer velocity improved by at least 500% after switching to HTMX.

+

Chris will follow up with a blog post with more info about streaming HTML components.

+

back to top

+
+
+

Error Culture by Ryan Cheley

+

Ryan defined Error Culture: workers ignore automated email alerts, creating a culture of reactive firefighting.

+

Why does it happen? Lack of understanding, error/alert fatigue, hero culture.

+

If an alert is not important: don’t just delete the alert. Delete the mechanism that created the alert.

+

Make sure an alert is… actionable, important, sent to the right people +

+

What, why, who, verb +

+

More useful to me resources

+ +

back to top

+
+
+

Shrimp and Grits

+

I tried grits as a kid and didn’t like them. I’ve recently been told by friends that I just haven’t had the right grits.

+

When I saw grits on the DjangoCon US lunch buffet, I had to try them. I still don’t like them, but it was an experience!

+

North Carolina-inspired lunch +

+

back to top

+
+
+

Troubleshooting is a Lifestyle 😎 by Jack Linke

+

Jack started off the talk with a quote and described indicator categories.

+

“If your only tool is a hammer then everything looks like a nail.” Abraham Maslow

+

Jack started with some Django built-in troubleshooting tools

+
    +
  • Django template error pages

  • +
  • Django error reporting by email

  • +
  • Django system checks framework (it’s extensible- dj-stripe is an example)

  • +
  • Django console and logging (for extra context and use verbosity settings 1-3)

  • +
+

Django System Checks Framework +

+

He then moved on to some third-party packages and tools

+
    +
  • django-debug-toolbar (also extensible)

  • +
  • django-silk performance profiler

  • +
  • Error tracking and performance monitoring- Sentry, Rollbar, Newrelic, Honeybadger, Bugsnag, Raygun

  • +
  • He gave a demo of Sentry dashboard with error page, error message, tags

  • +
  • django-health-check package (can add Celery, Redis, Postgres)

  • +
  • django-watchman

  • +
+

He gave an exemple of extending the Django admin by adding checks. He had an issue with Celery- too few tasks were processed. He put a panel into the admin to capture the last 24 hours of tasks processed through Celery.

+

Strategies for dissecting complex issues +

+

He then gave some general tips for troubleshooting

+
    +
  • Use the power of isolating variables and narrowing scope

  • +
  • Be like Frances Elizabeth Holberton- “break the execution- does the system work up to this point.” Similarly, Python Debugger (PDB) can be used to create breakpoints to step through the code to find the issue.

  • +
  • Avoid tunnel vision- seek broad pespectives and alternative approaches

  • +
+

Troushooting often involves stating the problem and asking for help

+
    +
  • “A problem well stated is a problem half solved.” John Dewey

  • +
  • Rubber duck debugging

  • +
  • Know when to seek assistance

  • +
  • Asking for help is a strategy. Learn how to ask for help effectively

  • +
  • Learn how to create a Minimum Reproducible Example (MRE) to increase your odds of getting help

  • +
+

How to effectively ask for help +

+

Oh no +

+

Yep! +

+

Where to get help +

+

Jack gave a shout out to Ken Whitesell for his prolific question-answering in the Django Forum!

+

Jack encouraged the audience to document your process. +

+

back to top

+
+ +
+

Unlocking Performance: Benchmarking and profiling Django for Maximum Efficiency by Ron Maravanyika

+

Unlocking Performance: Benchmarking and profiling Django for Maximum Efficiency by Ron Maravanyika

+

Ron said that firstly, we need to define efficiency.

+

Benchmarking is looking at time. Profiling is looking at resource usage.

+

Process to Follow +

+

Ron explained some possible tools and gave demos

+
    +
  • Unix time command: real, user, sys

  • +
  • Python timeit module

  • +
  • pytest-benchmark and benchmark_weave, aspectlib

  • +
  • Python profile module

  • +
  • Python cprofile module

  • +
  • Live profiling tool django-silk

  • +
  • django-silk profiler and binary version can be used to create an image that shows parallel functions running

  • +
  • django-silk decorator method and context manager method can be used to profile small blocks of code

  • +
  • django-silk Dynamic profiling can be used to profile something you don’t have access to

  • +
+

Summary +

+

back to top

+
+
+

DEFNA Board Dinner

+

DEFNA had a board dinner to discuss business. It was a pleasure to be treated to a gourmet meal at 21c Museum Hotel Counting House restaurant. It was an unforgettable experience.

+

I had oysters for the first time and particularly enjoyed the scallops and smoked trout dip.

+

The DEFNA Board… wonderful people! +

+

Oysters on the half, blood orange mignonette, cocktail sauce +

+

Smoked trout dip, bread & butter pickle, butter-fried saltine +

+

Diver scallops, pecorino english pea puree, radish & snow pea orzo salad, pea tendrils; Sherry Berry lifts me up, lustau sherry, capelleti, strawberry, aromatic bitters, tonic +

+

Chocolate cremieux, dark chocolate, hazelnut, Italian meringue, decaf coffee +

+

back to top

+
+
+
+

Tuesday

+
+

Keynote - How To Be A Developer and Other Lies We Tell Ourselves by Mario Munoz

+

Mario started off his keynote by introducing himself. “I am a person.” He went on to talk about the diverse experiences that have contributed to who he is today.

+

Mario’s talk was philosophical. He acknowledged, “We all know philosophy and software engineering are the same thing.” Both are involve abstract thinking, making models of intangible things, trying to apply them to real world scenarios.

+

He talked about The Mirror Stage, a concept in Jacques Lacan’s psychoanalytic theory. It refers to the time when a child identifies their own image.

+

Mario then used a Person/Ality personality simulator. Images, as though from the subconscious, appeared on the screen as he talked about experiences he’d had as a developer. Afterward, he analyzed each experience.

+

+

Throughout the talk, he reflected

+
    +
  • “Being a developer should in no way rob you of who you are and your own identity.”

  • +
  • “The biggest lie that we can tell ourselves is that these objects of representation that are outside of us are synonymous with who we are.”

  • +
  • “Everything we tell ourselves about ourselves is always a little bit inadequate.”

  • +
  • Our strengths can be our biggest weakness and our weaknesses can be turned into our strengths.

  • +
+

At the end, he revealed, “I am a community. We are a community… The community is my biggest asset.”

+

“How to be a better developer… be a better person to others.”

+

back to top

+
+
+

PostgreSQL Beyond Django: Strategies to Get Max Performance by Álvaro Justen

+

Alvaro showed some lesser known ways to improve the performance of PostgreSQL.

+

He explained each method, including profiling results, then ran a demo.

+

Some of his suggested methods

+
    +
  • Use UUID field as primary key field and avoid creating two columns. You do not need a sequential ID, because of the UUID hash. You can index UUID.

  • +
  • Starting at Django 3.2, the ID of each field went from 4 to 8 bytes. In settings use the default AutoField instead of BigAutoField.

  • +
  • Alvaro prefers to create his own ID. See urlid.org for his methodology.

  • +
  • Use SQL min/max to check the size of table values. Use SmallIntegerField instead of IntegerField.

  • +
  • Column order can affect space used. Use fixed-size columns (bigger, then smaller), then variable-size. See Data alignment in Postgres.

  • +
  • Full text search and search vector field scenarios

  • +
  • Trigger- perform operations inside of the database more quickly than in the app. Don’t put much business logic in the trigger.

  • +
+

Code

+

back to top

+
+
+

If We Had $1,000,000: What Could The DSF Do With 4x Its Budget? by Jacob Kaplan-Moss

+

Jacob is a retired Django BDFL and current DSF Treasurer. He showed the curent $255,000 DSF budget breakdown. Most of the budget goes to the salary for fellows (health of project) and admin (health of foundation).

+

If the budget were quadrupled to 1,000,000, he has a personal wishlist. +

+

How do we get there? We probably need to target major donors versus many-small funders, and that’s probably ok.

+

Major donors are:

+
    +
  • Corporations

  • +
  • High-net worth individuals

  • +
  • Government grants

  • +
  • Private foundation grants

  • +
+

TL;DR hire experts (executive director, grant writer, etc.) and pay them to get the money.

+

Easy +

+

Medium +

+

Hard +

+

If you take action and get a “no”, Jacob would like to know why. Email him.

+

More useful to me resources

+ +

back to top

+
+
+

Faster, leaner, greener: 10x lower website carbon emissions by Thibaud Colas

+

My points of interest

+
    +
  • Wagtail developer, DSF Board Member

  • +
  • wagtail.org/10x-lower

  • +
  • +
+

back to top

+
+
+

Meeting Lorenzo

+

After years of following each other on social media, Lorenzo Peña and I had the chance to meet in person! I was thrilled that he had the chance to present a talk The art of (not) redirecting and attend the speaker/organizer dinner too.

+

A dream come true +

+

Me and Lorenzo +

+

back to top

+
+
+

Speaker and Organizer Dinner

+

On Tuesday night, I attended the speaker/organizer dinner at Greer Street Garden.

+

It was a chance to relax, enjoy some good food and conversation.

+

Sitting next to Simon Willison, co-creator of Django, I couldn’t resist getting a photo!

+

I wrote about Simon’s PyCon US 2024 talk about Imitation Intelligence in my PyCon US Recap.

+

Me and Simon (photo credit: Django Fellow Natalia Bidart) +

+

back to top

+
+
+

The Boxcar Bar and Arcade

+

After the speaker/organizer dinner, Six Feet Up hosted a Mario Kart competition across the street at The Boxcar Bar and Arcade.

+

I spotted a few favorite old school games too: Super Pac-Man, Ms. Pac-Man, Donkey Kong, BurgerTime, Frogger.

+

Video of Boxcar Arcade

+

Super Pac-Man +

+

Me standing in front of the bar at Boxcar +

+

back to top

+
+
+
+

Wednesday

+

Wednesday was deep dive day.

+
+

Keynote - The Fellowship of the Pony by Natalia Bidart

+

My points of interest +*

+

back to top

+
+
+

Hidden gems of Django 5.x by Sarah Boyce

+

My points of interest +*

+ +

back to top

+
+
+

Lightning Talk Cameo

+

It’s no secret that I’ve been using social media for networking for many years now. Foxley Talent’s Jon Gould and I had a conversation about it. Jon was inspired to create a lightning talk about the subject entitled Coffee Break Career Hacks and featured my social media engagement. It was an honor to be included!

+

Jon during his lightning talk +

+

back to top

+

API Maybe: Bootstrapping a Web Application circa 2024 by Carlton Gibson

+ +

back to top

+
+
+

Panel Discussion: Open, friendly, and welcoming: on the history and future of mentoring in Django

+

Our conference ended with a panel of five women, including three women of color, and Carlton Gibson. They owned that stage and the crowd was totally absorbed with what they had to say. I’m proud to be part of a community that is making substantial progress and quickly at that.

+

Carlton Gibson, Keanya Phelps, Velda Kiara, Afi Maame Dufie, Sarah Boyce, and host Lacey Henschel +

+

back to top

+
+
+

Queeny’s

+

After the conference had ended, I joined a group of Wagtail developers and conference speaker Eva Nanyonga and walked the short distance to Queeny’s, a DjangoCon US institution. No one ever seems to turn down dinner at Queeny’s. :)

+

Group pic! +

+

back to top

+
+
+
+

Hallway track

+

back to top

+
+

Connections Made

+

I chatted with Thibaud Colas about his sustainability talk and got some tips from him.

+

I listened in on a conversation with Lee Trout and Adam Fast and learned about some new tools.

+

I pointed out Chris May’s HTMX talk to Philip, a UI developer. He didn’t know about HTMX and found it very enlightening.

+

I chatted with Jay Miller about how DEFNA could better serve Black Python Devs and reported feedback.

+

I found out from Frank Wiles that there is some early talk about a possible Lawrence Django event.

+

I chatted with Simon Willison about some of my work duties, and he identified them as senior level. He told me about his excitement for his upcoming trip to see the V & E Simonetti Historic Tuba Collection.

+

I spent some much needed quality time with Lacey Henschel. She told me that I can learn anything. :)

+

I met Django Fellow Sarah Boyce for the first time. We chatted about her work and DjangoCon Europe. In addition to her DjangoCon US talk, Sarah recently gave an excellent talk Django Core Demystified.

+

I connected Thibaud with myself, Nicole, and Peter to talk about DjangoCon US website improvements and using it for other conference sites.

+ +

back to top

+
+
+

Swag

+

Velda and John showing off John’s DjangoCon US tote bag… “famous” people signed it, including me! +

+

Black Python Devs Leadership Summit bead lanyard made by an artisan in Kenya (procured by Velda), African bracelet (gift from Velda), Kenyan coffee made with beans from Velda’s family’s farm (gift from Velda), PostgreSQL hat, Valkey sticker, DjangoCon US shirt, Caktus shirt +

+

back to top

+
+
+

Django Social T-Shirt

+

In 2023, Foxley Talent gifted me a Django Social t-shirt. Foxley Talent Recruiter Jon Gould and I took a photo with me wearing it. We recreated the photo!

+

Me and Jon +

+

back to top

+
+
+

Visa Frustration

+

As our conference becomes more diverse, a common frustration has emerged: difficulty getting a visa to enter the US. People from multiple countries have voiced their frustration about this to me. Django community member Julius Boakye poured his heart into a must-read post about it: Breaking Barriers: A Tech Speaker’s Plea for Fair Visa Policies.

+

back to top

+
+
+
+

Thursday

+
+

Sprints

+

Caktus office around the corner from the Marriott is the perfect sprint venue.

+

Me and Carlton +

+

I was racking my brain to figure out what to eat for lunch. I joined a group and walked the short distance to Pie Pushers.

+

A slice of Italian sausage and a simple house salad really hit the spot! It was the best tasting pizza I’ve had in quite a while.

+

Italian sausage and a simple house salad +

+

back to top

+
+
+
+

Another Great Adventure

+

Thank you to my fellow DEFNA Board Members, volunteers, and everyone who made this another wonderful event!

+

Thank you card +

+

The talk replays will be available on the DjangoCon US YouTube channel in a few weeks.

+

Keep scrolling for more sightseeing and food!

+

back to top

+
+
+

More Sight Seeing and Food!

+

back to top

+
+

Sarah P. Duke Gardens

+

For months, I had been looking forward to making it back to the Sarah P. Duke Gardens. It is “the Cadillac” of botanical gardens with jaw dropping scenes everywhere. It’s also said to be a different garden with every new season or even new month. I’d visit Durham again just to go back.

+

Video of historic terraces, fish pool, and Cindy Brodhead Pergola

+

Video from the Red Bridge

+

Video of the South Lawn

+

Fish pool, historic terraces, and Cindy Brodhead Pergola +

+

Ducks at the Red Bridge +

+

South Lawn +

+

back to top

+
+
+

Cocoa Cinnamon

+

I love Cocoa Cinnamon coffee shop. I first tried it last year and went back several times during DjangoCon US 2024. I don’t just love it for the coffee, which is amazing, by the way. On my first visit this year, I was offered a free Chai Latte. As I sat drinking it, they offered a free coffee that was redeemed by a student sitting studying. According to their menu, they also offer reduced price coffees as a service to the community. It’s nice to patronize a business that shows kindness.

+

Drinks had:

+
    +
  • Chai Latte: “Housemade chai blend of cinnamon, cardamon, ginger, rose, anise, & black pepper served unsweetened or with honey or vanilla syrup”

  • +
  • Caramelo: “Sweet & creamy latte with with dulce de leche named for Sandra Cisneros’ novel”

  • +
  • Al Mohka: “Latte with 70% single origin housemade chocolate sauce & cinnamon. Reference to first ever coffee port”

  • +
+

Cocoa Cinnamon… a short walk from the convention center +

+

Yum! +

+

back to top

+
+
+

The Can Opener

+

I acted on a tip from fellow DEFNA Board Member Drew Winstel and visited The Can Opener.

+

Built in the 1940s when vehicles weren’t as large, The Can Opener, a railroad trestle bridge, was a mere 11 feet, 8 inches tall until 8 inches were added in 2019. Even with this improvement and warning signs well in advance, the bridge continues to peel the tops off trucks.

+

The Can Opener +

+

back to top

+
+
+

21c Museum Hotel

+

Last year, I didn’t make it to the 21c Museum Hotel to see the hotel’s signature artwork, so I thought it would be a fun experience this year. I was particularly taken by the see-into bathrooms. Also, the bank vault was a fun throwback to the hotel’s past as a bank.

+

Video of 21c Museum Hotel See Into Bathroom

+

Bank vault entry +

+

Bank vault- first room +

+

Bank vault- inner room +

+

back to top

+
+
+

The Durham Hotel

+

I went to The Durham Hotel, because I heard it has the best public view of the Durham skyline in town. I later had a much higher view of the skyline from the private 28th floor of One City Center, but The Durham Hotel architecture and interior design were well worth a visit in their own right.

+

Skyline left +

+

Skyline right +

+

back to top

+
+
+

Mother and Sons

+

I’d been hungry for good Italian food for a while. Mother and Sons had very high ratings, so I decided to give it a try.

+

I’d planned to play it safe and order the potato gnocchi. I asked the waiter if there was a particular dish that was very popular. He said the squid ink tonnarelli. I told him I’d always wondered what squid ink pasta tasted like, but had been afraid to order it. He said that the squid ink taste was mild. So, I ordered it, and it delicious. It had a lemon-butter shrimp taste.

+

back to top

+
+
+

Durham Food Hall

+

I’d already eaten, but joined a few attendees to walk over to the Durham Food Hall so they could eat. It was a thriving place with a lot of great options.

+

Looking down at the first floor of the food hall +

+

back to top

+
+
+

Press Coffee, Crepes, and Cocktails

+

I love Press Coffee, Crepes, and Cocktails. It’s a short walk south of the downtown and well worth it. It’s a coffeehouse specializing in savory and sweet crepes. The space has a bright, energectic vibe and the food and coffee are very high quality.

+

First time eating avocado toast… I went big! This was gourmet quality, for sure. The seasonal salted pistachio mocha latte was to die for. +

+

back to top

+
+
+

Centerfest

+

Serendipitiously, an art festival called Centerfest was taking place on Saturday and Sunday.

+

I wandered through the art booths, then stumbled upon one of many musical acts. It was called Heart of Carolina A Capella. It was fun!

+

Video of Heart of Carolina A Capella singing Sweet Caroline

+

Video of Heart of Carolina A Capella singing Seven Bridges Road

+

back to top

+
+
+

Durham Market Culture

+

It’s wonderful to see Durham’s thriving market and festival culture. In addition to Centerfest, I stumbled upon the Durham Farmers’ Market, Durham Craft Market, and Durham Underground Market all in the same weekend.

+

On Sunday, I was looking for a quick, tasty lunch and decided to try the fare of a Durham Underground Market food truck.

+

Cousins Maine Lobster piqued my interest. According to the truck, the founders had appeared on Shark Tank.

+

I ordered a lobster tail, but they were out, so they upgraded me to a lobster roll and tots. It was my first time eating a lobster roll. It was tasty!

+

This was the moment when I realized my low cholesterol diet was officially suspended +

+

back to top

+
+
+

Unscripted Rooftop Pool

+

I had the chance to spend time at the Unscripted Hotel. The rooftop overlooks the downtown and features a pool, bar, and DJ. It was an unforgettable atmosphere.

+

Video of the Unscripted rooftop pool

+

back to top

+
+
+

The Parlour

+

I made a trip to The Parlour for the second year in a row. Last year, I had chocolate and was underwhelmed. This year, I had their most popular flavor- Salted Butter Caramel. It was truly incredible. I hope to make it back to Durham someday and visit The Parlour again!

+

Salted Butter Caramel +

+

back to top

+
+
+
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/djangocon-us-2024-topics-inspiration-list.html b/djangocon-us-2024-topics-inspiration-list.html new file mode 100644 index 00000000..c755c167 --- /dev/null +++ b/djangocon-us-2024-topics-inspiration-list.html @@ -0,0 +1,243 @@ + + + + + + + + DjangoCon US 2024 Topics Inspiration List — Portfolio 0.1 documentation + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

DjangoCon US 2024 Topics Inspiration List

+

Published March 3, 2024

+

New Features and Future Outlook

+ +

Django Core

+ +

Django Software Foundation

+ +

Diversity

+
    +
  • Where we stand in bringing more diversity to: our steering council, core dev, contributor base, community

  • +
  • Update on Djangonaut Space

  • +
  • New initiatives: Hidden Figures of Python Podcast (women make up “only 17% of invited guests among the popular podcast series”)

  • +
+

Python Packaging and Open Source

+ +

How to Raise Your Game

+
    +
  • Lesser known, but highly useful Django features

  • +
  • Practical Django profiling, optimization

  • +
  • Security (OWASP 10 and Django, how Django does security)

  • +
  • Testing (pytest, Playwright, Selenium, etc).

  • +
  • Type hinting

  • +
  • Patterns and architectures

  • +
  • Practical async (going beyond the docs and a few tutorials to using day to day)

  • +
+

New-ish or Experimental Technologies

+
    +
  • React/HTMX debate (see Chris May’s great talk last year about using HTMX, Alpine.js, and Streaming HTML and the work to be done)

  • +
  • Using JavaScript and Django together: Alpine, Svelte, etc.

  • +
  • Tailwind

  • +
  • WASM

  • +
  • PyScript

  • +
  • Co-Pilot, ChatGPT, etc. for Django devs

  • +
  • What tools I haven’t heard about, but would want to know about

  • +
+

Alternative Django Use Cases

+
    +
  • Orchestration/workflows

  • +
  • Multi-tenancy

  • +
+

Database

+
    +
  • Database/Django performance tuning at scale

  • +
  • Database tradeoffs: Postgres, CockroachDB, SQL, etc.

  • +
  • Datasette

  • +
+

Opinionated Django

+
    +
  • Django deployment options and tradeoffs in 2024

  • +
  • Different ways of doing things in Django and when to use which option

  • +
  • The best tools/packages to have in your Django toolbox in 2024

  • +
  • Favorite workflows, Git, CI/CD, GitHub Actions, local/prod, developer experience tools, etc.

  • +
+

API

+
    +
  • Django Ninja compared to Django Rest Framework

  • +
  • Fast API

  • +
+

How to Use/Better Popular CMS

+
    +
  • Wagtail

  • +
  • Butter CMS

  • +
+

Learning

+
    +
  • Flexing your problem solving chops

  • +
  • Recursion (looking at you, Al Sweigart)

  • +
  • Great learning resources and the people who created them

  • +
  • Strategies for effective learning

  • +
+

Novel Uses for Django

+
    +
  • Experimental apps

  • +
  • Prototyping with Django for fun and profit

  • +
  • Historically relevant apps

  • +
  • Your interesting Django story/adventure

  • +
  • Lessons from managing/scaling Django in a unique or difficult way in your company

  • +
  • Using Django for social good

  • +
+

Team, Leadership, Building

+
    +
  • Product management (features, prioritization, OKRs, teamwork, etc.)

  • +
  • Lessons from software engineering management

  • +
  • Interesting mental models, productivity methods, learning approaches, the counter-intuitive

  • +
+

Python/Django and Open Source

+
    +
  • Adventures in open source Django development

  • +
  • How to get started with open source, Django open source, packaging

  • +
+ +
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/favorite-conference-snapshots.html b/favorite-conference-snapshots.html new file mode 100644 index 00000000..ffbe0e96 --- /dev/null +++ b/favorite-conference-snapshots.html @@ -0,0 +1,323 @@ + + + + + + + + Favorite Conference Snapshots — Portfolio 0.1 documentation + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

Favorite Conference Snapshots

+

Although these snapshots do not include all of the people who are special to me, they give a taste of the fun and serendipity of my conference travels over the years. In the Python community, as they say, the world is your oyster. A huge thank you to everyone who has made these incredible experiences possible over the years.

+
+

DjangoCon US 2024

+

September 22-27, Durham, North Carolina

+

+Me and Carlton Gibson, former Django Fellow, at the first day of sprints

+

+After the conference had ended, I joined a group of Wagtail developers and conference speaker Eva Nanyonga for dinner at nearby Queeny’s.

+

+Sitting next to Simon Willison, co-creator of Django, at the speaker/organizer dinner, I couldn’t resist getting a photo! I wrote about Simon’s PyCon US 2024 talk about Imitation Intelligence in my PyCon US Recap. (photo credit: Django Fellow Natalia Bidart)

+

+After years of following each other on social media, Lorenzo Peña and I had the chance to meet in person! I was thrilled that he had the chance to present a talk and attend the speaker/organizer dinner too. It was a dream come true for him. Stories like that make my day!

+

+Wonderful people… the DEFNA Board dinner at 21c Museum Hotel Counting House. An unforgettable meal.

+

+Me, Abigail Afi Gbadago, and Velda Kiara after Black Python Devs Leadership Summit! I am so proud of them for the role they played in organizing an outstanding event. It had a lot of heart.

+

+I’ve always wanted one of these! A nice visual metaphor taken along the side of the conference hotel during Centerfest Fine Art Festival.

+
+
+

PyCon US 2024

+

May 15-20, Pittsburgh, Pennsylvania

+

+After the conference ended on Sunday night, I found myself chatting with a group of old friends and new friends. They invited me to dinner, and I decided to join. It was a wonderful time, as you can tell from the photo. :) Pictured: Tammy Do, Velda Kiara, Jim Anderson, Ngazetungue Muheue, Kudzayi Bamhare, Benedict Kofi Amofah, me, Afi Gbagado, and Catherine Devlin

+

+Me and Jackie Kazil :)

+

+Not only does Ned Batchelder maintain a powerful Python package and give popular conference talks, he is also a juggling enthusiast. When I saw his juggling open space in progress, I couldn’t resist stopping. I juggled for the first time in probably decades!

+

+My friend Melanie Arbor takes great profile pics. At DjangoCon US 2017, she took my pic, and I loved it. I’ve used it as my social media profile pic since then, but it’s getting a bit dated. I saw her at PyCon US and asked her if she would be willing to take a new profile pic of me. It turned out that she had already created a “Profile Pic Palooza” open space for Saturday at 3 pm. As a bonus, I got to catch up with Chalmer Lowe for the first time since PyCon 2019.

+

+When I create this page of favorite conference snapshots, Benedict Kofi Amofah tweeted to me that he’d be in the gallery soon. I took him up on it. :)

+

+Although not a typical snapshot, this screenshot from K. Jay Miller’s keynote about Black Python Devs is special to me. They are snapshots from DjangoCon US 2023 in Durham, North Carolina. Jay highlighted DjangoCon US as a place where Black Python Devs were empowered.

+

+Me and Abigail Mesrenyame Dogbe

+
+
+

PyTexas 2024

+

April 19-21, Austin, Texas

+

+I met Jason Koo at DjangoCon US 2022 in San Diego where he generously helped as an organizer. It was great to see him again, and I look forward to learning more about Neo4j Graph Database! On the bright, sunny, second day of PyTexas, he invited me to be in this photo. It was a pleasure to get a snapshot next to my incredible friend Carol Willing. She had given an amazing keynote that morning. It is a must watch! I was also standing next to Josh Cannon who read the very clever Oh the (Methods) You Can (Make) book by Dunder Seuss.

+
+
+

DjangoCon US 2024

+

September 22-27, 2024, Durham, North Carolina

+

+As a DEFNA Board Member, I help oversee DjangoCon US, including the website design. Because our host city Durham, North Carolina has the largest population of lemurs outside of Madagascar, we featured a “friendly” lemur on our website last year. After years of hearing about Tanganyika Wildlife Park in Goddard, Kansas, mom and I decided to go on April 6. I had no idea until I got there that you can feed lemurs. They were so soft and gentle. I loved spending time with these real-life, friendly lemurs!

+

+A lemur holding hold my hand while it eats a Craisin out of my palm!

+
+
+

DjangoCon US 2023

+

October 16-20, Durham, North Carolina

+

+Wonderful people… DjangoCon US Organizers; photo credit: Bartek Pawlik (https://bartpawlik.format.com/)

+

+Standing ovation for organizers during the final remarks… one of many standing ovations over the years. Always a nice feeling. Photo credit: Bartek Pawlik (https://bartpawlik.format.com/)

+

+Me and Deb Nicholson, new PSF Executive Director… I met Deb unexpectedly at the pre-conference Django Social. It was a pleasure to get the chance to hang out with her throughout the week! I hope to do it again soon.

+

+Me and Abigail Mesrenyame Dogbe. She is bringing open source to Ghana in a big way.

+

+Me with Jon Gould of Foxley Talent. I was lucky to be gifted this Django Social t-shirt by Jon.

+

+Hanging out with some amazing attendees late into the evening, including fellow DjangoCon US Organizer Drew Winstel and favorite Python/Django authors Eric Matthes and William Vincent. Photo credit: Paolo Melchiorre

+

+DEFNA Board Dinner at the incredible Parizade with Peter Grandstaff and Nichole Dominguez… a perfect evening.

+
+
+

DjangoCon US 2022

+

October 16-21, San Diego, California

+

+One night while I was having dinner with favorite author Eric Matthes and now DEFNA Board Member Tim Schilling, former DEFNA Board Member Craig Bruce showed up unexpectedly. What a wonderful surprise! During all of the time that we’d been fellow board members, we’d never actually met in person. As usual, I’d been to the beach earlier in the week and gotten a bit too much sun. :)

+

+Me captured through the window enjoying the “hallway track” standing next to Eric Holscher of Read the Docs and Write the Docs; photo credit: Bartek Pawlik (https://bartpawlik.format.com/)

+

+Me with wonderful fellow organizer Noah Alorwu; photo credit: Bartek Pawlik (https://bartpawlik.format.com/)

+
+
+

DjangoCon US 2021

+

October 21-23, online

+

+Following in the footsteps of PyCon US and with multiple Spanish-speakers on our DEFNA Board, we decided to have a Charlas track. Giving a talk in Spanish had been on my bucket list for quite some time. I decided to submit a proposal and it was accepted. I ended up recording the talk in both Spanish and English, and they were both played simultaneously. My pre-recorded talk Get a Jumpstart on Collaboration and Code Review in GitHub playing in English.

+

+My pre-recorded talk Get a Jumpstart on Collaboration and Code Review in GitHub playing in Spanish

+
+
+

PyCascades 2020

+

February 8-9, Portland, Oregon

+

+At the end of a conference day, I was hanging out in the lobby among other stragglers and was invited to dinner by my friends Vicky Tuite and Jonan Scheffler. Python creator and BDFL Guido van Rossum happened to be in attendance. What a magical evening!

+

+Hanging out with Guido at the sprints

+
+
+

GitHub Universe 2019

+

November 13-14, San Francisco, California

+

+After Nat Friedman, then GitHub CEO, tweeted to me that he’d love meet, I had the chance to talk to him briefly. It was super fun to hear from him in person. Love open source!

+

+At PyGotham 2019, within just a few hours of time, attendee Jigyasa Grover invited me to tour Twitter, Froi Irizarry Rivera invited me to tour GitHub, and Casey Faist invited me to Salesforce Tower. During GitHub Universe 2019, I toured Twitter and GitHub. Unfortunately, Casey was ill, so I didn’t tour the tower. Here I am at GitHub in front of the iconic Octocat statue.

+

+Me and Jigyasa Grover, machine learning engineer, having tea after lunch at Twitter

+

+Me at Twitter

+

+Me at Twitter

+
+
+

DjangoCon US 2019

+

September 22-27, San Diego, California

+

+Happy times!; photo credit: Bartek Pawlik (https://bartpawlik.format.com/)

+

+Selfie with our wonderful Ken Whitesell. For years, he has been the face that welcomes attendee to DjangoCon US and is a recipient of the Malcolm Tredinnick Memorial Prize.

+
+
+

Strange Loop 2019

+

September 13-14, Saint Louis, Missouri

+

+My longtime Twitter friend Marcia Dorsey was volunteering at an event outside the Strange Loop venue. I couldn’t pass up an opportunity to take a break from the conference and meet her in person. I told her how fun it had been to meet her son Twitter and Square co-founder Jack Dorsey at a tweet up the year before! I tried to get her to set me up on a date with him, but it didn’t happen, lol.

+
+
+

PyCon US 2019

+

May 1-9, Cleveland, Ohio

+

+Me with one of my Python besties Mariatta (PyCon US 2023/2024 Chair and CPython Core Dev) :)

+

+Proud to have represented DEFNA Board at PyCon Charlas (Spanish talks). Here I am with Joel Rivera and the PyLatam logo!

+
+
+

DjangoCon US 2018

+

October 14-19, San Diego, California

+

+Taking part in the State of Django Panel; photo credit: Bartek Pawlik (https://bartpawlik.format.com/)

+

+Happy times! Me front row, left. Photo credit: Bartek Pawlik (https://bartpawlik.format.com/)

+

+After the conference, I flew to San Francisco. I visited my friend Betty Junod at Docker Headquarters. Fun!

+

+Before I went to Docker, Jack Dorsey tweeted that there would be a tweet up in San Francisco later in the day. When I left Docker, I went to the tweet up at Tacolicious. I met Jack, Twitter co-founder Biz Stone, and a bunch of other Twitter, Inc principals, including then CFO Ned Segal, Head of Product Kayvon Beykpour, early investor Bijan Sabet, and Recode journalist Kurt Wagner. Amazing night! When I walked up to the gaggle around Jack, he was shockingly nice. Later, I took a pic with him.

+
+
+

PyGotham 2018

+

October 5-6, New York, New York

+

+Incredibly, the day before the conference started, I was walking around mid-town Manhattan alone and saw my friend Tim! What are the odds? He invited me to dinner at one of his favorite restaurants. Here I am with Trey Hunner, Tim Allen, Kenneth Love (DjangoCon US 2018 Co-Chair), and Lindsey Dragun. A treasured memory.

+

+Me with the incredible Lacey Williams Henschel (DjangoCon US 2017 Chair). She was giving a talk What if Jane Austen had been an engineer? :)

+

+Me with Lindsey Dragun, Trey Hunner, and Nicholle James (DjangoCon US 2018 Co-Chair) during the conference

+
+
+

PyGotham 2017

+

October 6-7, New York, New York

+

+My second ever conference, treated to dinner by local attendees who wanted to make new friends and thank out-of-towners for coming.

+
+
+

DjangoCon US 2017

+

August 13-18, Spokane, Washington

+

+Me giving my talk Get a Jumpstart on Collaboration and Code Review in GitHub. I gave my first conference talk at the first conference that I ever attended. I practiced using the AV system at a local church. I realized later that I had a lot of room for improvement (the speaker ahead of me was a veteran public speaker and technologist and watching her made me see how well it could be done), but it was a start. DjangoCon US loves to be the place where people get their start giving talks. :) Photo credit: Adam Gregory (https://atomimages509.wixsite.com/atom)

+

+Speaker photo… representing Lawrence, Kansas, the birthplace of Django with a KU Basketball t-shirt; photo credit: Adam Gregory (https://atomimages509.wixsite.com/atom)

+

+A treasured head shot taken by my friend Melanie Arbor during the sprints

+
+
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/genindex.html b/genindex.html new file mode 100644 index 00000000..27f51a11 --- /dev/null +++ b/genindex.html @@ -0,0 +1,131 @@ + + + + + + + Index — Portfolio 0.1 documentation + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ + +

Index

+ +
+ +
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/hacktoberfest-prs-2020.html b/hacktoberfest-prs-2020.html new file mode 100644 index 00000000..3a262ab6 --- /dev/null +++ b/hacktoberfest-prs-2020.html @@ -0,0 +1,384 @@ + + + + + + + + Hacktoberfest PRs- 2020 — Portfolio 0.1 documentation + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

Hacktoberfest PRs- 2020

+

In the spirit of building in public and using accountability to improve, I decided to write a brief summary of my Hacktoberfest PRs.

+
+

pugdebug PyPI Package

+

I learned a great deal about packaging recently while overseeing a Pinax release. It was a fun exercise to use some of that knowledge to create the packaging configs for an app called pugdebug and test publish and install it. The project was fairly straight forward, which meant that the script could be relatively simple. Based on a tweet by Dustin Ingram, I used the official PyPA Sample Project as a starting point. Check out the setup.py file in that project to see some of the other commonly used, optional arguments. :)

+
    +
  • Issue: https://github.com/Mte90/pugdebug/issues/9

  • +
  • PR: https://github.com/Mte90/pugdebug/pull/13

  • +
+

Action taken:

+
    +
  • Created a setup.py file

  • +
  • Based on the project docs and PyPA docs, created the relevant packaging configs

  • +
  • Test published the package to the PyPI test instance

  • +
  • Test installed the package using the PyPA packaging tutorial

  • +
+

New setup.py

+
from setuptools import setup, find_packages
+import pathlib
+
+here = pathlib.Path(__file__).parent.resolve()
+
+long_description = (here / 'README.md').read_text(encoding='utf-8')
+
+setup(
+    name='pugdebug',
+    version='1.1.0',
+    description='A standalone debugging client for PHP applications',
+    long_description=long_description,
+    long_description_content_type='text/markdown',
+    url='https://github.com/Mte90/pugdebug',
+    classifiers=[
+        'Intended Audience :: Developers',
+        'Topic :: Software Development :: Debuggers',
+        'Operating System :: OS Independent',
+        'License :: OSI Approved :: GNU General Public License v3 (GPLv3)',
+        'Programming Language :: Python :: 3 :: Only',
+        'Programming Language :: Python :: 3.7',
+    ],
+    python_requires='>=3.7',
+    install_requires=['sip', 'PyQt5']
+)
+
+
+

A few useful resources:

+
    +
  • PyPA Sample Project: https://github.com/pypa/sampleproject

  • +
  • PyPA Packaging Python Projects tutorial: https://packaging.python.org/tutorials/packaging-projects/

  • +
  • Real Python “How to Publish an Open-Source Python Package to PyPI” tutorial: https://realpython.com/pypi-publish-python-package/

  • +
  • PyPI classifiers list: https://pypi.org/classifiers/

  • +
  • PyPI test instance: https://test.pypi.org/

  • +
+
+
+

All the Places Scraper

+

For a while now, I’ve been wanting to learn how to make a scraper, so, when I came across the All the Places project, which contains a collection of Scrapy scripts (a.k.a “spiders”) that can be used to scrape business websites for location data, I decided to make one of my own to contribute to the All the Places project for Hacktoberfest.

+

I learned so much from this exercise, that I created a blog post about it, “Building a Taco John’s Scraper.” Check it out if you want an insight into my learning process and how the script works.

+

Now that I’ve created a working scraper, I can build on that knowledge by using it in a more complex project.

+
    +
  • PR #1: https://github.com/alltheplaces/alltheplaces/pull/1634

  • +
  • PR #2: https://github.com/alltheplaces/alltheplaces/pull/1639

  • +
+

Action taken:

+
    +
  • Studied scraper scripts and websites they scrape to see different approaches

  • +
  • Created a script that would follow CSS classes and elements to identify location page URLs and crawl them

  • +
  • Tested the script locally to verify that the script returns the scraped data

  • +
+

My Scrapy script

+
import re
+
+import scrapy
+
+from locations.items import GeojsonPointItem
+
+
+class TacoJohns(scrapy.Spider):
+    name = "taco_johns"
+    allowed_domains = ["tacojohns.com"]
+    download_delay = 0.2
+    start_urls = (
+        "https://locations.tacojohns.com/",
+    )
+
+    state_pattern = re.compile("^[a-z]{2}(\.html)$")
+    city_pattern = re.compile("^[a-z]{2}\/.+(\.html)$")
+    location_pattern = re.compile("^[a-z]{2}\/.+\/.+(\.html)$")
+
+    def parse(self, response):
+        urls = response.xpath('//li[@class="c-directory-list-content-item"]//@href').extract()
+        for url in urls:
+            if (self.state_pattern.match(url.strip())):
+               yield scrapy.Request(response.urljoin(url), callback=self.parse_state)
+            elif (self.location_pattern.match(url.strip())):
+                yield scrapy.Request(response.urljoin(url), callback=self.parse_location)
+            else:
+                yield scrapy.Request(response.urljoin(url), callback=self.parse_city)
+
+    def parse_state(self, response):
+        urls = response.xpath('//li[@class="c-directory-list-content-item"]//@href').extract()
+        for url in urls:
+            if (self.location_pattern.match(url.strip())):
+                yield scrapy.Request(response.urljoin(url), callback=self.parse_location)
+            else:
+                yield scrapy.Request(response.urljoin(url), callback=self.parse_city)
+
+    def parse_city(self, response):
+        urls = response.xpath('//*[@class="c-location-grid-item-link page-link hidden-xs"]//@href').extract()
+        for url in urls:
+            yield scrapy.Request(response.urljoin(url), callback=self.parse_location)
+
+    def parse_location(self, response):
+
+        properties = {
+            'ref': response.url,
+            'name': response.xpath('//div[@itemprop="name"]//text()').extract_first(),
+            'addr_full': response.xpath('normalize-space(//*[@itemprop="streetAddress"]//text())').extract_first(),
+            'city': response.xpath('//span[@itemprop="addressLocality"]//text()').extract_first(),
+            'state': response.xpath('//*[@itemprop="addressRegion"]//text()').extract_first(),
+            'postcode': response.xpath('normalize-space(//span[@itemprop="postalCode"]//text())').extract_first(),
+            'country': "USA",
+            'phone': response.xpath('//span[@id="telephone"]//text()').extract_first(),
+            'website': response.url,
+            'lat': response.xpath('//*[@itemprop="latitude"]/@content').extract_first(),
+            'lon': response.xpath('//*[@itemprop="longitude"]/@content').extract_first(),
+        }
+
+        yield GeojsonPointItem(**properties)
+
+
+

A few useful resources:

+
    +
  • “All The Places Data Format”: https://github.com/alltheplaces/alltheplaces/blob/master/DATA_FORMAT.md

  • +
  • Scrapy docs: https://docs.scrapy.org/en/latest/

  • +
  • Beautiful Soup docs: https://www.crummy.com/software/BeautifulSoup/bs4/doc/

  • +
  • Mozilla Web docs: https://developer.mozilla.org/en-US/

  • +
  • JSON docs: https://www.json.org/json-en.html

  • +
  • Schema docs: https://schema.org/

  • +
+
+
+

YT Higher Lower

+

While I was looking through Hacktoberfest issues, the YT Higher Lower project piqued my interest. This was admittedly an easy PR. However, it provided a real benefit to a project and gave me the opportunity to try out a Python “game” script made based on a well-known product, and understand how it works.

+
    +
  • Issue: https://github.com/Jack1q/yt-higher-lower/issues/1

  • +
  • PR: https://github.com/Jack1q/yt-higher-lower/pull/26

  • +
+

Action taken:

+
    +
  • Looked for common YouTube terms and added them to terms.txt

  • +
+

Terms I added to terms.txt

+
tutorial
+funniest
+talk show
+late night
+snl
+makeup
+tech
+classics
+jimmy fallon
+
+
+

A few useful resources:

+
    +
  • The original “Higher Lower Game” website: http://www.higherlowergame.com/

  • +
  • The original “Higher Lower Game” Android app: https://play.google.com/store/apps/details?id=com.codecomputerlove.higherlowergame

  • +
  • The original “Higher Lower Game” iPhone/iPad/iPod app: https://apps.apple.com/us/app/the-higher-lower-game/id1130297669

  • +
+
+
+

Django/React Template README.md Improvement

+

I didn’t intend to submit a PR of this type this year, because it would be a smaller step change in learning for me in comparison to some other contributions. However, when I came across this project’s README, I couldn’t resist submitting a PR to give it a more polished look!

+

Unfortunately, this PR ended up not counting. Even though the repo owner created an issue welcoming general Hacktoberfest contributions and seemed to happily accept this PR, neither the repo itself nor the PR was ever properly labeled to qualify for Hacktoberfest. Regardless, I ended up with five other qualifying PRs, including two PRs for my All the Places scraper, and a PR improving another project README.

+

I mainly included this, because it demonstrates an important type of contribution that repo owners tend to be happy to receive, solicited or unsolicited, that can be great for a newcomer to open source who is looking for a way to get started.

+
    +
  • PR: https://github.com/lfsando/django-drf-typescript-react-redux-template/pull/6

  • +
+

Action taken:

+
    +
  • Created a table of contents

  • +
  • Replaced markdown text quote with language-specific code fencing

  • +
  • Added features category

  • +
  • Better organized installation instructions

  • +
+

Snippet from README.md before improvement

+
## Django + Django Rest Framework + Typescript + React + Redux Template
+
+- Django API (DRF) Backend
+- Typescript, React, Redux Frontend
+
+### Install
+
+#### Frontend
+
+> npm i
+>
+> ###### Production:
+>
+> npm run build
+>
+> ###### Development:
+>
+> npm run dev
+
+# More of the same
+
+
+

Snippet from README.md after improvement

+
# Django + Django Rest Framework + Typescript + React + Redux Template
+
+Table of Contents
+-----------------
+
+- [Features](#features)
+- [Getting Started](#getting-started)
+    - [Frontend](#frontend)
+    - [Backend](#backend)
+- [Todo](#todo)
+
+## Features
+
+Backend
+* Django Rest Framework
+* Django Rest Knox
+* PyLint
+
+Frontend
+* Webpack
+* React
+* Redux
+* TypeScript
+* Prettier
+
+## Getting Started
+
+### Frontend
+
+```javascript
+npm i
+```\
+
+# More of the same (by the way, I included the \ to escape the code somehow!)
+
+
+

A few useful resources:

+
    +
  • GitHub Open Source Survey 2017 results (insights about documentation): https://opensourcesurvey.org/2017/#insights

  • +
  • Pinax sample README.md: https://github.com/pinax/pinax-announcements/blob/master/README.md

  • +
  • GitHub docs “Basic writing and formatting syntax”: https://docs.github.com/en/free-pro-team@latest/github/writing-on-github/basic-writing-and-formatting-syntax

  • +
  • GitHub docs “Creating and Highlighting Code Blocks”: https://docs.github.com/en/free-pro-team@latest/github/writing-on-github/creating-and-highlighting-code-blocks

  • +
+
+
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 00000000..860080be --- /dev/null +++ b/index.html @@ -0,0 +1,339 @@ + + + + + + + + Welcome to Kati’s Portfolio! — Portfolio 0.1 documentation + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

Welcome to Kati’s Portfolio!

+
+
+ + + + + + +
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/los-angeles-2023.html b/los-angeles-2023.html new file mode 100644 index 00000000..a9a56d89 --- /dev/null +++ b/los-angeles-2023.html @@ -0,0 +1,837 @@ + + + + + + + + Los Angeles 2023 — Portfolio 0.1 documentation + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

Los Angeles 2023

+ + + +
+

Table of Contents

+ +
+
+

Intro

+

I finished my work year with a successful presentation to my department (see my 2023 Recap for a review of my year!). A few hours later, I arrived at LAX. With Santa Monica as my “home base,” I spent 9 days seeing the city. It was the first non-business trip that I’d taken in years. I had a general idea of the things I wanted to do, but hadn’t done much planning. I played it by ear, and it worked.

+
+
+

My Top Picks

+

TL;DR

+

Hollywood experience

+ +

Great views, artwork, and science

+ +

Beach fun

+ +

Fascinating

+ +

Good food

+ +

back to top

+
+
+

Wednesday

+
+

Travel Serendipity

+

I’ve had a lot of what I call travel serendipity. My trip kicked off with some incredible entertainment business serendipity!

+

Immediately upon arriving in Los Angeles, I had the good fortune to randomly meet award show producer Charnise Love Jones! She has worked on the Daytime Emmys, Children and Family Emmys, Grammys, BET Awards, Soultrain Awards, Stellar Awards, NAACP Image Awards, American Music Awards, and many other fun productions. Wow!

+

We’ve connected on LinkedIn, and I can’t wait to get to know her work better and follow her adventures! Check out her Instagram and YouTube channel.

+

back to top

+
+
+

Santa Monica Pier at Night

+

I arrived in Santa Monica after dark. I was staying about a block from the pier, so I walked there to get a good look at it at night. It was magical!

+

+Santa Monica Pier at night

+

+Pacific Park Amusement Park

+

+Pacific Park ferris wheel overlooking the ocean waves…

+

Video of walking along Santa Monica Pier

+

Video of Santa Monica Pier looking east

+

Video of ferris wheel and roller coaster

+

Video of north of the Santa Monica Pier

+

Video of south of the Santa Monica Pier

+

back to top

+
+
+

North Italia

+

I was looking for a convenient, but decent place to eat dinner. I stumbled upon North Italia while walking down the street. The food is handmade with the best ingredients, and it was good, but a bit high falutin’ Italian for my taste. Later in the week, I discovered another Italian restaurant nearby called Bruno’s Ristorante Italiano. North Italia did not compare to the simple, delicious authenticity of Bruno’s. Bruno’s perfectly hit the spot for me. Sorry, North Italia.

+

+North Italia Crushed Meatball Ragu: beef meatball, porchetta, blistered onion, wild oregano, bucatini, pecorino

+

back to top

+
+
+
+

Thursday

+
+

Blue Daisy

+

On Thursday, I ate breakfast at Blue Daisy. I picked it on the spur of the moment, because it was nearby and the reviews I read were positive. The staff were wonderful, but the food was underwhelming.

+

I had 3 eggs scrambled with mushroom, which came with zucchini hash and a plain crepe with jam.

+

+Breakfast…

+

I asked the waiter if the zucchini hash came from another culture. He laughed and said it’s something the chef invented to make breakfast healthier. Sounds like an Los Angeles thing. I don’t know if I want my breakfast to be that healthy.

+

The best part of the meal was a delicious Turkish Latte (“creamy and a touch of sweetness”).

+

+Turkish latte… beautiful and yummy!

+

back to top

+
+
+

Santa Monica and Venice Beaches

+

Perhaps because I have spent most of my life in a landlocked state, when I arrive in a city on the coast, I can’t wait to get to the ocean.

+

On my first full day in Los Angeles, I walked from Santa Monica Pier to Venice Beach Pier via the boardwalk, then back to Santa Monica Pier via the ocean.

+

The San Diego beaches that I’ve been to have been more breathtaking (south of La Jolla Cove) and more California-y (Pacific and Ocean Beaches Boardwalks), but it was great to be near the ocean again.

+

+Venice Beach Boardwalk

+

+Venice Beach Skateboard Park, near the Muscle Gym

+ +

+Venice Beach Pier… love the sight of a sailboat!

+

+Venice Beach waves crashing

+

+Venice Beach waves crashing

+

+Santa Monica Beach looked toward the pier

+

+Santa Monica Pier… the sun is going down.

+

Video of birds flying around Santa Monica Beach

+

Video of walking along Santa Monica Pier

+

Video of Venice Beach Boardwalk

+

Video of Venice Beach Skatepark

+

Video of a bird flying above Venice Beach Pier

+

Video of a sailboat at Venice Beach Pier

+

Video of Venice Beach north of the pier

+

Video of Venice Beach south of the pier

+

Video of Venice Beach sand pipers

+

Video of good waves at Venice/Santa Monica Beaches

+

Video of a dog running along Santa Monica Beach

+

Video of Santa Monica Beach with a view of the pier

+

Video of Santa Monica Pier at sunset

+

back to top

+
+
+
+

Friday

+
+

Warner Brothers Studio Tour

+

See the end of this blog post for a comparison between Warner Brothers Studio Tour and Universal Studios Tour.

+

After some quick research, I settled on Warner Brothers Studio Tour as a top priority. It was an incredible, in-depth experience.

+

Because I hadn’t read up on the details of the tour ahead of time, I had no idea what I would see.

+

Having my photo taken on the real Friends was a really fun surprise and gave me a feeling of childlike delight. What a great way to kick off my Hollywood sightseeing.

+

In addition to a tour of city and town backlots, the Friends soundstage, and a photo in front of the Friends fountain, there were multiple large exhibits packed full of costumes, props, vehicles, and interactive experiences from Superman, Wonder Woman, Justice League, Batman, Game of Thrones, Harry Potter, Gilmore Girls, Big Bang Theory, My Fair Lady, Casablanca, and many others.

+

+Me on the real Friends set… I don’t usually buy these, but couldn’t resist this time!

+

+Me sitting in front of the real Friends fountain… the sofa looks soft, but was actually hard as a rock. The fountain was also used in Wonder Woman (Lynda Carter leapt over it) and the Bewitched pilot.

+

+Town backlot with gazebo

+

+Harry Potter spells

+

+Mr. Freeze, Joker, Oz, and Riddler costumes in front of the Arkham Asylum gates

+

+Warner Brothers Studio awards

+

Video of Friends set

+

Video of the Friends fountain

+

Video of casting spells in Wizarding World

+

back to top

+
+
+

Hollywood Walk of Fame, TCL Theatre, Hollywood Sign, Dolby Theater

+

After the Warner Brothers Studio Tour, I traveled over to Hollywood Boulevard and walked around.

+

+Hollywood Boulevard

+

+TCL Chinese Theater

+

+Michael Jackson’s handprints, glove prints, and footprints

+

+Hollywood Sign as seen from the upper floor of Ovation Shopping Center.

+

+On Oscar night, Hollywood Boulevard becomes a red carpet walkway for the stars. What is normally the entrance to the Ovation Shopping Center will become a grand, elaborately decorated hall that the Academy Awards Ceremony attendees will walk down.

+

+The steps leading up to the Dolby Theater Tour, where the Academy Awards Ceremony takes place

+

Video walking into Ovation Shopping Center up to Dolby Theater

+

Video walking around Hollywood Boulevard

+

back to top

+
+
+

Dolby Theater Tour

+

Afterward, I took the Dolby Theater Tour. I really enjoyed it. It was one of the most fun things that I’ve ever done.

+

My tour guide was a long-time Academy Awards Ceremony crew member. We walked in the footsteps of the A-list stars into the theater, then backstage and on stage where we had a view of the audience from where the presenters stand. We exited stage left, then took the red carpet “Winner’s Walk” that only Academy Award winners and tour participants get to take. All the while, our tour guide gave some inside stories from her years of working at the ceremony.

+

+Me standing where the presenters stand with a view of the audience behind me… the photos on chairs represent the A-list guests who sat there recently.

+

+Having exited stage left just like the Academy Award winners do, we are walking in their footsteps down the “Winner’s Walk.”

+

+This red carpet leads the winners to their press interview.

+

back to top

+
+
+

Santa Monica Beach at Sunset and Pier Burger

+

I made it back to Santa Monica for sunset at the beach.

+

+The view from Ocean Avenue

+

+Walking from the pier down to Santa Monica Beach

+

+Santa Monica Beach sunset

+

+Tourist be touristing… I gave in and ate an overpriced hamburger, fries, and strawberry milkshake at Pier Burger.

+

Video of walking to the Santa Monica Pier at sunset

+

Video of Santa Monica Beach at sunset

+

back to top

+
+
+
+

Saturday

+
+

Republique

+

I started Saturday by eating breakfast at a bakery/café called République in a building that Charlie Chaplin had built. République is owned by two chefs awarded a Michelin Star and a James Beards award and one of whom worked with Alain Ducasse of the Dorchester Collection, my old stomping grounds. A foodie colleague and friend Wooyong Ee recommended it. It was excellent.

+

Much of the building’s original architecture is intact, as seen in these photos. The restaurant floor appears to be in what was an open courtyard, with the arches still in existence. Imagine walking the same grounds as Charlie Chaplin. Mind blowing.

+

+Brownie, pumpkin spice danish, pain au chocolat, ham croissant

+

+Regular breakfast: bacon steak, fingerling potatoes, baguette, french butter, jam, eggs over hard

+

+République courtyard… a good view of the front of the original Charlie Chaplin building

+

+République front

+

back to top

+
+
+

Academy Museum of Motion Pictures

+

The Academy Museum of Motion Pictures had an extensive collection of photos, costumes, props, artifacts, and equipment that explored the various types of craft that go into movie making.

+

One large exhibit was devoted to the creation of The Godfather.

+

The museum also had a number of famous movie costumes and puppets. I particularly enjoyed the The Dark Crystal puppets. I hadn’t thought about that movie since I watched it as a child and was instantly transported back to childhood.

+

+The Godfather office

+

+The Godfather rehearsal horse head… not something you see everyday!

+

+Alien xenomorph

+

+The Dark Crystal’s Skeksis

+

+Terminator 2: Judgement Day animatronic… the team that created this won an Academy Award for Visual Effects

+

+Academy Award statues room

+

Video of the Academy Award statues room

+

back to top

+
+
+

Petersen Automotive Museum

+

Even though I am far from an expert in cars, with the Petersen Automotive Museum being just across the street from the Academy Museum of Motion pictures, I decided to give it a try.

+

A Lyft driver later pointed out to me that Notorious B.I.G. was shot at the intersection between the two museums. It’s incredible how many famous landmarks are “hiding in plain sight” in Los Angeles.

+

As suggested, I started on the third floor of the museum and worked my way down. The first floor was almost completely devoted to Tesla.

+

I regret not having added the basement “vault” tour to my ticket. It was more than I could do at the time. Perhaps I’ll go back sometime.

+

While I am sure there were more technically impressive classic cars there, the many Hollywood cars in the collection caught my eye.

+

+Thelma and Louise Car

+

+Thelma and Louise Car

+

+Thelma and Louise Car

+

+Back to the Future DeLorean

+

+Back to the Future flux capacitor!

+

back to top

+
+
+
+

Sunday

+
+

The Getty Center

+

The Getty Center experience was well worth the trip. The architecture, art, and views were all simply jaw dropping.

+

+The entrance hall

+

+One of the highlights of the collection: Vincent Van Gogh’s Irises

+

+Central Garden: a garden with an incredible view. I almost overlooked it. Fortunately, I came back a second time and ventured to the other side of the garden.

+

+Example of the beautiful architecture

+

Although I enjoyed the view of Los Angeles from the main Getty Center terrace, the consensus from locals was that the view from the The Griffith Observatory is much better.

+

Video of The Getty Center main terrace

+

Video of the Central Garden

+

Video walking through Central Garden

+

Video of a Getty Center fountain

+

Video of the ride down from The Getty Center

+

back to top

+
+
+

Tacos 1986 and Santa Monica Beach at Sunset

+

I grabbed some tacos and hurried to the Santa Monica Beach for some incredible sunset.

+

+Walking to the pier

+

+Tacos on the beach

+

+Sunset across the ocean

+

+The pier

+

Video of walking to Santa Monica Pier at sunset

+

Video of the Santa Monica beach at sunset

+

back to top

+
+
+
+

Monday

+
+

Republique

+

On my way to the Grammy Museum, I stopped at République again for breakfast. I regretted that I hadn’t ordered Shrimp and Grits (anson mills grits, calabrian chilies, pork belly sausage, hooks cheddar, fried egg) on Saturday, then realized that dish is only served at weekend brunch and wasn’t available on a Monday. I will have to go back sometime and try it.

+

I did have some absolutely incredible tasting granola. It was beautifully presented, and although some of the fruit was unfamiliar to me, it was bursting with flavor, and definitely in the running for the most delicious breakfast that I have ever eaten.

+

+Granola: straus organic yogurt, farmer’s market fruit, wildflower honey

+

back to top

+
+
+

The Grammy Museum

+

The Grammy Museum was small, but fun.

+

As suggested, I started on the third floor with the temporary Hip-Hop America exhibit. The exhibit was packed with memorabilia from Tupak Shakur, Flava Flav, Shock G., LL Cool J, Run-DMC, Grandmaster Flash, Wyclef Jean, Eminem, MCLite, Ceelo Green, Chuck D, and among many others.

+

My favorite part of the museum was the impressive collection of Michael Jackson memorabilia on the second floor, including an autographed Thriller jacket.

+

The museum also had temporary Shakira and The Roxy exhibits.

+

+A portion of the Michael Jackson collection, including autographed Thriller jacket

+

+Thriller Album of the Year nomination

+

+Grammy outfits worn by Taylor Swift, Harry Styles, Shania Twain, Lizzo, Olivia Rodrigo, and Samara Joy

+

back to top

+
+
+

The Cecil Hotel

+

I have been fascinated by true crime going back to childhood, when I started watching 48 Hours, my all-time favorite show.

+

While I was walking from the Grammy Museum to the to City Hall Observatory Deck, I stopped at Hotel Cecil along the way.

+

Hotel Cecil (a.k.a “Hotel Death”) was the subject of a Netflix documentary called Crime Scene: The Vanishing at the Cecil Hotel. The documentary focused on the case of Elisa Lam, a Canadian student suffering from bi-polar disease who drowned in a water tank on the roof. Members of the public crowd-sourced an investigation into what happened to Elisa. The hotel has a long history of murder, suicide, and unexplained deaths. In a strange twist, Richard Ramirez, a serial killer profiled in another Netflix documentary Night Stalker, stayed at Hotel Cecil.

+

+The hotel is shuttered with a “private property” sign on one door. There were a few people nearby. Not sure if they were workers or loitering.

+

+The infamous water tanks where Elisa Lam drowned… it was speculated that she might have taken the stairs on the front of the hotel to the roof.

+

Video of the Hotel Cecil

+

back to top

+
+
+

Downtown Los Angeles

+

While I was walking from the Grammy Museum to the to City Hall Observatory Deck, I walked to the edge of Skid Row. Having heard of Skid Row for years, I wanted to see it for myself. I walked by barbed wire, sidewalk tent encampments, homeless, and a mission providing social services.

+

Strangely, Skid Row is next to the Toy and Fashion Districts. I can’t get over the extreme opulence and poverty co-existing across Los Angeles.

+

+The homelessness in Los Angeles was a sad reality. A local told me it increased greatly due to the pandemic.

+

back to top

+
+
+

Los Angeles City Hall Observation Deck

+

I heard that the Los Angeles City Hall Observation Deck is one of the city’s best kept secrets, so I had to go. The building architecture was more fancy-schmancy than I expected. The observation deck triggered my fear of heights, so I didn’t stay long out there, but it was a great view!

+

+Fancy schmancy

+

+Riding in style

+

+This banquet room has doors that lead out to the observation deck.

+

+A view from one of the four sides

+

+A view from one of the four sides

+

Video of the view from the City Hall Observation Deck

+

back to top

+
+
+

Bruno’s Ristorante Italiano

+

After a few failed Google searches for restaurants in the area, I stumbled upon the absolute gem Bruno’s Ristorante Italiano

+

Oh boy, I wish I lived nearby so that I could eat there regularly. The fettucchine alfredo was the best that I’ve ever tasted. It arrived at the table fresh, hot, and authentic, with a generous half loaf of bread. I sat on the patio. The weather was perfect with a view of the pier. The waitstaff was kind and efficient. I returned before the trip was over.

+

+Fettuccine Alfredo with chicken… so good!

+

back to top

+
+
+
+

Tuesday

+
+

Universal Theme Park

+

Although I wanted to take the Universal Studios Tour, I was irked that I would have to buy an entire Universal Theme Park ticket to take it. After multiple people told me how fun the theme park is including a Lyft driver who said it’s the best, because you are “in the movies,” I decided to go. I know what she means now that I’ve experienced the incredible, immersive, 3-D experiences that included having water splashed on you. Anyhow, it’s not everyday that you have the chance to visit a theme park like that.

+

I guess I got my money’s worth for the studio tour alone. I went twice… riding on either side of the cart to get a good look at everything.

+

Having been an Alfred Hitchcock fan since I was a kid (I had probably read every Alfred Hitchcock Presents book at the Fredonia Public Library while I was still in grade school), I really enjoyed seeing the Bates Motel and mother’s house from Psycho.

+

I walked most of the park. It was fun, but geared more toward kids.

+

+Universal CityWalk

+

+Finally spotted a celebrity and even got a pic. Here I am with “Max” from The Grinch.

+

+Bates Motel from Psycho

+

+Mother’s house from Psycho

+

Video of the Universal sign

+

Video of 3-D King King experience, designed by Peter Jackson and team!

+

Video of the Jaws experience!

+

Video of Norman Bates

+

Video of “Wisteria Lane”

+

Video of a simulated flood

+ +

back to top

+
+
+

The Griffith Observatory

+

Although The Griffith Observatory museum was much smaller than I expected, the building was beautiful and had an amazing view.

+

+Entrance hall which includes a Foucault Pendulum

+

+What a view…

+

+Beautiful architecture…

+

Multiple Lyft drivers told me the view is “spectacular” after dark, but frankly, I was too tired to stay that long. I will go back sometime.

+

Video riding through the Hollywood Hills to The Griffith Observatory

+

Video of the view around The Griffith Observatory

+

Video of the Foucault Pendulum

+

back to top

+
+
+

Comedy in English

+

That night, I attended a comedy show for the first time. It was called Comedy in English and features comedians who have appeared on The Tonight Show, Conan, Comedy Central, and Netflix.

+

There were awkward, confrontational jokes, excruciating silences, and big laughs. What a raw exercise!

+

+The comedian before him was scream-y… this one was quiet and thoughtful. I thought he’d bomb, but he didn’t!

+

back to top

+
+
+
+

Wednesday

+
+

Hollywood Walk of Fame

+

Before the celebrity homes bus tour, I walked around Hollywood Boulevard again. I attempted to go to the Chaplin-Keaton-Lloyd Alley which I read about on the wonderful Atlas Obscura website, but it was closed off.

+

+Alfred Hitchcock’s star

+

+Hollywood Boulevard was closed to cars due to the Rebel Moon Premier

+

Video of the Rebel Moon Premier set up

+

back to top

+
+
+

Celebrity Homes Bus Tour

+

I went on a Celebrity Homes Bus Tour, and it was an absolute blast. I’ve never taken a bus tour like it before. I loved every minute. The tour guide Mark was so fun and knew all of the famous spots. We drove all around the Hollywood Hills and Bel Air looking at celebrity homes, through Beverly Hills, Rodeo Drive, West Hollywood, Sunset Strip, and Hollywood. Although I couldn’t verify the authenticity of every home afterward, I believe that Mark knew his stuff.

+

+Our tour guide Mark

+

+Pretty Woman balcony. Las Palmas Hotel, 1738 N Las Palmas Ave, Los Angeles, CA 90028

+

+Jack Nicholson’s house… that’s a tennis court on stilts!

+

+Leonardo DiCaprio’s house

+

Video of bus stopping for Hollywood Sign

+

Video driving past homes in Beverly Hills

+

Video of Rodeo Drive, part 1

+

Video of Rodeo Drive, part 2

+

back to top

+
+
+

Rodeo Drive

+

After the tour ended, I went back to Rodeo Drive and walked down the entire street taking pics.

+

+Dior

+

+Valentino

+

+Harry Winston

+

Video of Rodeo Drive Giorgio Armani storefront

+

back to top

+
+
+

Via Alloro

+

While I was on the celebrity home bus tour, we drove around Beverly Hills. As we drove past a restauraunt named Via Alloro just off of Rodeo Drive, the tour guide said it’s a major celebrity hotspot and that he’d seen Steven Spielberg there, among others. Someone on the bus asked if you had to be dressed up to go in. The tour guide said no, and that he’d had passengers literally call while on the bus and make a reservation.

+

After taking pics on Rodeo Drive, I decided to eat at Via Alloro. I knew if I didn’t, I’d regret that I hadn’t taken the opportunity to “rub shoulders” with the stars.

+

The prices were surprisingly reasonable and the food was delicious. It felt like a surprisingly normal experience. The waiter told me that they do have “too many” celebs around. Sometimes, everywhere you look. A quick google search reveals some of the many celebs.

+

I had the Fettuccini Boscaiola. Having never heard of this dish, I wasn’t quite sure what it would be like, but I thought it sounded good. It was delicious!

+

+Fettuccini Boscaiola: homemade fettuccini pasta with meat sauce, cream, green peas, mushrooms for $26.50

+

back to top

+
+
+

Bruno’s Ristorante Italiano

+

That night, I couldn’t resist returning to Bruno’s Ristorante Italiano for another meal. It was another hit.

+

+Spaghetti with meat sauce

+

I’ll be back.

+

back to top

+
+
+
+

Thursday

+
+

Ice at Santa Monica

+

If I hadn’t already done enough… I went ice skating for the first time!

+

I went to Ice at Santa Monica.

+

It was fun, and I skated for a good 30 minutes, but when another skater wiped out badly, I decided that I’d pushed my luck long enough and stopped. The rink workers said the skates weren’t great anyway, because they provided very little support. Nevertheless, I’m glad I tried it, and perhaps I’ll try again sometime.

+

+Santa Monica’s Ice skating rink

+

Video of ice skating

+

back to top

+
+
+

Mel’s Drive-In

+

I saw a Mel’s Drive-in at Universal Studios Theme Park and another one just off Hollywood Boulevard. Because I kept hearing about it so much, I decided to eat at one in Santa Monica. I later realized that I had Mel’s Drive-in mixed up with Mel’s Diner. Mel’s Drive-in was made famous by the movie American Graffiti. Mel’s Diner was a television show. Haha. Nevertheless, the chocolate milkshake was the best that I’ve ever had.

+

+Mel’s Drive-in counter

+

+The best chocolate milkshake that I’ve ever had.

+

Video at the counter in Mel’s Drive-in

+

back to top

+
+
+

End of Santa Monica Pier at Sunset

+

I made it back to Santa Monica Beach for one last sunset. It was a doozy.

+

+Ocean Avenue

+

+Love the strange vintage look of this beach landscape. It was facing the sunset.

+

+The sun setting beyond the end of the pier

+ +

+Venturing to the end of the pier for sunset…

+

+The rippling waves were like abstract art…

+

+The end of the pier… wow!

+

+Pink cityscape

+

+People watching

+

Video of Santa Monica Pier at sunset

+

Video of Santa Monica Pier at sunset

+

Video of the end of the pier at sunset

+

Video of Santa Monica Beach at sunset

+

Video of ferris wheel with Santa Claus

+

back to top

+
+ +
+

Santa Monica Promenade

+

+Christmas decorations

+

+Christmas decorations

+

back to top

+
+
+
+

Friday

+
+

Back to Kansas for Christmas

+

Bye bye, LA…

+

+Santa Monica, Venice, and Playa Del Rey Beaches, I believe

+

I made it home from Los Angeles with one last momento: bronchitis. I believe it was caused by the smog. Walking for miles over nine days and riding around in an open air bus for two hours couldn’t have helped.

+

back to top

+
+
+
+

Takeaways

+

I love San Diego’s thriving Little Italy. I love the plaza, with its beautiful, flowing fountain, live music, open air dining, and great restaurants surrounding it. I love the sight and sound of people enjoying the good things in life. I thought Santa Monica would be like this, but it wasn’t. I was shocked by the isolated, distributed feeling of Los Angeles. I did not feel a real sense of community anywhere.

+

Never have I been to a place where there is so much poverty and opulence co-existing. Never have I been to a place where there is so much pretending. People pretending by living above their means. The entertainment industry is pretending too. The things that look magical on screen look more ordinary in real life than I expected.

+

I’m not completely sure that I liked Los Angeles… yet, I can’t wait to go back. Haha.

+

For one thing, I’d like to go back for the food. I learned from my friend Wooyong that I should research the food before I arrive. Next time, I want to go to the great restaurants, not just restaurants that I find on the spur of the moment.

+

Things to do next time:

+
    +
  • Plan in advance to go to great restaurants

  • +
  • Take the Paramount Studio Tour (it was one too many studio tours for this trip)

  • +
  • Go to The Griffith Observatory at night

  • +
  • Take the scenic Coast Starlight train

  • +
  • Visit Redondo Beach and Santa Barbara

  • +
+

back to top

+
+
+

Warner Brothers Studio Tour versus Universal Studios Tour

+

The Warner Brothers tour guides immediately established their tour as “better” than Universal’s. Although it was lighthearted banter, I did detect a real hint of competition.

+
+

What Warner Brothers Had Going For It

+

The Warner Brothers tour was a personalized, small group experience. At the start of the tour, the tour guide asked us which Warner Brothers shows or movies we were fans of so that the tour could be tailored to our interests. During the guided part of the tour, we were all on one cart in close proximity to the tour guide and could ask questions as we went. We get off several times to tour city lots, a sound stage, residential street, and house.

+

There were multiple photo ops, including the Friends set, Big Bang Theory set, and Friends fountain.

+

Before and after the guided part of the tour, we had the opportunity to walk at our own pace through exhibits packed with incredible costumes, props, and immersive experiences.

+

I spent 3 hours on the Warner Brothers tour.

+

back to top

+
+
+

What Universal Studios Tour Had Going For It

+

In contrast, the Universal Studios tour consisted of one large group riding on a group of connected carts with a pre-recorded commentary by Jimmy Fallon. Although tour guides had the freedom to provide their own additional commentary, group members did not have the opportunity to ask questions or get off the cart to take a closer look.

+

However, the Universal Studios tour did include some very iconic backlots, and nothing at Warner Brothers compared to Universal’s immersive, 3-D experiences.

+

I spent approximately 45 minutes on the Universal Studios Tour.

+

back to top

+
+
+
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/objects.inv b/objects.inv new file mode 100644 index 00000000..3276ce76 Binary files /dev/null and b/objects.inv differ diff --git a/pinax-release-tutorial.html b/pinax-release-tutorial.html new file mode 100644 index 00000000..d2f72c6c --- /dev/null +++ b/pinax-release-tutorial.html @@ -0,0 +1,325 @@ + + + + + + + + Pinax Release Tutorial — Portfolio 0.1 documentation + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

Pinax Release Tutorial

+

Pinax has been a popular group of projects, apps, and themes for around 15 years and still has many users.

+

A request was made recently to add support for Django 4.0 and 4.1. I decided it’s time to create a new Pinax release plan. I’ve also created this tutorial to teach others how Pinax releases are done. Let’s get started!

+
+

TL;DR

+
    +
  • You will need to be able to install and access multiple Python interpreters locally

  • +
  • Determine which Python and Django versions to use

  • +
  • Using these Python and Django versions, create updated configurations for the CircleCI config.yml and tox.ini files

  • +
  • Clone a Pinax App repo locally, cd, and create a new branch

  • +
  • Update the CircleCI config.yml and tox.ini files in that Pinax App directory with the new configurations

  • +
  • Run tox

  • +
  • Fix the errors

  • +
  • When tox is successful, push your changes to GitHub

  • +
  • Open a pull request

  • +
  • When all of the updates are made to a Pinax App, the app release will be tagged

  • +
  • Then, a package will be created and published to PyPI

  • +
+
+
+

Background

+

Pinax includes a group of Django projects called Pinax Starter Projects that can be installed using Pinax CLI. These Pinax Starter Projects include relevant Pinax Apps that can be found in the Pinax GitHub organization or on PyPI via Pinax keyword search.

+

This tutorial will focus on app release.

+
+
+

Required Setup

+

In order to test code locally and make the updates required for the release, you will need to be able to access a Python interpreter for every version used in the release. The Pinax way of doing this is to install pyenv on a MacBook. This will enable you to install multiple versions of Python on your computer and make them globally available using the command:

+
$ pyenv global 3.10.0 3.9.0 3.8.0 3.7.0
+
+
+
+
+

Release Plan

+

I create a release plan for each release. This serves several purposes.

+
    +
  • It provides instructions for how to complete the release as it happens

  • +
  • It enables newcomers to contribute more easily to a release

  • +
  • It serves as a reference for future releases

  • +
+

Here is the WIP Pinax 22.12 Release Plan.

+
+
+

Why Do a New Release?

+

Pinax is based on the Django framework, which is based on the Python programming language. Like other software, Python and Django evolve over time. Features are added, bugs are fixed, and security flaws are patched. New releases of Python and Django are then published. By incorporating new versions of Python and Django into Pinax, Pinax can benefit from these new features, bug fixes, and security patches. This is done through a release. Pinax releases can also include new features, bug fixes, and security patches.

+
+
+

Knowing Which Versions of Python and Django to Include

+

We will want to use Python and Django versions that are being actively supported. For one thing, unsupported versions of Python and Django no longer receive security patches. It’s best to drop these versions and add new, supported versions.

+

In order to determine which versions of Python and Django are being actively supported, check out the Python downloads and Django downloads pages.

+

Current Python support schedule

+

+

Current Django support schedule

+

+

Not all versions of Python and Django are compatible together. In order to determine which Python and Django versions are compatible, check out the “What Python version can I use with Django?” section of the Django FAQs. This will help us create the test matrix and release documentation.

+

Python and Django compatibility

+

+

We now know that the Python 3.7, 3.8, 3.9, 3.10 and Django 3.2, 40, and 4.1 are supported.

+

Python 3.8, 3.9, and 3.10 are compatible with all versions of Django.

+

Python 3.7 is not compatible with Django 4.0 or 4.1.

+
+
+

Test Matrix Configurations

+

Once we know which Python and Django versions to use, we can create updated configurations for the CircleCI config.yml and tox.ini files that will be in each Pinax App repo. Although CircleCI and tox can be used together, it is primarily tox that we will be interested in for this tutorial, because it’s the tool we will use to update the code locally.

+

In addition to testing against Python and Django, Pinax tox configuration includes a few other tools to maintain code quality.

+

These tools are:

+
    +
  • Flake8: check your codebase style and complexity

  • +
  • Black (being added in this release): check your codebase style and reformat in place

  • +
  • isort: sort Django imports

  • +
  • Coverage: measures the percentage of code per file that is covered by tests

  • +
+

Invariably, these other tools will have had new releases of their own between Pinax releases. As a result, additional changes will need to be made to the configuration. For some examples, check out the WIP Pinax 22.12 Release Plan.

+
+
+

Running the Test Matrix Locally Using tox

+

Once the configurations are documented, we will be able to clone a Pinax App repo, update its CircleCI config.yml and tox.ini files, run tox, then fix the errors that result from the incompatibility between the existing code and the new Python and Django versions we are testing against.

+

Clone the repo using the command line tool of your choice

+
$ git clone https://github.com/pinax/pinax-messages
+
+
+

Change directory

+
$ cd pinax-messages
+
+
+

Run the tox test matrix using the Makefile

+
$ Make
+
+
+

Alternatively, run tox directly

+
$ tox
+
+
+
+
+

tox Test Environments

+

Pinax tox configuration includes several test environments that it will run.

+
[tox]
+envlist =
+    checkqa,
+    py{37}-dj{32}
+    py{38, 39, 310}-dj{32, 40, 41}
+
+
+

The first one, called checkqa, runs the formatting tools Flake8, Black, and isort.

+

A special [testenv:checkqa] configuration specifies which version of each tool tox should use and the commands needed to run each one. Instead of running the tools ourselves manually via the command line, tox will run them as it executes.

+

Here, it’s specified that Flake8 and Black will run in the pinax directory. The isort --check-only and --diff flags indicate proposed changes should be outputted in the terminal, rather than the files being modified. The isort --settings-path is explicitly set. For more information about isort options, see the isort Configuration Options page.

+
[testenv:checkqa]
+commands =
+    flake8 pinax
+    isort --check-only --diff pinax --settings-path tox.ini
+    black pinax
+deps =
+    flake8 == 5.0.4
+    flake8-quotes == 3.3.1
+    isort == 5.10.01
+    black == 22.8.0
+
+
+

Separate [flake8] and [isort] configurations document choices specific to Pinax such as which tool formatting rules to ignore.

+

Here, it’s specified that tox should ignore the default Flake8 rules that a colon should not have a space before it, that a block comment should have a space before the pound sign and comment, that there is no need for backslashes between brackets, and that a line break should occur before a binary operator. max-line-length can be up to 100 characters, rather than the 79 suggested by PEP 8. max-complexity can be up to 10 (more than 10 is believed to be too complex). Migrations files should be excluded from formatting. inline-quotes should be double, not single.

+
[flake8]
+ignore = E203,E265,E501,W504
+max-line-length = 100
+max-complexity = 10
+exclude = **/*/migrations/*
+inline-quotes = double
+
+
+

multi_line_output should be formatted as a vertical hanging indent.

+
[isort]
+multi_line_output=3
+known_django=django
+known_third_party=appconf,pinax
+sections=FUTURE,STDLIB,DJANGO,THIRDPARTY,FIRSTPARTY,LOCALFOLDER
+include_trailing_comma=True
+skip_glob=**/*/migrations/*
+
+
+

After checkqa is finished running, tox will iterate through each Python/Django combination, creating an environment to test that combination.

+

tox environments created within the Pinax App directory .tox folder

+

+

This will include a coverage report for each combination.

+
[testenv]
+passenv = CI CIRCLECI CIRCLE_*
+deps =
+    coverage==6.5.0
+    codecov
+    dj32: Django>=3.2,<4.0
+    dj40: Django>=4.0,<4.1
+    dj41: Django>=4.1,<4.2
+    master: https://github.com/django/django/tarball/master
+
+
+

Separate [coverage:run] and [coverage:report] configurations document coverage choices specific to Pinax.

+

Here, it is specified that coverage should run in the pinax directory. conf.py, tests, migrations, and admin.py folders and files should be ignored.

+
[coverage:run]
+source = pinax
+omit = **/*/conf.py,**/*/tests/*,**/*/migrations/*,**/*/admin.py
+branch = true
+data_file = .coverage
+
+
+

conf.py, tests, migrations, and admin.py folders and files should be ignored. The --show-missing flag indicates that the report should show the file line numbers missing coverage.

+
[coverage:report]
+omit = **/*/conf.py,**/*/tests/*,**/*/migrations/*,**/*/admin.py
+exclude_lines =
+    coverage: omit
+show_missing = True
+
+
+
+
+

tox Output

+

When checkqa runs, tox will output any formatting errors in the terminal.

+

For each Python/Django combination, tox will output the incompability errors.

+

tox will show one error at a time. Fix that error, and rerun tox.

+

If needed, refer to the Django 3.2 release notes, Django 4.0 release notes, and Django 4.1 release notes for more info about the changes made in those releases. Google and Stack Overflow can also help.

+

To see some example errors, check out the WIP Pinax 22.12 Release Plan.

+

Once all of the errors are fixed, tox will show all green.

+

tox success! :)

+

+
+
+

Coverage Report

+

For each Python/Django combination, tox will also show a coverage report. The report will show the percentage of coverage for each file. Files with 100% coverage will be ignored.

+

Example coverage report

+

+
+
+

CircleCI

+
+
+

Tagging and Publishing

+
+
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/pycon-us-2019-recap.html b/pycon-us-2019-recap.html new file mode 100644 index 00000000..339e57eb --- /dev/null +++ b/pycon-us-2019-recap.html @@ -0,0 +1,238 @@ + + + + + + + + PyCon US 2019 Recap — Portfolio 0.1 documentation + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

PyCon US 2019 Recap

+

Published June 1, 2019

+
+

Description

+

PyCon US 2019 took place at Huntington Convention Center in downtown Cleveland, Ohio from May 1-10. Eldarion’s Katherine Michel wrote about what it was like to experience PyCon US for the first time!

+
+
+

Blog Post

+

+

Cleveland script sign at Edgewater Park, with a lovely view of downtown Cleveland as a backdrop; photo credit: Katherine Michel

+

This was my first PyCon and I had a blast! It was one of the most fun and inspiring experiences of my life.

+

While PyCon 2018 was going on, I regretted not having gone when I realized via Twitter that many of the Pythonistas I had been getting to know were there. I was kicking myself for missing the chance to connect with them. So, I was thrilled to have the opportunity to go to PyCon US 2019.

+

Perhaps because of my FOMO in 2018, I didn’t want to have any regrets after PyCon US 2019 and I don’t. I both challenged and enjoyed myself to the max. I returned home having made many new friends, (including people I have long admired), learned new things, and found new ideas for Pinax, an open source ecosystem of Django starter projects and apps that I help maintain.

+
+
+

Getting Ready

+

Even though I didn’t know what to expect at PyCon, I knew there would be more going on than I could do. So ahead of time, I did some prioritizing that helped me make the most of my time, without doing too much:

+
    +
  • I made a schedule of the talks and events that I was most interested in attending.

  • +
  • I made a list of people with whom I wanted to reconnect or meet for the first time.

  • +
  • And I chose three sights around Cleveland that were a priority to see.

  • +
+
+
+

It’s Going to Be Great

+

As people began to tweet that they were on their way to Cleveland, the anticipation began to build. Kushal Das tweeted that SFO was filling up for PyCon, including the BDFL Guido van Rossum! I replied, “I’m getting so excited!” I was gobsmacked when Guido then followed me on Twitter. I immediately felt quite welcome and certain that I would have a great PyCon!

+

+

My tweet after being followed on Twitter by Guido

+
+
+

Thursday

+

I arrived in Cleveland on Thursday, around noon. I headed to the conference floor to register and see what was going on. Quite a few conference-goers were mingling in the hallway. It was an advantage for me that I had gone to smaller, regional Python conferences before PyCon. I immediately saw some friends I’ve made through DjangoCon US and PyGotham and was excited to see them. I also immediately began to see people I had hoped to meet for the first time and chatted with them. The atmosphere was upbeat and everyone was super friendly. A group of us walked to nearby Mabel’s BBQ. The food was delicious.

+

When we returned to the convention center, I decided to join the swag stuffing line. I was surprised to meet Larry Hastings and Paul Hildebrandt there and began to realize that I was going to stumble across people I admire everywhere I went! While taking a break from swag stuffing, I also chatted with some Bloomberg friends I’d met through PyGotham, including being given an impromptu black hole simulation made using Python by Pablo Galindo Salgado. Very cool and timely!

+

The Opening Reception started at 5:30 pm in the Exhibit Hall. I’d never seen anything quite like the Exhibit Hall in real life, only on television! It was an industrial-size space filled with row after row of booths. Conference-goers ate, networked, and walked around chatting to sponsors and picking up swag. I saw Guido there for the first time and said hello! I was thrilled to meet him. Throughout the week, it became rather normal to see him around, chatting and working. I began to think of him more as a human being, not just a famous tech person.

+
+
+

Friday

+

The main conference kicked off on Friday, with an impressive keynote by Dr. Russell Keith-Magee about Python black swans. I had come across some of the ideas in his talk before. I was amazed at how he wove them into one coherent theme, often using masterful storytelling. I felt inspired to become a better public speaker by finding connections between ideas and improving my storytelling skills.

+

That morning, I began fulfilling one of my goals as a DEFNA Board Member. DEFNA is the Django Events Foundation North America. We oversee DjangoCon US and facilitate outreach and local events across all of North America, including Canada, the U.S., Mexico, and a number of other countries and territories. I represented DEFNA at the PyCon Charlas. I’m thrilled that throughout the week I got to know many members of the Mexican and Latin American communities who can benefit from DEFNA’s services.

+

+

Tweets in Español and English for DEFNA representation at PyCon Charlas

+

+

Me and Joel Rivera with the PyLatam Logo

+

On Friday evening, I attended the Art of Python, a mini arts festival that is part of the PyCon Hatchery Program. The performances were funny and thought-provoking. I’m glad I went.

+
+
+

Saturday

+

Saturday kicked off with two very special keynotes by Shadeed “Sha” Wallace-Stepter and Jessica McKellar.

+

Sha told the story of his troubled childhood in San Francisco. He turned to street crime for a feeling of empowerment. It was only after he was sent to prison for 27 years that he realized the same skills that he had used on the street could be channeled into entrepreneurship and tech. After producing a vast body of journalistic content while in prison, his sentence was commuted. Sha said that open source is “love.” Open source accepts people like him. He received a standing ovation. I was proud to see the community embrace someone who could easily be rejected elsewhere.

+

Jessica McKellar’s keynote was a call to action to the Python community to help break the cycle of incarceration and help former inmates re-integrate. She is a powerful voice for change. You might remember that under Jessica’s leadership as PyCon US Diversity Chair, talk gender diversity rose from 1% to 40% in just a few years. I’m glad that after Jessica’s talk I had the chance to personally thank her for that and also thank Chris Neugebauer for making it a priority as a PSF Director to tie PSF event support to diversity and inclusion targets.

+

Later that morning, I spent as much time as I could at the Maintainer’s Summit. Thanks to my time as Pinax Maintainer and DjangoCon US Website Chair, I felt right at home. I especially enjoyed the table discussion I took part in where we shared our approaches in some of the practical aspects of maintaining projects. Other maintainers and I had faced many of the same challenges. I hope to attend another summit like this sometime.

+

On Saturday afternoon, even though I hadn’t had time to check out the Open Spaces board, I’m quite pleased to say I ended up at an open space for chocolate! A friend alerted me to the open space as it was going on and of course, as a chocolate lover, I couldn’t resist immediately heading there to sample some.

+

+

A selection of chocolate on the table at the Chocolate Open Space; photo credit: Katherine Michel

+

After the Chocolate Open Space I spent time as a volunteer at the PyLadies Booth. I hadn’t realized how many people I would meet as a booth volunteer! It was a lot of fun and I highly recommend it. So many people came up to the booth to pick up stickers, buy t-shirts, ask questions about PyLadies, and inquire about PyLadies Auction tickets. Fortunately and unfortunately, the PyLadies Auction tickets were sold out. Although I hated to turn people away, it was great to see an abundance of support for PyLadies.

+

Incredibly, I also randomly met one of the original Pinax authors at the PyLadies Booth! It was a pleasure to chat with Jannis Leidel about the early days of Pinax. I have some new insight into the history of the Pinax ecosystem now. He also gave me some input for our next release.

+

After I was finished at the booth, I attended the PyLadies Auction. The auction took place at 6:30 pm in a ballroom in the Hilton Hotel connected to the Huntington Convention Center. The atmosphere was filled with good will and humor. A highlight was seeing the smile on Guido’s face after a portrait of him went for the highest ever bid. I really appreciate that he proactively supports underrepresented people.

+

Another highlight of PyCon for me was meeting Dr. Naomi Ceder, Lorena Mesa, Jackie Kazil, Katie Cunningham, and Lynn Root, all of whom play an important role in the PyLadies Auction and in promoting diversity in the Python community.

+

+

The portrait of Guido being carried around by PyLadies; photo credit: Katherine Michel

+
+
+

Sunday

+

On Sunday, I attended the PyLadies Lunch. The lunch was a time to meet in a fun, relaxed atmosphere to network and share common experiences. Throughout the lunch, women went to the front of the room and shared things they had done that they were proud of. Too often, women downplay their accomplishments. This was a time to celebrate ourselves and applaud one another!

+

After the PyLadies Lunch, I walked from the convention center a few blocks to take a 30 minute self-guided tour of the Terminal Tower Observation Deck. When I was researching the sights around Cleveland, I’d had a hunch that I would enjoy seeing the Cleveland skyline from the top of this famous landmark and I did!

+

+

Cleveland skyline as seen from the Terminal Tower Observation Deck; photo credit: Katherine Michel

+
+
+

Development Sprints and More Sight Seeing

+

The main conference ended on Sunday and the Development Sprints began on Monday.

+

After several overcast days, the sun finally came out on Monday morning. Even though I would miss a bit of sprinting, I decided to take advantage of the nice weather and visit one of the sight seeing spots I had chosen, Edgewater Park along Lake Erie. Having lived in Kansas most of my life, it’s always a pleasure to enjoy a beach and something I make a priority.

+

+

A peaceful scene at Edgewater Park; photo credit: Katherine Michel

+

Back at the sprints, I spent time in the CPython Sprint. I remember back to the 2016 PyLadies tweet that led Mariatta to become a CPython Core Developer. She’s one of my heroes and I love having the chance to see her in person!

+

+

Mariatta and I taking a selfie for her self-care Selfie Sprint!

+

Throughout the week, I had the chance to meet a number of CPython and Django Core Devs for the first time, including Cheryl Sabella and Emily Morehouse-Valcarcel. I’m particularly excited to see the rapid progress happening in CPython gender diversity now that it’s a priority.

+

On my last full day of PyCon, I left the sprints to spend a large part of the day at the Rock and Roll Hall of Fame Museum. The museum has an incredible collection of rock and roll memorabilia and I highly recommend going, if you get the chance. A few of my favorite items were John Lennon and Paul McCartney’s In My Life handwritten lyrics and Hey Jude descriptive score, Elvis Presley’s gold lamé suit, and Michael Jackson’s Dangerous Tour “Billie Jean” glove.

+

+

The Beatles Exhibit at the Rock and Roll Hall of Fame Museum; photo credit; Katherine Michel

+

On Wednesday, my last evening in Cleveland, being invited to eat at Flannery’s Irish Pub with a group of CPython Core Devs and other Pythonistas was a wonderful way to end a magical week.

+
+
+

It’s Not the End

+

A few things really surprised me about PyCon.

+

Firstly, although the crowd at PyCon was huge, it still had the same warm feeling of a small conference for me. Secondly, I had found everyone, including the most accomplished CPython Core Devs and Pythonistas, to be extremely kind and encouraging. I left feeling as inspired as ever. Thirdly, I found myself naturally chatting with the authors and maintainers of code important to Pinax and me. This brought some unexpected clarification to my work. Next time, I will plan ahead to do more of this!

+

Also, I found the planning I had done in advance of PyCon to have been very helpful. Nevermind that by the end of the week, I had walked and stood so much, I had a blister on my foot to prove it! I made it to the talks and events that were the highest priority for me. I chatted with nearly everyone I had wanted to reconnect with or meet for the first time, plus many more. And I had seen the sights most important to me in Cleveland.

+

I met so many people that I created a Twitter list to keep track of as many of them as I could find. I borrowed this idea from Trey Hunner, who also happens to have written a wonderful blog post How to Have a Great First PyCon. By the way, if I met you at PyCon and you’re not in my Twitter list, please let me know, so I can add you! I want to build on the new relationships I formed and when I attend PyCon in the future, grow my network even more. I’m also making my way through talk videos I missed due to the “hallway track” and finding more insights to apply to our next major Pinax release.

+

A special thank you to PyCon Chair Ernest Durbin III and the many other people who made PyCon US 2019 happen. I can’t wait to go again!

+
+
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/pycon-us-2024-recap.html b/pycon-us-2024-recap.html new file mode 100644 index 00000000..b76adcef --- /dev/null +++ b/pycon-us-2024-recap.html @@ -0,0 +1,855 @@ + + + + + + + + PyCon US 2024 Recap — Portfolio 0.1 documentation + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

PyCon US 2024 Recap

+
+

Table of Contents

+ +
+
+

Intro

+

Disclaimer: the content of this post is a reflection of my career journey and not specific to my work at JPMorgan Chase & Co.

+

PyCon US 2024 was truly incredible. If you ever have the chance to attend, I highly recommend it.

+

I am thankful for and proud of my friend Mariatta (PyCon US Chair) who oversaw it.

+

This was my second time attending an in-person PyCon US. My first one was in 2019. I remember being awestruck by the ocean of people. I was glad that I had already attended DjangoCon US and some regional conferences. I recognized some people in the crowd, and it made it feel like a smaller event.

+

This time, I was better prepared. I knew what to expect and leveraged my time better, all while having a ton of fun.

+

🔝 back to top

+
+
+

Wednesday

+
+

Sightseeing Downtown

+

I arrived on Wednesday, settled in, and immediately took some time to see the David L. Lawrence Convention Center and the downtown.

+

This was my first time in Pittsburgh, and I didn’t know what to expect. Downtown Pittsburgh, with its many steel bridges and brick buildings surrounded by riverfront, was a surprisingly gorgeous scene.

+

+David L. Lawrence Convention Center Rooftop Terrace

+

+10th Street Water Feature

+

🔝 back to top

+
+
+

Allegheny Riverfront

+

+Standing on a bridge on the Allegheny River with a view of the downtown and one of the many other bridges

+

🔝 back to top

+
+
+

Fig and Ash

+

After a busy day, I was tempted to get some cheap takeaway for supper, but I thought twice, and decided I should enjoy the best this city has to offer. So, I googled “best restaurant in Pittsburgh.” The top result was Fig & Ash, a short walk away. I went there and had an incredible meal.

+

+Spaghetti with Maine lobster cream, crab, nantucket bay scallops, arugula

+

+A piping hot cast iron Kahlua fudge brownie with coffee ice cream and sea salt for dessert

+

🔝 back to top

+
+
+
+

Thursday

+

I took the day off to sightsee.

+

As I was walking down the riverfront, I saw a man taking photos. He looked familiar. I was pretty sure we had been following each other on social media for a while. I couldn’t resist approaching him. It was Peter Wang (Anaconda Co-founder). It was really fun to meet him, and I found out that he and my friend Andy Fundinger had been consultants at JPMorgan Chase years ago.

+

🔝 back to top

+
+

Noticeable Sightings at the Conference Center

+

I couldn’t resist stopping at the convention center to see what was going on.

+

Once inside, I soon saw Guido van Rossum (Python Creator and BDFL) walking nearby. He sat down next to me, and I had the chance to chat with him about life and work. I thanked him for spending the time, and he thanked me. I’ve had the chance to spend time with him at three conferences now, and it’s always fun. The Python community is lucky to have a BDFL who actively engages with us and cares.

+

I was thrilled to catch up with some of my DjangoCon US friends: Afi Gbagado (DjangoCon US), Abigail Mesrenyame Dogbe (Technology Chief of Staff and Open Source Founder), Noah Alorwu (Marygold and Co.), Felipe de Morais (AfroPython), Jeff Triplett (RevSys, DEFNA Board Member), Eric Matthes (Author of Python Crash Course), and Trey Hunner (Python Trainer, Python Morsels). I made a new friend Amanda Viera (AfroPython).

+

+Me and Abigail Mesrenyame Dogbe

+

As usual, Trey had an interesting gaggle of people around him that included Marie Roald and Yngve Mardal Moe (Turtle Thread) and Rodrigo Girão Serrão (Python Math Teacher).

+

It was good to chat with Mason Eggers (PyTexas Chair), Kevin Horn (Dallas Fortworth Pythoneers Co-founder and PyTexas Organizer), Josh Schneider (PyTexas Organizer), Andy Fundinger (Bloomberg), and Heather Crawford (Bloomberg) again so soon after seeing them at the wonderful PyTexas conference I attended in April. Andy and I first met at PyGotham, another one of my favorite conferences.

+

Inspired by Andy, Mason and I later talked PyTexas sponsorships.

+

Although they were hard at work, I also got to see Deb Nicholson (Python Software Foundation Executive Director) for the first time again since DjangoCon US 2023, Ee Durbin (PSF Director of Infrastructure), Christopher Ngeuebauer (PSF Board Member), and Mariatta. :)

+

🔝 back to top

+
+
+

Andy Warhol Museum

+

On the way to the Andy Warhol Museum, I saw my friend Andy Knight (Automation Panda), and we walked there together. Andy had given a tutorial “def test_crash_course_with_pytest():”.

+

+Andy wearing an Andy Warhol-inspired shirt

+

+A favorite from the Andy Warhol Museum

+

🔝 back to top

+
+
+

Heinz History Center

+

When I heard that the Heinz History Center has the Mister Rogers set, I had to go.

+

+Mr. Rogers Neighborhood set

+

🔝 back to top

+
+
+

Duquesne Incline

+

I had all of my travel plans in place to attend PyCon US 2020 in Pittsburgh and planned to ride the Duquesne Incline, but the in-person conference was canceled due to Covid. I finally had the chance to ride it!

+

+View from the station at the bottom

+

+View from the Duquesne Incline Observation Deck

+

🔝 back to top

+
+
+

Opening Reception at the Expo Hall

+

I gave my first conference talk at the first conference I ever attended. It was DjangoCon US 2017 in Spokane, Washington. I distinctly remember that Roger Masse (United States Senate) and Mark Lavin (Nvidia) attended my talk. At the PyCon US 2024 opening reception, while catching up with Jon Banafato (PyGotham Chair), I saw Mark walking by and couldn’t resist stopping him to introduce myself and thank him years later for going to my first talk. :)

+

After years of following each other on social media, it was wonderful to meet Anthony Shaw (Microsoft) in person. Along with Iqbal Abdullah (LaLoka Labs, PyCon JP), we talked about the CPython Internals book Anthony wrote and my desire to understand CPython better. Anthony later suggested that I submit to the CfP next year, and I have to admit that it’s tempting.

+

It was a pleasure to chat with Simon Willison (Django Co-founder) again briefly before he left to work on his keynote. I knew he would nail it.

+

I got to hang out with Meagan Voss (Wagtail) and Nic James (DjangoCon US 2019 Chair) and talk about our work.

+

It was so good to see my friend Jess Garson (Elastic, formerly Twitter) at the Elastic booth and meet Philip Krenn (Elastic). Jess and I first met at PyGotham 2019, and she introduced me to many aspects of the Twitter Developer Program. :)

+

The night finished with a bear hug from Carol Willing (CPython Core Developer, Python Steering Committee) who told me I am awesome. :)

+

+Expo Hall in full swing

+

🔝 back to top

+
+
+

Expo Hall Booths Thursday and Friday

+

In the Expo hall, I did a tour of database companies and other fun tools.

+

At Datadog booth, Julian Levi Hernandez (Datadog, formerly CockroachDB) gave me a demo of a dashboard using Cockroach audit logs to further drill down into metrics.

+

At the Edge DB booth, Yury Selivanov (Edge DB Co-founder) told me that Django will be supported in a few months and showed me the impressive performance improvement created by Edge DB. Looking forward to learning more!

+

At the Oracle booth, Gary Brenner (Oracle Senior Cloud Engineer) told me about Oracle Cloud and self-managing Oracle databases.

+

At MongoDB booth, I caught up with my friend Mark Smith (MongoDB) and obtained some learning resources from Rita Rodrigues (Director of Developer Relations at MongoDB).

+

At Snowflake booth, I learned about Snowflake Quickstarts and using Snowflake tasks for orchestration.

+

At the Crunch Data booth, I met Elizabeth Garrett Christensen. I know of Elizabeth through the talks she has given at DjangoCon US: “How to Be a Postgres DBA in a Pinch” and “Postgres Performance: From Slow to Pro”. Crunch Data provides Enterprise PostgreSQL support, including fully managed Postgres as a Service.

+

As a fellow Lawrence native, Elizabeth seems to be hoping for a Lawrence Django conference as much as I am. :) I missed the Lawrence Technology Conference this year, but hope to make it next year at least, if there is one.

+

At the PostgreSQL community booth, I obtained some learning resources, including a paper version of PostgreSQL FAQs.

+

At the Coiled booth, I learned about using Dask for parallel computing. Dask was a projects cited in the Measuring the performance of CPython.

+

+EdgeDB, Oracle, Dask, Streamlit socks, MongoDB socks?

+

🔝 back to top

+
+
+
+

Friday

+
+

Breakfast

+

At breakfast, I met Loren Crary (PSF) for the first time after following each other on social media for quite some time and saw Al Sweigart (Author of Automate the Boring Stuff with Python), one of my favorite authors and presenters, again. I also finally met Tania Allard (Quansight, formerly Microsoft) and learned more about her work, including consulting at JPMorgan Chase. It was a pleasure to meet Daniel Graham (SauceLabs) and Jing Cao (National Microbiome Data Collaborative), too.

+

🔝 back to top

+
+
+

K. Jay Miller Keynote

+

Jay knows two staff developer advocates who are Black and he is one of them. When he sees another Black developer on stage, it’s not just another Pythonista.

+

Jay talked about beautiful moments from DjangoCon US 2023 in Durham, North Carolina: Black leaders, from all around the world, getting on stage, getting in front of their booths. They showed up and showed out for who they were.

+

+Black Python Devs at DjangoCon US 2023

+

Jay was happy to not be the first Black person keynoting PyCon US. But, at PyCon US 2022, Jay counted only 12 Black people among thousands. He talked to them. They had to have a reason to be there. He thought of the keynoters who came before him. They came, they spoke, they left. He wondered if “the juice wasn’t worth the squeeze.”

+

Many people go to conferences to hang out with their friends. If you don’t have that kind of experience, there’s no reason to attend.

+

Jay asked, how do we get more black people to experience the PyCon community, build friendship, and become repeat attendees?

+

Jay decided to create something that would serve as a Wakanda for Black Python devs. Something that would be worth staying for. It’s called Black Python Devs.

+

Jay listened to people in the community who had experience running non-profits, starting communities, running conferences: Marlene, Dawn, Kojo. He needed to make the community safe, equitable, accessible. This goes beyond a code of conduct to issues that Black people think about everyday like physical safety in public. He also wants to prevent burnout.

+

Jay started working behind the scenes to get as many Black people as possible to PyCon US 2023. There were 3x more than in 2022. They were able to be in the same room together and talk about the experiences they have as Black Python devs that others can’t comprehend, not about how to increase diversity.

+

+3x attendance at PyCon US 2022

+

Five members launched a discord. There are 427 members now. Their only plan was to be there for each other.

+

They are now officially a non-profit powered by the GNOME Foundation.

+

The leadership model is “diversity by inclusion.” Global leaders are represented at the table: from many countries, speaking different languages, 50/50 gender parity. It’s members are people who are already around you in PSF, DFS, Djangonauts, Pylades, DjangoGirls. Because the community came from Africa, its leaders do too.

+

“Your reach may extend beyond your grasp.” Kojo Idressa

+

The Python community can extend the reach further and Black Python Devs can help change perceptions in communities.

+

A few examples of solidarity

+
    +
  • Facilitating four leaders traveling to their first PyCon US

  • +
  • Converting community sponsorship into tickets for first time attendees who are Black Python Devs members

  • +
  • Providing 75 student tickets to Python Nigeria

  • +
  • Convening leaders from across the globe at conference lunchtime to help understand the situation happening in Africa and what could be done to assist

  • +
  • Helped Vice Chair Velda Kiara on stage when her laptop didn’t work

  • +
  • Supporting a Django Girls event that gave not just Black women devs, but Black girls a wonderful first interaction with the Python community

  • +
+

“Say it loud.” Everything they do is out in the open, proudly showing up for each other, saying, we’ve got this, and celebrating.

+

Black Python devs had a goal of sponsoring seven local conferences in Black communities and hoped to raise $5,000 at PyCon US. They raised over $15,300 from 282 donations.

+

Things you can do to help

+
    +
  • Donate money

  • +
  • Donate time, mentor

  • +
  • Connect with Black Python Devs

  • +
  • Open doors, have conversations, make connections

  • +
+

🔝 back to top

+
+
+

Hallway Track and Expo Hall

+

At PyCon US 2019, Pablo Galindo Salgado (CPython Release Manager, Bloomberg) was one of the first people I met as a wide-eyed newcomer. It was the Thursday night before the conference talks began, and I was at the conference hall for the swag stuffing, which is a great place to meet people. Scientists had recently photographed a black hole for the first time. Pablo, a physicist, invited me to a table nearby where he demoed some Python astronomy software for me. I later met Barry Warsaw (Python Steering Committee, Nvidia) at the sprints and talked to him about my career. At the time, I was a part-time open source maintainer of Pinax.

+

I saw Pablo and Barry together at the PyCon US 2024 Opening Reception. It was wonderful to be able to share with them five years later how my career has taken off.

+

It was great to see Andrew Godwin (Django Async Architecture) and Dave Forgac (PyOhio) again.

+

I had the chance to say hello to Sarah Kuchinsky (PyCon US Organizer) for the first time since PyCon US 2019. She was recently the technical reviewer for Al Sweigart’s great book about recursion called “The Recursive Book of Recursion”. I really enjoyed it!

+

I found out that Julia Ferraioli (AWS Open Source) was at the conference. I was ecstatic and hurried over to meet her. I had hoped to meet Julia in person for years. In March of 2021, I reached the final round of a Twitter Open Source Program Manager interview process. I was disappointed when I was not offered the job, but later found out that I had been considered alongside Julie and was honored. In a twist of fate, in August of 2022, Julia kindly met with me via Zoom and gave me excellent career advice.

+

It was also a pleasure to meet Brianne Wilhelmi (Springboard) and Aaron Clark (Hamilton Beach) at lunch, and see Ashia Zawaduk (Muck Rack) again after PyCascades 2020.

+

🔝 back to top

+
+
+

Photos and Tea

+

Earlier this year, I created a page of favorite conference snapshots. Benedict Kofi Amofah (Python Ghana, DjangoCon US) tweeted to me that he’d be in the gallery soon. I took him up on it. :)

+

+Me and Benedict

+

Abdur-Rahmaan Janhangeer (Python Usergroup of Mauritius (PyMUG)) and I have been following each other on social media for quite some time, but I didn’t know what he looked like. Fortunately, he found me and gave me a wonderful gift of Chartreuse tea, the best selling tea in Mauritius. Thank you!

+

+Chartreuse Tea!

+

🔝 back to top

+
+
+

Condado Tacos

+

After my incredible meal on Thursday night at Fig and Ash, I wanted to do something simple for supper. Based on a tip from another conference attendee, I ended up across the street from the convention center at Condado Tacos. The food was pretty good, but the best part was sitting and chatting with Bloomberg Python Trainers Heather Crawford and Scott Irwin. I met Scott at PyGotham 2018 where I attended a talk he gave “Dataclasses are here. Now what?”. I met Heather at PyTexas 2024 where she did an awesome talk “Python Code Versus Pythonic Code: What Experienced Developers Find Challenging About Learning Python”, which she also gave at PyCon US.

+

🔝 back to top

+
+
+
+

Saturday

+
+

Breakfast

+

Koushik Krishnan (Microsoft Azure Cosmos DB Engineer) gave his talk “Rest Easy with Jupyrest: Deploy notebooks as web services” at PyTexas. When I saw during the talk that he works on Microsoft Azure Cosmo DB, I was keen to meet him and did. He gave the talk at PyCon US too. It was a pleasure to have the chance to chat with him about different databases over breakfast. I also had the chance to promote Bar Camp Philly, organized by Tim Allen and now Dawn Wages’ wife.

+

🔝 back to top

+
+
+

Simon Willison Keynote

+

Simon talked about Large Language Models such as Chat GPT, Google Gemini, Claude, and Llama.

+

He does not think of them as Artificial Intelligence. He thinks of them as Imitation Intelligence. They predict the next word in a sentence. When they get good at that, it’s spooky what they can do. He acknowledged that they are flawed, but just because a tool is flawed, doesn’t mean it’s not useful.

+

When evaluating a new technology, Simon asks, what can I build with this that I couldn’t have built with it before? LLMs open up new options unlike anything he has ever seen.

+

How can we tell which of these models works best? Vibes. Simon recommends using LMSYS Org Chatbot Arena. You vote on which model gave the best response to a prompt, then they are scored using Elo rating system. Simon is relieved, because “openly” licensed models are beginning to rank.

+

LLMs can be run on smartphones now, even with no internet connection. An app called MLC Chat will give you access to Mistral, one of the best openly licensed models.

+

Simon has deep respect for what is known as prompt engineering. It’s not easy to get LLMs to do what you want them to do. Building something simple is easy. Building something production ready can take months and is much harder than people expect.

+

A few tricks

+
    +
  • Chat prompting

  • +
  • Retrieval Augmented Generate (RAG)

  • +
  • Function calling (“tools”) in a loop

  • +
+

Simon coined the term “Prompt Injection” after SQL Injection. He believes that we are not seeing digital assistants, because no one knows how to build them securely. 99% effective isn’t good enough. Never mix untrusted text with access to tools.

+

Simon showed how he gave the LLM a GeoJSON file with different line segments and prompted it to turn it into a single polygon. This “side project” took 3 1/2 minutes to complete

+

Simon showed how he had created a counter that incremented each time he said AI or artificial intelligence. It took 6 minutes to get to prototype and 20 minutes to get it polished.

+

Simon walked through how he passed structured data from the PSF Board Resolutions page into an LLM to parse it into a structured data table that could be filtered. He used a plugin he had been developing called llm.datasette.io.

+

Simon has been able to use LLM to more quickly build things that he couldn’t justify spending the time to build by hand.

+

Tips

+
    +
  • Ask it to give options (it’s more likely to give a better answer)

  • +
  • It will rarely get the answer right. Ask it to “do better.”

  • +
+

LLMs make mistakes. It’s up to you to verify. The tool gets you 90% of the way there.

+

Rather than Generative AI, Simon likes to think of these tools as Transformative AI.

+

Personal AI ethics: Simon came across the term “slop” and likes it. Similar to spam, ask yourself, am I creating unwanted junk or am I using these tools in a responsible way?

+

Simon pondered if using LLMs is cheating. We care if students cheat, because it hurts them and they have an unfair advantage.

+

LLMs feel different. Simon’s whole career has been about getting things done more quickly, including by using open source code.

+

A few rules of thumb

+
    +
  • Never commit any code that you couldn’t actively explain to someone else

  • +
  • LLMs are good at explaining code. Give it code in a language you don’t understand and it will explain it with 90% accuracy

  • +
  • Then, help people understand how you did it!

  • +
+

He said software engineers are uniquely positioned to take advantage of LLMs, because LLMs are good at generating code, and you can check the code by running it.

+

Simon is optimistic. You need to have a CS degree or spend a lot of time learning to do the simplest of computer tasks.

+

LLMs opens programming up to a much wider community. Simon believes that we have a responsibility to not leave anyone behind.

+

🔝 back to top

+
+
+

Hallway Track

+

It was wonderful to see Moshe Zadka at PyTexas where he gave a talk “Iterate, iterate, iterate” and again at PyCon US where he gave me a Moleskin journal from Anthropic for recording convo starters for next-generation AI assistant Claude.

+

+Moleskin from Moshe

+

At DjangoCon US 2023, Marc Gibbons gave a wonderful talk called “Empathetic testing: Developing with compassion and humility”. Not only was it his first conference talk, but after 44 chemo treatments, 15 fractions of radiation, and a stem cell transplant to treat Hodgkin Lymphoma, he had been given a clean bill of health the week before. It was wonderful to have the chance to catch up with him at PyCon US.

+

🔝 back to top

+
+
+

Overcoming GIL with subinterpreters and immutability

+

Yury Selivanov showed a screen with a single Python process running 10 async IO event loops saturating the 10 CPU cores on his laptop, all sharing memory and exchanging values between them from 1 million keys and values and done fairly efficiently. Yury said it is possible to build fast things with Python.

+

Yury kind of likes the GIL. When he tries to do free-threading or multi-thread programming, bad things happen.

+

Free-threading will take a couple of years to be stable. Python subinterpreters are relatively new. You can run these subinterpreters in the same process, side-by-side, isolated from each other, each with its own GIL and occupying one CPU core, sharing the same memory space.

+

One of the subinterpreters will be the main one and will spawn workers and perhaps can have queues between workers and spawn tasks.

+

What if we could safety share state between the subinterpreters with the potential for lots of it and without using pickle, because it’s slow?

+

+Safe shared state… no pickle

+

Yury has created a minimal library called memhive that enables efficient data sharing between isolated subinterpreters.

+

He showed a code snippet.

+

Architecture

+
    +
  • Level 1: simple protocol that enables you to send Python data across subinterpreter boundary

  • +
  • Level 2: higher level API (queues and sychronization primitives)

  • +
  • Level 3: async IO bridge

  • +
+

Create memhive and define the async workers that will be running in each separate subinterpreter, each with its own async IO loop. They can access shared state, listen to messages, send messages, spawn worker subinterpreters. The main interpreter will initialize the shared state, broadcast signals to all subinterpreters, push work so that one starts working on a task, listen to messages.

+

Rather than how it works, Yury felt it was more important to talk about how it’s implemented.

+

3 things to talk about

+
    +
  • Immutability

  • +
  • Efficient immutability

  • +
  • How we can benefit from it

  • +
+

Immutability

+
    +
  • Python has immutable types: str, int, floates, bytes, tuples

  • +
  • You cannot change an existing object. You have to create a new object out of the existing object.

  • +
  • There is no immutable dictionary or mapping in CPython, which Yury says is a shame.

  • +
+

Efficient immutability

+
    +
  • Creating a new tuple out of an existing one is efficient (O(n)), but you are not usually dealing with a lot of records.

  • +
  • The same inefficiency would be very bad for a dictionary, because we are potentially putting millions of items in them.

  • +
  • Dictionaries can be used as caches, but rebuilding it every time would be unacceptably slow.

  • +
  • Fortunately smart people created a nice algorithm that can implement this with O(log n)

  • +
+

The trick Yury would show used trees behind the scenes.

+

As keys and values are added to an empty root node of the tree, when a key conflict happens, another node on the second level is created and the key is added to it instead. The tree will get bigger and bigger as items are added.

+

+Linking a second level node by reference

+

Imagine that we want to mutate this tree. We run the algorithm to figure out where to put the key, then need to copy the root node (it’s immutable, so we can’t mutate it).

+

This is where the magic happens.

+

We don’t have to copy the second level of the tree. We can re-use it. We just need the reference.

+

In a mapping with billions of keys, perhaps five nodes out of 10,000 change.

+

This is called structured sharing. The algorithm is called HAMT (Hash Array Mapped Trie). Yury implemented it in the Python Standard Library. It can be found in contextvars module. The hamt.c file has a 200 line comment explaining in detail how this data structure works.

+

How we can benefit from it

+
    +
  • All subinterpreters run in the same OS process so they share the same memory space

  • +
  • If we want to access this tree from the main subinterpreter, we just look into the memory directly. It is immutable and will not change.

  • +
  • If we want to add a key, we don’t have to copy the entire tree, we just create the missing new branches and reference others

  • +
  • If we have a tree with billions of keys, we just create a couple of tree nodes in a worker subinterpreter, the rest can be re-used.

  • +
  • Key: using immutable things, we can access the underlying memory safely without locks, as long as we can guarantee that the data would not be garbage collected.

  • +
  • memcopy is used and is really fast.

  • +
+

+Create tree nodes in the worker subintrepreter and re-use the rest

+

Yury performed a benchmark. Structured sharing is significantly faster than using pickle, potentially 6x to 150,000x faster.

+

Yury talked about some of the implementation details icluding incref and decref. incref keeps Python objects alive when the ref count goes to zero. The data sharing mechanism has to guarantee safety.

+

The hard part of this is implemented in memhive, but some bugs need to be fixed. Do not use it in production.

+

Yury is building this for Edge DB to optimize cloud deployments.

+

🔝 back to top

+
+
+

Measuring the performance of CPython

+

“Measuring the Performance of CPython” by Michael Droettboom (Microsoft CPython Performance Engineering Team, Faster CPython Team)

+

I did not watch this full talk, because I left early to go to the PSF Members Luncheon.

+

A few key takeaways from what I did watch:

+
    +
  • The Faster CPython Team has made Python 3.11 20-60% faster depending on what you are doing

  • +
  • This talk was born out of a need to benchmark in order to determine if they were working on the right things to impact Python performance

  • +
  • In the Python world, benchmarks are in pyperformance suite (a little over 100 benchmarks, some 30 or 40 years old)

  • +
  • Not all benchmarks are created equal

  • +
+

+Other projects that have aimed to make faster Pythons over the years

+

Computer Architecture: A Quantitative Approach has a useful chapter for looking at benchmarks and categorizing what they are useful for

+
    +
  • Toy benchmarks: simple, less than 100 lines of code, cool, but not a common use case

  • +
  • Real applications: take some code that runs in production, maybe on a massive scale and running it in a benchmark suite

  • +
  • Microbenchmarks (not in the textbook): measuring a narrow feature of the language

  • +
+

Sub-topics of real applications benchmarks:

+
    +
  • Modified application: change it slightly to make it better as a benchmark

  • +
  • Application kernel: taking one subsystem of application and benchmarking that specifically

  • +
+

🔝 back to top

+
+
+

PSF Members Luncheon

+

I attended the PSF Members Luncheon.

+

I sat at a table that included Naomi Cedar (Author of The Quick Python Book), Tres Seaver (Zope), Chris Brousseau (PyBay), and Phebe Polk (PyBay Piggies).

+

+I really enjoyed the presentation.

+

At the luncheon, I had the chance to chat with Jannis Leidel (Anaconda) again. At PyCon US 2019, I met him serendipitously while I was working at the PyLadies booth. Once upon a time, he worked on Pinax, an open source library that I later helped maintained. I was able to learn more about the history of the project from him.

+

I later went over to Hynek Schlawack (prolific open source maintainer) who remembered we had met at PyGotham 2019 where I attended a talk he gave! While chatting with him, he introduced me to Hugo van Kemenade, the CPython 3.14 and 3.15 Release Manager. It was very cool to meet him, and it turns out that he maintains Pillow package. I am a big fan of Pillow. I used it to create my Twitter art bot which is very special to me. :)

+

🔝 back to top

+
+
+

Profile Pic

+

My friend Melanie Arbor (O’Reilly Media) takes great profile pics. At DjangoCon US 2017, she took my pic, and I loved it. I’ve used it as my social media profile pic since then, but it’s getting a bit dated. I saw her at PyCon US and asked her if she would be willing to take a new profile pic of me. It turned out that she had already created a “Profile Pic Palooza” open space for Saturday at 3 pm. As a bonus, I got to catch up with Chalmer Lowe (Google) for the first time since PyCon 2019.

+

+New profile pic :)

+

🔝 back to top

+
+
+

Juggling

+

Not only does Ned Batchelder (coverage.py Maintainer) maintain a powerful Python package and give popular conference talks (check out People: The API User’s Guide), he is also a juggling enthusiast. When I saw his juggling open space in progress, I couldn’t resist stopping. I juggled for the first time in probably decades! It was also great to catch up with Paul Ganssle (Google, CPython Core Dev, pytz maintainer), and meet Rob Ludwick (Bank of NY Mellon) and William Higgins (Consumer Financial Protection Bureau).

+

+

Video of me juggling!

+

🔝 back to top

+
+
+

Hallway Track and Expo Hall

+

It was great to see Jacob Kaplan-Moss (early Django Engineer) and Frank Wiles (RevSys, former DSF President) again.

+

I saw Glyph Kefkowitz’s badge and immediately knew he was probably the same Glyph (Twisted Project Leader) I’d come across on social media. I learned more about Twisted when Amber Brown gave a keynote at DjangoCon US US 2019 “The Natural State of Computers”. Glyph and I talked about the role of Twisted in the async world and the possibility of using Twisted for async orchestration.

+

Speaking of my DjangoCon US 2017 talk, Russell Keith-Magee (Beeware Founder, former DSF President, prolific public speaker) was my speaker mentor at the time. At PyCon US 2024, I had the chance to catch up with him before the PyLadies Auction. I congratulated him on the acceptance of PEP 730: Adding iOS as a supported platform. Python now runs on iOS without a patch! Russell’s Beeware Project enables you to write an app in Python and release it on multiple platforms, including desktop and mobile! Check out his PyCon US 2019 Python Black Swans Keynote) and many Beeware talks.

+

🔝 back to top

+
+
+

PyLadies Auction

+

The PyLadies Auction is always a roaring good time.

+

Not long after I sat down, I was excited to see Reuven Lerner (Python Trainer) walking past. He sat down next to me, and it was a pleasure to get to know him. I also enjoyed chatting with Danielle Casper (Amazon) about systems engineering and with Scott Karlin (Princeton).

+

A cuckoo clock donated by Capital One sold for $3,400. A “stupid” pen sold for $700.

+

The auction raised $60,000, $15,000 more than it ever had before. The community showed up in a big way!

+

+CPython Release Stream participants showing off their hats

+

+A miniature cutout of Guido for selfies and rubber duck debugging :)

+

Thank you to my friends Jackie Kazil (Bana Solutions, Project Mesa), Lorena Mesa (Netflix, PyLadies Chicago), and Lynn Root (Spotify) for all of the hard work they put into the auction this year and every year, and to Doug Napoleone for emceeing and Kushal Das for taking pics!

+

A PyLadies Grant helped me attend PyCon US 2019.

+

+Me and Jackie Kazil :)

+

🔝 back to top

+
+
+
+

Sunday

+
+

Posters

+

I started Sunday morning by checking out all of the posters.

+

🔝 back to top

+
+
+

Ethan Smith

+

Ethan Smith (Nvidia, formerly Sentry) and I have been following each other on social media for a while. We met in person and talked about his packaging work at Nvidia.

+

He was working on a draft Packaging PEP (Python Enhancement Proposal) “Supporting Symlinks in Wheels” sponsored by Barry Warsaw.

+

🔝 back to top

+
+
+

PyLadies Lunch

+

On Sunday, I attended the PyLadies Luncheon. It was wonderful, as usual.

+

Thank you to Marie Roald, Sydney Runkle (Pydantic), Kim Tendulkar, Erika Ambrosio (Tampa Bay Lightning), Sierra Brown, Grace (Muck Rack) (and a few others whose names I did not catch) for a really wonderful conversation over lunch.

+

I learned from Sydney who leads open source at Pydantic that Pydantic is often used with Django Rest Framework. I am looking forward to learning more! Check out Sydney’s PyCon US talk “Pydantic Power-up: Performance Tips for Lightning-Fast Python Applications”.

+

+Lynn Root, PyLadies Global Council, addressing the crowd

+

+PyLadies Booth in the Expo Hall

+

+Beautiful PyLadies t-shirt :)

+

🔝 back to top

+
+
+

Building a JIT compiler for CPython

+

Brandt Bucher (Microsoft CPython Performance Engineering Team)

+

+Updates that provided the foundation for a copy and patch JIT Compiler.

+

In Python 3.13, a JIT Compiler was implemented. This was only possible, because of the work done in Python 3.11 and 3.12.

+

In Python 3.11, a Specializing Adaptive Interpreter was implemented that brought a 25% performance improvement on average. At PyCon US 2023, Brandt gave a talk about it “Inside CPython 3.11’s new specializing, adaptive interpreter”.

+

In Python 3.12, infrastructure was implemented to automatically generate an interpreter from a DSL spec. This allowed for some repetitive, tedious, error-prone boilerplate to be removed from the main interpreter loop and different bytecode instructions to be analyzed.

+

In Python 3.13, a second “micro-op” interpreter was implemented. It’s an entirely separate execution pipeline that detects hot code paths and lowers them to a new bytecode format called “micro-ops.” They are optimized and executed in another dedicated interpreter.

+

Brandt showed how the pipeline works using a Fibonacci function as an example. He showed the code, the code’s bytecode, and the stack.

+

+Fibonacci code

+

This is where specialized bytecode comes in. If the operation is generalized to accommodate many use cases, but the code’s actual use case is simple, the bytecode can be “specialized” to fit that simpler use case. The resulting bytecode instructions are more specific to the the actual values, types of the code.

+

+Implementing specialized bytecode

+

These instructions will now be broken down into smaller, more easily optimized parts called “micro-op traces.” Instructions that are necessary in some cases, but not this case, can be removed. The result will be the essential instructions to execute the code.

+

+“micro-op traces”

+

Unfortunately, this new instruction format is more complex than basic bytecode instruction. Although each instruction is doing less work, there are more instructions. This is 20% slower than if we’d done nothing. Decoding each individual instruction in the micro-op interpreter is a lot more expensive.

+

That is where JIT compilation comes in.

+

Rather than decoding individual instructions in the interpreter, we can compile these optimized traces directly into machine code.

+

+Just-in-time compilation

+

Python frame objects live out in heap memory. Instead, the stack can be moved to the register where it is immediately available and there is no latency. Rather than having a generic interpreter that needs to handle every possible micro-op, the hot code path can be transformed in a straight line sequence of the exact code needed.

+

Although we want to make the faster, we need to trade peak performance for implementation simplicity that can enable Python to run in many places with few runtime dependencies and be easily maintained, improved, and extended upon by volunteers.

+

While JIT compilers are historically complex, copy and patch compilation meets these requirements satisfying way.

+

The technique is explained in a 30 page paper “Copy and Patch Compilation” and a blog post “Building a baseline JIT for Lua” by the same author.

+

In a nutshell, it’s a way of automatically turning a C interpreter into a fast template JIT compiler

+

Copy and patch can enable us to take a sequence of bytecode instructions and translate it into fast machine code as quickly as possible.

+

At runtime, walk over a sequence of bytecode instructions. For each, we can do something we have long been able to do when linking or reloading a relocatable object file

+
    +
  • Copy some static, pre-compiled machine code into executable memory

  • +
  • Patch up instructions that need to have runtime data encoded into them (things like relocation records for extern symbols)

  • +
+

Brandt walked through an example of how to go from micro op instruction to code we JIT at runtime.

+

At build time, when we are building the Python interpreter, the body of the instruction is extracted. It is put inside of its own function to be compiled in isolation. It won’t compile yet, because we are accessing objects with no values. These can be dynamically passed into the function as arguments. In terms of the “undefined locals” that will be the same once JIT-ed, and the frame and pointer that needs to be passed on so that we can JIT any additional micro-ops that we are JIT-ing, copy and patch gives an elegant solution for handling these: externs. Externs are similar to Python imports. You trust them to be defined at runtime.

+

+externs

+

When compile this in Clang, the ELF file will have the raw bytes of machine code to execute the micro-op instruction and exactly where and how to patch values.

+

We then have the opportunity to perform some localized optimizations until it is the essential micro-op. This can be parsed out of the ELF file and put directly into code generated in a C header file. We have a function that can be called and it will JIT the instruction for us by copying bytes and patching the load.

+

This is super fast.

+

Because LLVM is used, there is a lot of platform support out of the box.

+

In order to build this yourself, you need to have LLVM 18 installed and follow the instructions in the CPython repo.

+

🔝 back to top

+
+
+

Unlocking the Parallel Universe: Subinterpreters and Free-Threading in Python 3.13

+

Anthony Shaw created a gist with the excellent pre-requisites for his talk.

+

+Parallel execution options in Python; In concurrency, multiple tasks share the same resource, while in parallelism, multiple resources execute multiple tasks.

+

In Python 3.11, the GIL lived in the interpreter and we had one GIL per Python process. Multi-processing was used to achieve parallel code execution. If a task were split in half, it would take twice as long, because only one process could run at a time.

+

In Python 3.12, because of a new API, the GIL is per interpreter. We can have multiple interpreters running at the same time with multiple threads. The operating system will figure out which core is available and schedule so they run in parallel.

+

+Speed differences

+

Quick conclusion: a subinterpreter is like “multiprocessing with less overhead and shared memory”

+

In Python 3.13, we can disable the GIL and have a single interpreter running multiple threads at the same time. A task split in half will run more quickly now, because it will run in parallel.

+

+Steps to remove GIL

+

Free-threading introduces a new ABI that requires special wheels and a special build for CPython, creating compatibility issues. The ABI (application binary interface) is used to load a module that is being compiled in a language like C.

+

The GIL exists for thread-safety. We need to fix all of the C code that assumed the GIL existed and is not thread safe.

+

If everything is in pure Python, the Python team has full control over the interpreter. C extension compatibility poses a major challenge. Ironically, we have so many C extensions, because people optimized code, because they couldn’t run it in parallel.

+

At the moment, disabling the GIL generally makes Python code run slower. There are optimizations that have been disabled when the GIL is turned off, because they need to be made thread-safe before they can be used.

+

Anthony gave a demo followed by some closing thoughts with Terms and Conditions.

+

+Terms and conditions

+

🔝 back to top

+
+
+

Sync vs. Async in Python: Tools, Benchmarks, and ASGI/WSGI Explained

+

This talk by Arun Suresh Kamar was going on while I was in Anthony’s talk. It is at the top of my list to watch on demand.

+

🔝 back to top

+
+
+

Sumana Harihareswara Keynote

+

“Untold Stories from Six Years Working on Python Packaging”

+

I met Sumana (Changeset Consulting, Python packaging, Recurse Center) at PyGotham 2017 and attended the Art of Python miniature arts festival that she organized at PyCon US 2019. It was wonderful to see her in her element at PyCon US 2024, on stage talking about Python packaging.

+

From 2017 to 2022, Sumana was a paid packaging project manager. She worked on things we use a lot, like pip.

+

Key takeaways

+
    +
  • A chance meeting led Sumana to help obtain funding from Mozilla and overhall PyPI to Warehouse, finishing on time and on budget and unblocking more improvements

  • +
  • The strength of weak ties, cross pollination are possible because of the kind of conversations that happen at places like PyCon US

  • +
  • Infrastructure is hard, it’s often invisible. People depend on it, but don’t know that they depend on it. Sumana compared it to being a water user.

  • +
  • If volunteers try to get the word out about changes and even ask for your feedback, treat them like people. We are all in this together.

  • +
  • When PSF gets funding, it gets results (see a list in the PyPI sponsors page)

  • +
  • Organizations that rely on this infrastructure (and may have entitled opinions) can do a lot more to help

  • +
  • What seems like failure can prepare the ground for success: building organization, networks, knowledge, skill can be crucial for future successes you can’t foresee at the time

  • +
  • Sumana revised a bill to the NY City Council until it passed: The HEART Act to make Automated External Defibrillators more accessible to New Yorkers.

  • +
  • She wasn’t a Python packaging expert, but also wasn’t a public health expert. She planned and asked the right question until she got an answer.

  • +
  • You too can be the paddles that revive something that is stuck, in open source, local government

  • +
+

Homework

+
    +
  • Renew a connection: reply to an old friend or colleague

  • +
  • Practice Volunteer Responsibility Amnesty Day: on June 20th have a 20 minute meeting with yourself to think about your choices

  • +
  • Consider solidarity

  • +
+

Sumana created a page with all of her excellent keynote references.

+

I got to say hello after the keynote and also had the chance to meet her husband Leonard Richardson, who authored Beautiful Soup, another one of my favorite packages. :)

+

Leonard handed me a mini-zine called “Tool Safety” that he had written. After I got home and started looking through it, I saw that it had a beautiful message. You can see the online version here.

+

+Tool Safety mini-zine cover and page 3

+

As a bonus, before the talk began, I met Brian Walker who was sitting in my row. He’s a “Digital Billboard Jedi Master” software engineer working at Watchfire.

+

🔝 back to top

+
+
+

Steering Council Updates

+

Current Python Steering Council Members: Emily Morehouse (Cuttlesoft), Barry Warsaw, Pablo Galindo Salgado, Thomas Wouters (Google), Gregory P. Smith (To be determined)

+

🔝 back to top

+
+

Barry Warsaw: Steering Council Overview

+

The steering council is a five-person elected governance body responsible for the technical direction of Python: the evolution of the Python language, the CPython interpreter, and standard library. Elections happen annually, roughly aligned with Python releases.

+

Steering council members serve for one year and can run for re-election with no term limits. They are typically nominated and elected by CPython Core Devs, but you don’t have to be a CPython Core Dev to serve. No more than two members can work for the same company.

+

The steering council meets almost every week for 90 minutes. They are regularly joined by Deb Nicholson and Łukasz Langa. They discuss many topics which often come to their attention through the public GitHub tracker. A few of their important tasks: determining release cycle, choosing next release manager, pronouncing PEPs. The steering council has the final say on PEPs.

+

PEP 13 outlines how the Python Steering Council operates.

+

🔝 back to top

+
+
+

Gregory P. Smith: Steering Council Expenditures Update

+

How the steering council has spent PSF money to improve CPython

+
    +
  • Developer in Residence (team of 3 now: Łukasz Langa, Petr Viktorin, Serhiy Storchaka)

  • +
  • Security Developer in Residence: Seth Michael Larson

  • +
  • Steering Council Secretary: offer recently extended to Velda Kiara

  • +
  • Annual Core Developer Sprints

  • +
+

🔝 back to top

+
+
+

Emily Morehouse: Councils and Working Groups Update

+

Firstly, Emily explained their role. As Python evolves, the requirements for helping change. Councils and working group members are experts in complex, specialized subjects. These groups report to the steering council and are able to help with decision making and management, such as reviewing and pre-approving PEPs.

+

Three working group changes

+ +

The C API Working Group has a new repo.

+

🔝 back to top

+
+
+

Thomas Wouters: Overview of Python 3.13

+

Thomas Wouters, Python 3.12 and 3.13 Release Manager, gave an overview of 3.13

+

Breaking changes

+ +

Type Annotation

+ +

Platform Support

+ +

Despite saying there are no major new features in Python 3.13, Thomas acknowledged some exciting new developments.

+ +

+

Why even upgrade?

+
    +
  • Improved error messages (again)

  • +
  • Many bug fixes (not all of them can be backported to 3.12)

  • +
  • Many new features in standard lib modules

  • +
  • Stepping stone for future improvements

  • +
  • Discover what newly deprecated APIs you are using

  • +
+

The 3.13 beta is out now! See the full release notes at What’s New in Python 3.13.

+

Thomas noted that incoming release manager Hugo van Kemenade has proposed switching to CalVer. He gave a talk “Should Python adopt CalVer” at the Language Summit.

+

🔝 back to top

+
+
+

Pablo Galindo Salgado: Free-Threading Update (a.k.a. No GIL)

+

Pablo outlined the free-threading plan.

+

+The plan

+

+Experimental phase

+

+Supported, but not default

+

+Making it default

+

+Community

+

Closing thoughts

+
    +
  • The CPython Core Team will regularly assess progress and work to prevent prolonged backward compatibility struggle

  • +
  • If things become problematic, it can be called off

  • +
  • Lessons have been learned. This will be neither Python 2 to 3, nor Python 4.

  • +
  • Free-threading is available on Python 3.13 with an optional flag and environmental variable

  • +
+

+

This thing is really happening. It feels like we went from Brett Cannon’s “put up or shut up” to this pretty quickly, lol.

+

🔝 back to top

+
+
+
+

Dinner and Ice Cream

+

After the conference ended on Sunday night, I found myself chatting with a group of old friends and new friends. They invited me to dinner, and I decided to join. It was a wonderful time, as you can tell from the photo. :)

+

+Tammy Do (Code Fellows), Velda Kiara (DEFNA Board Member, Python Steering Council Secretary), Jim Anderson (Motorola Solutions, Real Python), Ngazetungue Muheue (LaLoka Labs, DjangoCon Africa), Kudzayi Bamhare, Benedict Kofi Amofah, me, Afi Gbagado, and Catherine Devlin (Corning, formerly Disney)

+

+Chocolate bar made by a Ghanian company and given to me by Afi :)

+

PyCon US had a challenge. You could get points for completing certain activities and redeem them for an ice cream card. I was able to complete the challenge, because I had organized a Python-related conference (DjangoCon US 2023) and attended a regional Python conference (PyTexas 2024) since last PyCon US. After dinner, I went to Milley’s Homemade Ice Cream at Market Square and used the ice cream card. I had Best Chocolate. Yummy!

+

+Best Chocolate :)

+

🔝 back to top

+
+
+
+

Monday

+

At PyCon US 2019, on my last night in Cleveland, I spontaneously joined Sviatoslav Sydorenko (Ansible Core Developer), Stéphane Wirtel (CPython Core Developer), and a few other conference attendees at Flannery’s Pub for dinner. It was magical.

+

On the first day of the PyCon US 2024 Sprints, Sviatoslav Sydorenko and I found each other for a catch up. I suddenly made the connection that he is a core developer of Ansible, a tool that I use. Mind blown. :) He gave me some insight about being a programmer versus engineer and distributed systems. It was a very enlightening conversation for me.

+

I also met Seth Michael Larson (PSF Security Developer in Residence) in person in the packaging sprints room. I have been following his security work, which has included Visualizing the CPython release process, making CPython source release Software Bill-of-Materials (SBOMs) available, and getting the PSF set up as a CVE Numbering Authority. He told me more about his background and work. His blog is an awesome source of info, and I highly recommend following him for news!

+

Interactions like these brought to mind a post by Frank Wiles:

+

+

🔝 back to top

+
+
+

Until Next Time

+

Thank you to everyone for making this a truly epic experience. The talk replays should be public soon.

+

If you are looking for another conference experience, check out the mega-regional conference list in the closing presentation.

+

After chatting with a PSF Staff Member a few years ago about location selection, I assumed that PyCon US would never be held in a high cost of living city.

+

It was announced that PyCon US 2026 will be in Long Beach, California.

+

Last year, I treated myself by taking my dream Los Angeles vacation in December. I loved it, and I can’t wait to go back for PyCon US! :)

+

In the meantime, I hope to see you all in Pittsburgh next year!

+

+

🔝 back to top

+
+
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/pygotham-2019-recap.html b/pygotham-2019-recap.html new file mode 100644 index 00000000..7b852c4f --- /dev/null +++ b/pygotham-2019-recap.html @@ -0,0 +1,358 @@ + + + + + + + + PyGotham 2019 Recap — Portfolio 0.1 documentation + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

PyGotham 2019 Recap

+

Published: July 20, 2020

+
+

Description

+

PyGotham 2019 took place at Hotel Penn in New York City last fall. While sheltering-in-place, Eldarion’s Katherine Michel looked back at the wonderful experience she had there and looks forward to returning to a conference and city she loves.

+
+
+

Blog Post

+

+

While riding the ferry to Liberty Island, looking back at the Statue of Liberty and South Manhattan; photo credit: Katherine Michel

+
+
+

A Powerful Call-to-Action

+

PyGotham, New York City’s regional Python conference, took place again last fall at the historic Hotel Pennsylvania, in the heart of Manhattan. I’ve been fortunate to have been able to attend PyGotham every year for the past three years.

+

The content at PyGotham is excellent and I always find myself struggling to choose which talk to attend (fortunately, the videos are published online).

+

But what stood out to me the most this year, was the collective call-to-action to make the tech community a place where everyone can feel a sense of belonging and thrive.

+

I felt this call-to-action in several ways:

+

In addition to open captioning, every PyGotham talk was interpeted in American Sign Language.

+

The three keynotes, “Python Use Spectrum” by Kojo Idrissa, “Accepting your successes” by Piper Thunstrom, and “Because Equity: Python FTW” by Meg Ray, were about welcoming people on the fringes into the community and making them feel valued, for the greater good of all.

+

I felt inspired by a talk by Froi Irizarry Rivera and José Padilla called “Python, Governments, and Contracts,” in which they told of their feeling of helplessness as they watched a hurricane ravage Puerto Rico and how they had spontaneously channeled their frustration into an appeal for grassroots volunteers who have now created powerful tools to root out corruption.

+

And during my own visit to the Statue of Liberty and Ellis Island, I watched Ranger Jenn re-enact the impassioned stories of people who had arrived at Ellis Island as prospective immigrants. She told of the extreme adversity many had faced to be accepted in the United States. More about that later in this blog post.

+

All converged into one interwoven experience that felt very fitting in such a diverse city.

+
+
+

A Note About American Sign Language at PyGotham

+

Approximately a month before PyGotham, I attended an event at Strange Loop conference in St. Louis where a deaf woman named Mel Chua was a featured speaker. Mel is an electrical computer engineer with a background in free open-source software (FOSS), large-scale distributed engineering team collaboration, and engineering education culture.

+

Mel told her story, primarily through American Sign Language. I’m embarrassed to say, this was the first time I can remember ever having seen sign language interpretation happen in real life.

+

Having grown up loving math, science, and computers, Mel wanted to join the “beautiful” tech world. But she wanted to leave behind the things that made her not fit in. Eventually she realized that by being her true self and becoming what tech looks like, she could make the tech community more welcoming for people like her and impact the perceptions of others. Cultures form in response to the people in them, she pointed out.

+

Mel gave a call to action during her message, to see tech as one culture. “Let’s hack it together, and remake it in the image of all of us,” she said.

+

After having heard Mel’s powerful message at Strange Loop, it made me happy to see her at PyGotham, along with a group of other deaf developers, making use of the services of the American Sign Language interpreters.

+

A. Jesse Jiryu Davis wrote “PyGotham 2019’s ASL and Live Captioning Playbook” in the hopes that it will be used to make other conferences accessible for the Deaf and hard-of-hearing.

+

+

Members of the Deaf community at PyGotham; photo credit: A. Jesse Jiryu Davis (used with permission)

+
+
+

Friday

+
+

Python Use Spectrum

+

I was thrilled that the conference kicked off with a keynote about the “Python Use Spectrum” by Kojo Idrissa!

+

Kojo is a DjangoCon US Organizer, former DEFNA Board Member, and currently DEFNA North American Ambassador. DEFNA is the non-profit that oversees DjangoCon US (disclosure, I’m a DEFNA Board Member and DjangoCon US Website Co-Chair). DEFNA also provides small amounts of funding for Django events in North America. As a fellow organizer, Kojo extended an official “hello” and group hug to the PyGotham organizers from the DEFNA Board and DjangoCon US team. Thank you, Kojo!

+

Kojo’s talk was about how we, as a community, can ensure that as Python grows in use, the number of contributors and the skillset of contributors grow as well.

+

+

Kojo Idrissa; photo credit: Casey Faist (used with permission)

+

CPython, the most popular implementation of the Python interpreter, is an open-source project developed primarily by volunteers. Burnout is a real possibility. As projects like CPython grow, they also need skills beyond coding, that are not taught in traditional CS programs.

+

Kojo showed us what he calls the Python Use Spectrum. On one end of the spectrum is programmer. On the other end is software engineer. Data scientist is somewhere in the middle.

+

A programmer might be working alone, using just Python to solve a problem. Perhaps he or she is a professional making a tool to improve their workplace, or a hobbyist making a video game or a website.

+

On the other hand, a software engineer tends to be a member of a team, using special tools and a process to ship code professionally. The code itself is the product and might be used by other people.

+

+

Kojo Idrissa; photo credit: Casey Faist (used with permission)

+

Kojo believes that the Python community has developed a strong bias toward software engineering as the “one true way of writing code” and that this is detrimental to the community.

+

In reality, everyone on the spectrum is using Python to solve problems and all are potential contributors to the Python ecosystem. One way that we can actively work to increase the number of contributors and the skill set of contributors is by embracing and valuing all members of the community, regardless of where they are on the spectrum.

+

+

Kojo Idrissa; photo credit: Casey Faist (used with permission)

+
+
+
+

Friday Talks

+

As a Pinax Maintainer, I find that talks I can apply to my work particularly resonate with me. There were several such talks on Friday.

+

Hynek Schlawack is a CPython Core Developer and maintainer of many open-source projects. In his talk, “Maintaining a Python Project When It’s Not Your Job,” Hynek explained how a maintainer with limited time can publish a high quality Python package, that as much as possible leverages the contributions of others. Even though the title suggests it’s for volunteer maintainers, the talk included lessons that could be useful to just about any maintainer. Hynek has made a fine science out of creating a welcoming environment for all prospective contributors, removing the fiction from the contribution process, and automating the package continuous integration and release process. This process has also been helpfully documented in an outline on his blog. I particularly liked that the talk went beyond a list of tips, to focus more on the psychology of motivation and time, and the tools and configurations he uses.

+

I found myself completely engrossed in Mason Egger’s high-energy talk, “Building Docs Like Code: Continuous Integration for Documentation.” Mason is a self-described “documentation fanatic” who believes that developers dislike writing code because they have to context-switch out of the code writing tools that they love in order to write docs in a workflow they don’t love. Empowering developers to document within a workflow they already know and love can result in beautiful, uniform docs. Mason believes we should treat documentation like code… store it in version control alongside the code it documents, write it with markup language, review and test it with the same granularity as code to ensure it is accurate and functional, and auto-publish it. Mason did a review of documentation types and tools, including Sphinx and MkDocs. He also gave a case study and demo showing how he created a docs pipeline.

+

Going on at the same time as Mason Egger’s talk was “How I Solved my NYC Parking Problem with Python,” by Jessica Garson. I was particularly interested in this talk because Jessica created a fun app to solve her own problem, something I’d like to do more of myself. Jessica lives in Brooklyn and used to have a car. Because of alternate side of the street parking restrictions, every night at 9 o’clock, she would move her car to avoid an expensive parking ticket. She was spending a lot of time looking for a new parking space, sometimes overlooking that she didn’t need to, due to a holiday. So, she built an app that would let her know when she didn’t need to move her car! Twice a day, a cron job runs the app. Using a Twitter Premium Search endpoint, when the words “suspended” and “tomorrow” show up in a tweet from the NYC Alt Side Parking Twitter account, Twilio sends her a text message letting her know she doesn’t need to re-park. Very cool!

+
+
+

Accepting Your Successes

+

Saturday kicked off with a keynote by Piper Thunstrom: “Accepting your successes.”

+

+

Piper Thunstrom; photo credit: Casey Faist (used with permission)

+

I first heard Piper speak at PyGotham 2017 when I attended her talk “Monkey Patching My Life- Being a Trans Python Developer.”

+

In Piper’s own words, she’s “A domestic violence survivor, a trans woman, a game developer, and a book editor that struggles with suicide ideation and loves her community.”

+

In her keynote, Piper walked us through the difficult times in her life, and how she came out on the other side having found the Python community and achieved success.

+

I found it very poinant when Piper said that she stands on stage vulnerably, because she is reaching out to her own self of 10 or 20 years ago, “The little kid who will be going through a world of hurt.” She needed for other people to do that for her. She is also doing it for her current friends who haven’t reached out.

+

In my opinion, her ability to be a role model and voice for other trans members of the community and victims of trauma, could be her most important form of success, and a source of healing for her.

+

I think Piper’s own words best sum up the lessons of her talk:

+

“Every one of us has something to contribute to our community. If you’ve been around, you should look for people you don’t recognize and new faces and help lift them up.

+

Stop treating societal expectations as success metrics: write your own success story and learn to recognize when success doesn’t look like you imagine.

+

If you’re struggling with your mental health: you’re not alone. Don’t be afraid to reach out to those around you.”

+
+
+

Python, Governments, and Contracts

+

On Saturday, I spent a lot of time in the “hallway track.” But there was one talk I did attend that I found particularly important. It was “Python, Governments, and Contracts,” by Froi Irizarry Rivera and José Padilla.

+

In 2017, Hurricane Maria, a category 4 storm, made landfall in Puerto Rico and devastated the island. Feeling helpless as they worried about their families back home, Froi and José decided to do something. They started the Maria Tech Brigade. In two or three weeks, through grassroots organizing, they were 300 volunteers strong.

+

Froi and José soon became aware of the website of the Oficina de la Controlar de Puerto Rico. Contracts made by government entities to other government entities or contractors are published there. The Puerto Rican Power Authority has had a number of suspicious contracts over the past two years.

+

+

Froi Irizarry Rivera; photo credit: Casey Faist (used with permission)

+

Froi and José found that the controller website has a terrible user experience. The site data is neither open nor usable. Users have to download documents one at a time. There is no real API. The contract documents are sometimes missing. The search functionality is rudimentary. The document content is not searchable. The pagination is broken. No real insights or data visualization tools are provided.

+

Froi and José began to build their own tool Contrato PRA to help journalists and interested citizens investigate corruption.

+

The batteries included philosophy of Django and the third-party extensions in the Python and Django ecosystem enabled them to get the project up and running as quickly and cost effectively as possible.

+

The project was split into two parts: a REST API built with Django REST Framework, Python, Redis, Celery, Docker, and Postgres; and a front-end, which users can access the API data through, built using a React framework called Next.

+

Froi and José used JSON endpoints and self-throttling to optimize data collection, without negatively affecting the controller site. In the Contrato PRA site, documents and their contents are now searchable and the data can be visualized by category.

+

Sadly, the work is not done, because the consequences of mismanagement and corruption are still ongoing and Puerto Rico has suffered additional natural disaster.

+

They have met their goal of collecting the million contract documents on the website. They have also explored ways of making their scraping logs and project financials transparent. They want to collect input from journalists and members of the data science community to help improve the site. And they are interested in finding sponsorship for the $60/month cost of running the project.

+

If you are interested in the project or would like to contribute, reach out to them!

+
+
+

Closing Keynote

+

The conference closed with a keynote by Meg Ray: “Because Equity: Python FTW.”

+

Meg’s keynote at PyGotham was very timely. She had recently been awarded a PSF education grant to create an open-source, PSF landing site for Python education. Meg wants to bring together Pythonistas who are interested in education and educators interested in Python. And she’s looking for contributors! Reach out to her if you are interested.

+

+

Meg Ray; photo credit: Casey Faist (used with permission)

+

According to the Association for Computer Machinery report “Running on Empty,” lack of access to computer science education or privileged knowledge in US K-12 schools is a significant social justice issue.

+

+

Meg Ray; photo credit: Casey Faist (used with permission)

+

Meg’s talk explored ways to bring computer science education to every student.

+

There are a variety of obstacles that prevent students from being exposed to computer science, internal and external, physical and psychological.

+

Some schools are lacking the basics: reliable internet, power, technology devices, or technology device support. Some schools have made choices that affect exposure, such as restrictions on internet access or lack of the computer science courses that qualify students for college-level computer science programs. It’s also difficult to find or create a curriculum that works in the classroom.

+

There are personal obstacles as well. Some students have visible or invisible disabilities. Others feel that they don’t belong or that the subject-matter is boring.

+

By the time students are in high school, they tend to be either on a computer science track or not.

+

Speaking from her own experience, having redesigned Young Coders for PyGotham along with Barbara Shurette, as well as referencing resources such as the Gates Foundation’s Reboot Representaton coalition, Meg gave tips for engaging every student.

+

Students need to be motivated to pursue programming. Making kids sit at computers and power through boring stuff doesn’t work. When students go to stations and make take-home projects, they learn the basics, make something meaningful, and get hooked. Students also tend to retain more of the knowledge when they make something tangible.

+

Holistically, schools can create a longterm path for every student by offering diverse on-ramps for beginners, not one set path. A sense of belonging should be created immediately and fostered intentionally for the longterm.

+

Meg also gave a few tips from the “Zen of Python Education” talk she gave at PyCon 2019.

+

+

Meg Ray; photo credit: Casey Faist (used with permission)

+

At the end of the talk, Meg gave a call to action for community members to advocate and volunteer. Ways to make a difference include: personally advocating at a state or local level for computer science as a graduation requirement; professionally promoting computer science education via your workplace by supporting employees in volunteering for computer science education week or make events, hosting school field trips in your office, inviting high school students to shadow you for a day on take your child to work day, or recruiting a first-time intern.

+
+
+

Hallway Track

+

As usual, the “hallway track” was an invaluable opportunity to network. The connections made were too numerous to list all, but here are a few highlights:

+

It was a pleasure to chat with PSF Director Lorena Mesa about PSF diversity initiatives, and meet for the first time PyCon US 2019 and 2020 Financial Co-Chair Jigyasa Grover.

+

While mentioning to Meg Ray that perhaps there were some lessons in her talk that I could apply to my work as an open-source maintainer, we arranged for her to pick my brain about my experiences as DjangoCon US Website Chair and Co-Chair and Pinax Maintainer as she embarks on the new open-source PSF Education landing page.

+

During the last few hours of PyGotham, I also serendipitiously met employees of three companies that have had a huge impact on my life, and was offered tours of the San Francisco-based headquarters of all three. Fun!

+
+
+

Statue of Liberty and Ellis Island

+

When I attended PyGotham for the first time in 2017, it was the first time I had ever visited New York City. I had read about and seen pictures and videos of New York City all of my life, of course, but you really have to physically be in a place to understand it, in my opinion. It both was and wasn’t what I had expected.

+

I hadn’t realized ahead of time how meaningful it would be to finally experience for myself a place that is such an important part of our culture.

+

When I arrived at Penn Station in 2017, I distinctly remember emerging from the station onto bustling 7th Avenue, Madison Square Garden behind me and Hotel Pennsylvania in front of me.

+

I was gobsmacked by my surroundings. Walking around the streets of New York, marveling at the landscape, I found the people to be austere in appearance, but kind. I was fascinated by the rich diversity I saw around me and the sight of people just living who they are, unapologetically.

+

+

7th Avenue; photo credit: Katherine Michel

+

+

Times Square; photo credit: Katherine Michel

+

During that 2017 trip, I rode the Staten Island Ferry past the Statue of Liberty. There were so many sights on my list to see that at the time, I was satisfied with that.

+

This year, I decided it was time to visit the Statue of Liberty and Ellis Island for the first time.

+

It’s mind blowing to think that some of my own Scottish, Volga German, and Pennsylvania Dutch ancestors arriving in New York City as prospective immigrants, saw the same timeless Statue of Liberty that I did, and walked through the same hallowed halls of what is now the National Museum of Immigration on Ellis Island.

+

In Battery Park, I boarded the ferry and rode to Liberty Island, home of the Statue of Liberty and Statue of Liberty Museum.

+

+

Boarding the ferry to Liberty Island; photo credit: Katherine Michel

+

On the island, I walked around the perimeter in front of the statue, then walked 215 steps up to the statue pedestal for a beautiful view of the Manhattan skyline and Statue of Liberty Museum.

+

+

Standing in front of the Statue of Liberty; photo credit: Katherine Michel

+

+

The view of South Manhattan from the pedestal; photo credit: Katherine Michel

+

+

The view of the Statue of Liberty Museum from the pedestal; photo credit: Katherine Michel

+

+

The view of the statue from the Statue of Liberty Museum; photo credit: Katherine Michel

+

I then went to the Statue of Liberty Museum and saw pieces of the statue at scale, an exhibit showing how the pieces were made, and a replica of The New Colossus plaque enscribed with that famous poem that begins “Give me your tired, your poor; Your huddled masses yearning to breathe free,” among many other historical items.

+

+

The beautiful Statue of Liberty Museum; photo credit: Katherine Michel

+

+

A piece of the statue at scale; photo credit: Katherine Michel

+

+

A piece of the statue at scale; photo credit: Katherine Michel

+

+

A replica of The New Colossus plaque; photo credit: Katherine Michel

+

I then re-boarded the ferry to travel to Ellis Island, to the National Museum of Immigration, where immigrants were once welcomed.

+

+

The National Museum of Immigration; photo credit: Katherine Michel

+

In the Baggage Room, I joined a tour that was in process.

+

+

A description of the Baggage Room; photo credit: Katherine Michel

+

+

A view of the Baggage Room from the stairs leading up to the Registration Room; photo credit: Katherine Michel

+

Ranger Jenn gave us an impassioned depiction of what the atmosphere would have been like for new arrivals in the Baggage Room.

+

+

Ranger Jenn giving an impassioned depiction; photo credit: Katherine Michel

+

+

Ranger Jenn giving an impassioned depiction; photo credit: Katherine Michel

+

+

Ranger Jenn giving an impassioned depiction; photo credit: Katherine Michel

+

We then moved onto the Registration Room.

+

+

A description of the Registration Room; photo credit: Katherine Michel

+

+

A photo of what the Registration Room looked like ca. 1912; photo credit: Katherine Michel

+

+

A photo of what the Registration Room looked like on the day that I was there; photo credit: Katherine Michel

+

Standing at a registration desk, Ranger Jenn took us through a mock conversation between an official and a prospective immigrant. It was not unlike today. The officials were human life detectors, questioning the prospective immigrants, who had to answer correctly and show they were able-bodied.

+

+

Ranger Jenn taking us through a mock conversation between an official and a prospective immigrant; photo credit: Katherine Michel

+

+

Ranger Jenn taking us through a mock conversation between an official and a prospective immigrant; photo credit: Katherine Michel

+

Amazingly, the green benches in the Registration Room were the same benches used when the building was in service, Ranger Jenn pointed out.

+

+

One of the green benches used when the building was in service; photo credit: Katherine Michel

+

At the end of the tour, Ranger Jenn led us to the far end of the room to the “golden doors” that people passed through after being approved.

+

She said to us, “May you have many golden doors in life the way Ellis Island was for them and may each of you be a golden door in this life for someone else the way this spot was for so many, personally and collectively. One third to one fourth of all Americans today can trace at least one ancestor to this little spit of land in the New York Harbor.”

+

+

Ranger Jenn standing in front of the “golden doors”; photo credit: Katherine Michel

+

Remembering back to the time I spent working for U.S. Immigration, I had all the feels.

+

Ranger Jenn then gave us a special viewing of the Hearing Room.

+

+

The view of the Hearing Room from the gallery; photo credit: Katherine Michel

+

She was keen to tell us the story of Frank Woodhull/Mary Johnson, a biological woman who looked like a man, who arrived at Ellis Island in 1908 and had a hearing to determine if he/she should be allowed to enter the U.S.

+

+

A photo of Frank Woodhull/Mary Johnson

+

Despite having illness that could have been disqualifying, Frank Woodhull/Mary Johnson was allowed to enter the U.S. and was the only person who ever had a name change at Ellis Island.

+

+

A dog-eared article about Frank Woodhull/Mary Johnson

+

After the tour was over, I had the chance to chat with Ranger Jenn about my time spent working for U.S. Immigration and how that experience still inspires my work today. She scribbled some thoughts down on a piece of paper, because she likes to reflect on the experiences of people she meets there, and incorporate these insights into her work.

+

It was an experience of a lifetime.

+
+
+

Thank You

+

PyGotham was yet another life-changing conference. Thank you to Conference Chair Jon Banafato and all of the organizers who put so much hard work and planning into making it a wonderful event. Looking forward to next time!

+

+

Souveniers at LaGuardia Airport; photo credit: Katherine Michel

+
+
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/reflections-on-stanford-code-in-place.html b/reflections-on-stanford-code-in-place.html new file mode 100644 index 00000000..a4c5948d --- /dev/null +++ b/reflections-on-stanford-code-in-place.html @@ -0,0 +1,289 @@ + + + + + + + + Reflections on Stanford Code in Place — Portfolio 0.1 documentation + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

Reflections on Stanford Code in Place

+
+

About Stanford Code in Place

+

In late March, while I was looking through my Twitter news feed, I came across a tweet about a one-time Python programming course called Stanford Code in Place.

+

Mehran Sahami and Chris Piech teach Stanford’s introductory Python course CS106A. Because of shelter-in-place, they decided to open the course to the public. They would teach the traditional CS106A version and public Code in Place version simultaneously.

+
+
+

Application and Acceptance

+

Sensing an opportunity to unlock some invaluable new knowledge through what would undoubtedly be a high quality course, I jumped at the chance to apply.

+

The application consisted of a few personal questions and a few “Karel the Robot” exercises.

+

Karel the Robot is a powerful, toy-like programming environment created by former Stanford instructor Richard E. Pattis.

+

+

Caption: “Karel World”

+

I immediately liked Karel the Robot. Karel piqued my interest, challenged me, and left me wanting to go further in my learning.

+

I completed the application and soon received an acceptance email. 80,000 prospective students had started an application, 8,000 students were admitted, and 800 section leaders accepted.

+

Although the Code in Place instructors strongly believe in open education, this was the first initiative of its kind and run by volunteers. With students split into groups of 10 and each group supported by a section leader, the number of students admitted was limited.

+
+
+

What I Got Out of the Course

+

I was excited to be able to participate and was intent to make the most of the experience and build on it after the course ended.

+

As a release manager of an open-source Django library named Pinax, Python was not new to me. However, there were specific things I wanted to get out of Code in Place and I can wholeheartedly say that I did:

+
    +
  • A more intuitive understanding of control flow, algorithms, and program structure

  • +
  • Reinforcement of my Python fundamentals knowledge

  • +
+

There were also a few unexpected bonuses that I got out of the course:

+
    +
  • Had fun making things, including using tools I had already wanted to explore

  • +
  • Got to know a few Python libraries better, including SimpleImage, Pillow, and Tkinter

  • +
  • Learned how to make a project demo video

  • +
  • Got to know a number of fascinating and inspiring people

  • +
+
+
+

Lectures and Assignments

+

The main part of the course lasted for 5 weeks.

+

New lecture videos were released every Monday, Wednesday, and Friday. In these lectures, Mehran and Chris taught Python fundamentals in such a way that they built on each other and aligned with our coursework.

+

There were three regular assignments due approximately every week and a half, and a final project that we had an additional one to two weeks to work on.

+
+
+

Sections

+

My section leader was Matt, a Stanford CS alum, and our section met every Thursday via Zoom.

+

When our first section took place, I was surprised to see that nearly all of the students were women, primarily in my same age group, with the exception of one man. I didn’t expect that kind of gender and age representation and thought it was great.

+

During each section, we went over key points from that week’s lectures, worked through programming challenges, and talked about any questions we had. Our section leader Matt was very knowledgeable and helpful.

+
+
+

Assignments and Final Project

+
+

Assignment 1: Karel the Robot

+

Our first assignment consisted of Karel the Robot problems.

+

We were encouraged to install and use PyCharm IDE, if possible. An online IDE was available for those who needed it.

+

It’s fairly easy to get started using Karel the Robot. On the surface, Karel seems simple to use. There are only a few built-in commands available for giving Karel instructions for completing seemingly straightforward tasks in Karel World.

+

+

Caption: Karel Reference

+

However, in order to “solve” a Karel challenge, your code must be adequately abstract!

+

For example, I thought I had “solved” the first Karel challenge when it passed the first test case, only to amusingly (and frustratingly, at the time!) realize that there were other, more extreme test cases my solution had not yet passed. To succeed in passing all of them, you needed to use decomposition, good control flow, and creative problem solving.

+

+

Caption: Example test cases… Karel should be able to climb up and down mountains of any size, not just one size!

+

Our instructor Chris alluded to the hidden cleverness of Karel when he told us that some of the most difficult programming problems he had ever encountered had been in Karel World.

+

+

Caption: A tweet about my progress. Creating new neural pathways, I hope!

+
+
+

Assignment 2: Simple Python

+

In the second week, we moved on from Karel the Robot, which was similar to Python, to Python itself. Our assignment involved solving several challenges in Python. This felt like the easiest week for me.

+

By now, we had covered Python control flow, variables, expressions, functions, and parameters, and would soon move on to lists and dictionaries.

+

Not long after assignment 2 was due, we had the option to complete a diagnostic test consisting of several programming problems. To complete the diagnostic test, we typed the code as we thought it should be to solve the problems, without being able to debug. Interesting!

+
+
+

Assignment 3: Images

+

On the same day that assignment 2 was due, we began studying images.

+

For the images assignment, we used a module called SimpleImage that was created by Stanford teacher Nick Parlante. Built on top of Python’s full-featured Pillow library for manipulating images, SimpleImage provides a smaller selection of functionality, such as the ability to open and display an image and access and change its RGB pixel values.

+

Our assignment problems included creating a special Code in Place image filter, creating a mirror image, and creating an Andy Warhol-esque artwork of the same image repeated multiple times, but with a different, brightly colored filter applied to each.

+

+

Caption: Simba, the Code in Place Dog

+

+

Caption: Simba, as a Warhol-esque “Painting”

+

After studying images, we studied animation using Tkinter, text processing, and data.

+
+
+

Final Project

+

The course went by so quickly that before I knew it, it was time to do our final projects.

+

Although there were two standard Code in Place final project ideas students could use, we could make anything we wanted. I wanted to use the final project as an opportunity to challenge myself to do something new.

+

For quite a while, I had wanted to make a Twitter bot, possibly powered by GitHub Actions. I happen to love photos, so I immediately looked at some photo service APIs. At Unsplash, I came across a pet photo collection. It reminded me of Simba, the adorable Code in Place dog, and how we had applied image filter algorithms to photos of Simba.

+

So, I created a “Simba Friends” Twitter bot powered by a Python program I wrote that randomly downloads a photo from the Unsplash pet photo collection, randomly applies an image filter algorithm to it, and tweets it.

+

+

Caption: Tweeting my surprise that my final project had worked as a proof of concept

+

Our final projects are listed on the Code in Place final projects site. My project is lucky #13. :)

+

You can also learn more about my final project in its GitHub repo.

+
+
+
+

A Few of My Thoughts and Opinions About the Course

+
+

Inclusion

+

Beginning with the first introductory lecture, I had a sense that the Code in Place staff were genuinely nice people who wanted to create a kind, welcoming, non-judgmental atmosphere that was all about the best interest of individuals and their learning.

+

It was great to see that there were women in my section with non-traditional backgrounds who were insatiably curious about programming and highly motivated to succeed at it. Because of my familiarity with the Python ecosystem, I was able to provide some special support and advice to those who wanted to learn more, such as directing them to two of my favorite Python books: “Automate the Boring Stuff with Python” by Al Sweigart and “Python Crash Course” by Eric Matthes.

+

Our teacher Chris, who uses machine learning to study how students learn, posted a course midpoint message that I did not at all expect. A neural network was trained on data collected about how students had solved a programming challenge on www.code.org. The neural network became very good at predicting outcomes. When it predicted who was most likely to have longterm success, it was not the person who had immediately known the answer, but instead, a person who had grappled with the problem a.k.a. had grit. Members of my section, myself included, found it inspiring. :)

+

+

I also appreciated that we were told that our final projects could be as humble or as big as we wanted.

+

Having personally experienced the mixed messages women in particular face about skills and achievement, it’s refreshing to be in a mental space where students are all given permission to do their best, wherever they are on their journey, without being stuck in the psychological trap women are often perpetually caught in of being either not good enough or too good, instead of simply being.

+

My only quibble, and it’s a very small one, about inclusion during the course was the use of “guys” a few times during lectures to refer to students of all genders. I’m 100% sure it was not at all intended to create a feeling of exclusion and it’s something I occassionally do by accident. My friend Lacey created a website called Hey Guys that has a list of alternatives. I’m personally a fan of “y’all.” :)

+
+
+

My Favorite Lecture

+

Out of all of the Code in Place lectures, my favorite was the decomposition lecture. I felt that decomposition is a major key and the tips Chris gave us were excellent. I also really enjoyed the functions lectures.

+
+
+

Final Project and Demo Video

+

Instead of submitting the code we wrote for our final project, we were asked to submit a short video demonstrating how our program worked.

+

I’m glad to have been forced to learn how to make a demo video, lol. It’s a skill I could have indefinitely put off learning, but now that I know how to do it and how easy and useful it is, I intend to make more demo videos like this in the future.

+

I really liked the idea of creating a working program based on my own creativity and presenting it.

+
+
+

Finishing Strong

+

Like many people, I’ve signed up for MOOCs (Massive Open Online Courses) in the past and not completed them.

+

However, even though Code in Place was not for a grade, it was a priority to me personally to complete all of the work expected of me. I watched every lecture, attended every section, and submitted every required assignment.

+

I was motivated by a few things:

+
    +
  • Only a small percentage of people had been accepted into the course; by not finishing, I would have taken a spot away from someone else who might have

  • +
  • I had a high level of confidence in the quality of the course

  • +
  • I felt an informal sense of accountability to my section leader and members of my section

  • +
  • I knew that by not finishing strong, I would have been hurting myself most of all by missing an opportunity

  • +
+

I appreciated the flexibility of the course though. I fell behind one week, due to a broken computer. My section leader encouraged us to show up to our sections, even if we were less prepared than we wanted to be. Showing up and taking part helped me keep on track and I was able to fully catch up later that weekend.

+
+
+

What Does Baseball Have to Do With Programming?!

+

Toward the end of the course, members of my section had a conversation about the Code in Place curriculum. Different people had different ideas about what should or shouldn’t have been included. Obviously, there is a limit to how much content can be taught in a five week timeframe and choices have to be made.

+

The debate reminded me of the “baseball” analogy I first heard of through the outstanding teaching philosophy of Jeremy Howard and Rachel Thomas of Fast AI. In their philosophy, Jeremy and Rachel contrast learning math with learning baseball. A math student could spend years studying the dry, theoretical details of the subject, before getting to the “fun” stuff of putting it to real, practical use, if he or she makes it that far. On the other hand, a “student” of baseball perhaps stumbles across an informal baseball game in progress, immediately begins to get a sense of how the entire game works, and perhaps picks up the bat and excitedly joins the game in progress.

+

Yes, there were some important concepts that weren’t included in Code in Place, but I don’t think that was the most important thing. I think Code in Place did a good job of teaching important fundamentals while also providing “fun” projects that could give students the sense of excitement of joining a game, and perhaps get them indefinitely hooked on learning and making things beyond Code in Place.

+

+

Caption: One of the fun things we learned how to do

+
+
+
+

What’s Next

+

In the past few months, I’ve also overseen an epic new Pinax release that drops support for Python 2.7 and it’s nearly finished. Meanwhile, I am making good on my vow to build on what I learned through Code in Place by taking part in 100 Days of Code. I am making fun, new things regularly now, including another bot, inspired by my Code in Place final project, that is creating some experimental image artwork that I’d like to curate into a small exhibit. I will be writing new blog posts to share what I learn.

+
+
+

Contact Me

+

Have questions or comments? I can be reached at kthrnmichel@gmail.com or on Twitter @KatiMichel.

+
+
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/search.html b/search.html new file mode 100644 index 00000000..9a5f72d6 --- /dev/null +++ b/search.html @@ -0,0 +1,149 @@ + + + + + + + Search — Portfolio 0.1 documentation + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +

Search

+ + + + +

+ Searching for multiple words only shows matches that contain + all words. +

+ + +
+ + + +
+ + +
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/searchindex.js b/searchindex.js new file mode 100644 index 00000000..63764606 --- /dev/null +++ b/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"alltitles": {"2020 Year in Review": [[0, null]], "2023 Recap": [[1, null]], "2024 Recap": [[2, null]], "21c Museum Hotel": [[8, "c-museum-hotel"]], "A Chance to Hang Out with Old Friends and Make New Friends": [[6, "a-chance-to-hang-out-with-old-friends-and-make-new-friends"]], "A Few of My Thoughts and Opinions About the Course": [[18, "a-few-of-my-thoughts-and-opinions-about-the-course"]], "A Note About American Sign Language at PyGotham": [[17, "a-note-about-american-sign-language-at-pygotham"]], "A Powerful Call-to-Action": [[17, "a-powerful-call-to-action"]], "A Related Matter: Optimizing your webapp by using django-debug-toolbar, select_related(), and prefetch_related() by Christopher Adams": [[8, "a-related-matter-optimizing-your-webapp-by-using-django-debug-toolbar-select-related-and-prefetch-related-by-christopher-adams"]], "APIs and Databases": [[22, "apis-and-databases"]], "About Me": [[3, null]], "About Stanford Code in Place": [[18, "about-stanford-code-in-place"]], "About:": [[12, null]], "Academy Museum of Motion Pictures": [[13, "academy-museum-of-motion-pictures"]], "Accepting Your Successes": [[17, "accepting-your-successes"]], "Agile and Scrum": [[22, "agile-and-scrum"]], "All the Places Scraper": [[11, "all-the-places-scraper"]], "Allegheny Riverfront": [[16, "allegheny-riverfront"]], "An Approach to Lightweight Tenancy Management Using Django Rest Framework": [[6, "an-approach-to-lightweight-tenancy-management-using-django-rest-framework"]], "Andy Warhol Museum": [[16, "andy-warhol-museum"]], "Annual Reviews:": [[12, null]], "Another Great Adventure": [[6, "another-great-adventure"], [8, "another-great-adventure"]], "Application and Acceptance": [[18, "application-and-acceptance"]], "April": [[2, "april"]], "Assignment 1: Karel the Robot": [[18, "assignment-1-karel-the-robot"]], "Assignment 2: Simple Python": [[18, "assignment-2-simple-python"]], "Assignment 3: Images": [[18, "assignment-3-images"]], "Assignments and Final Project": [[18, "assignments-and-final-project"]], "Async Django": [[5, "async-django"]], "August": [[2, "august"]], "Back to Kansas for Christmas": [[13, "back-to-kansas-for-christmas"]], "Background": [[14, "background"]], "Barry Warsaw: Steering Council Overview": [[16, "barry-warsaw-steering-council-overview"]], "Before I Begin": [[4, "before-i-begin"]], "Black Python Devs Leadership Summit": [[8, "black-python-devs-leadership-summit"]], "Blog Post": [[5, "blog-post"], [15, "blog-post"], [17, "blog-post"]], "Blue Daisy": [[13, "blue-daisy"]], "Board Games for My Nieces": [[2, "board-games-for-my-nieces"]], "Board Photos": [[19, "board-photos"]], "Breakfast": [[16, "breakfast"], [16, "id1"]], "Bruno\u2019s Ristorante Italiano": [[13, "bruno-s-ristorante-italiano"], [13, "id3"]], "Building a JIT compiler for CPython": [[16, "building-a-jit-compiler-for-cpython"]], "Building a Taco John\u2019s Scraper": [[4, null]], "Celebrity Homes Bus Tour": [[13, "celebrity-homes-bus-tour"]], "Centerfest": [[8, "centerfest"]], "Certifications": [[22, "certifications"]], "Choosing Wisely: SPA vs. HTMX for Your Next Web Project by Chris May": [[8, "choosing-wisely-spa-vs-htmx-for-your-next-web-project-by-chris-may"]], "CircleCI": [[14, "circleci"]], "Closing Keynote": [[17, "closing-keynote"]], "Clouds": [[2, "clouds"]], "Cocoa Cinnamon": [[8, "cocoa-cinnamon"]], "Coherence Demo": [[6, "coherence-demo"]], "Comedy in English": [[13, "comedy-in-english"]], "Condado Tacos": [[16, "condado-tacos"]], "Conference Conclusion": [[6, "conference-conclusion"]], "Conference Snapshots": [[2, "conference-snapshots"]], "Conferences Recaps:": [[12, null]], "Connections Made": [[8, "connections-made"]], "Considerations": [[4, "considerations"]], "Contact Me": [[18, "contact-me"]], "Contrasting the Implementations": [[21, "contrasting-the-implementations"]], "Coverage Report": [[14, "coverage-report"]], "DEFNA": [[1, "defna"]], "DEFNA Board Dinner": [[6, "defna-board-dinner"], [8, "defna-board-dinner"]], "DFW Pythoneers": [[2, "dfw-pythoneers"]], "Daily Work": [[1, "daily-work"]], "Darna Mediterranean Eatery": [[2, "darna-mediterranean-eatery"]], "Data Structures and Algorithms": [[22, "data-structures-and-algorithms"]], "December": [[2, "december"]], "Deep-Dive Day": [[5, "deep-dive-day"]], "Deep-Dive Day Wrap Up": [[5, "deep-dive-day-wrap-up"]], "Description": [[5, "description"], [15, "description"], [17, "description"]], "DevICT Hacktoberfest Meetup- Get a Jumpstart on Collaboration and Code Review in GitHub Talk": [[19, "devict-hacktoberfest-meetup-get-a-jumpstart-on-collaboration-and-code-review-in-github-talk"]], "Developer News": [[22, "developer-news"]], "Development Sprints and More Sight Seeing": [[15, "development-sprints-and-more-sight-seeing"]], "Dinner and Ice Cream": [[16, "dinner-and-ice-cream"]], "Diversity and Inclusion": [[1, "diversity-and-inclusion"]], "Django Framework Deep-Dives": [[5, "django-framework-deep-dives"]], "Django Girls Workshop": [[6, "django-girls-workshop"]], "Django News Newsletter": [[1, "django-news-newsletter"]], "Django Social": [[6, "django-social"], [8, "django-social"]], "Django Social T-Shirt": [[6, "django-social-t-shirt"], [8, "django-social-t-shirt"]], "Django/React Template README.md Improvement": [[11, "django-react-template-readme-md-improvement"]], "DjangoCon Africa": [[6, "djangocon-africa"]], "DjangoCon US": [[1, "djangocon-us"], [2, "djangocon-us"]], "DjangoCon US 2017": [[10, "djangocon-us-2017"], [19, "djangocon-us-2017"]], "DjangoCon US 2017- Get a Jumpstart on Collaboration and Code Review in GitHub Talk": [[19, "djangocon-us-2017-get-a-jumpstart-on-collaboration-and-code-review-in-github-talk"]], "DjangoCon US 2018": [[10, "djangocon-us-2018"], [19, "djangocon-us-2018"]], "DjangoCon US 2018- State of Django Panel": [[19, "djangocon-us-2018-state-of-django-panel"]], "DjangoCon US 2019": [[10, "djangocon-us-2019"], [19, "djangocon-us-2019"]], "DjangoCon US 2019 Recap": [[5, null]], "DjangoCon US 2021": [[10, "djangocon-us-2021"], [19, "djangocon-us-2021"]], "DjangoCon US 2022": [[10, "djangocon-us-2022"], [19, "djangocon-us-2022"]], "DjangoCon US 2023": [[10, "djangocon-us-2023"], [19, "djangocon-us-2023"], [19, "id1"]], "DjangoCon US 2023 Recap": [[2, "djangocon-us-2023-recap"], [6, null]], "DjangoCon US 2023 Topics Inspiration List": [[7, null]], "DjangoCon US 2024": [[10, "djangocon-us-2024"], [10, "id1"]], "DjangoCon US 2024 Recap": [[8, null]], "DjangoCon US 2024 Topics Inspiration List": [[9, null]], "DjangoCon US Featured Post": [[2, "djangocon-us-featured-post"]], "DjangoCon US Talk Topic Inspiration Lists:": [[12, null]], "DjangoCon US Talk Topics Inspiration List": [[2, "djangocon-us-talk-topics-inspiration-list"]], "DjangoCon US Website Design": [[2, "djangocon-us-website-design"]], "DjangoCon US Website and Design": [[8, "djangocon-us-website-and-design"]], "Dolby Theater Tour": [[13, "dolby-theater-tour"]], "Don\u2019t Buy the \u201cAI\u201d Hype": [[6, "don-t-buy-the-ai-hype"]], "Downtown Los Angeles": [[13, "downtown-los-angeles"]], "Duke Chapel": [[6, "duke-chapel"]], "Duquesne Incline": [[16, "duquesne-incline"]], "Durham Food Hall": [[8, "durham-food-hall"]], "Durham Market Culture": [[8, "durham-market-culture"]], "Emily Morehouse: Councils and Working Groups Update": [[16, "emily-morehouse-councils-and-working-groups-update"]], "Employee Appreciation Week": [[2, "employee-appreciation-week"]], "End of Santa Monica Pier at Sunset": [[13, "end-of-santa-monica-pier-at-sunset"]], "Engineering and Management": [[22, "engineering-and-management"]], "Error Culture by Ryan Cheley": [[8, "error-culture-by-ryan-cheley"]], "Ethan Smith": [[16, "ethan-smith"]], "Expo Hall Booths Thursday and Friday": [[16, "expo-hall-booths-thursday-and-friday"]], "Family Tragedy": [[2, "family-tragedy"]], "Faster, leaner, greener: 10x lower website carbon emissions by Thibaud Colas": [[8, "faster-leaner-greener-10x-lower-website-carbon-emissions-by-thibaud-colas"]], "Favorite Conference Snapshots": [[10, null]], "Favorite Snapshots Throughout The Year": [[2, "favorite-snapshots-throughout-the-year"]], "February": [[2, "february"]], "Fig and Ash": [[16, "fig-and-ash"]], "Final Project": [[18, "final-project"]], "Final Project and Demo Video": [[18, "final-project-and-demo-video"]], "Financial Advisor": [[2, "financial-advisor"]], "Finding Purpose in Open Source Through Community Building": [[6, "finding-purpose-in-open-source-through-community-building"]], "Finishing Strong": [[18, "finishing-strong"]], "Friday": [[13, "friday"], [13, "id5"], [15, "friday"], [16, "friday"], [17, "friday"]], "Friday Talks": [[17, "friday-talks"]], "Fried Green Tomatoes :)": [[6, "fried-green-tomatoes"]], "General Engineering Resources": [[22, "general-engineering-resources"]], "General Python and Django Learning Resources": [[22, "general-python-and-django-learning-resources"]], "Getting Ready": [[15, "getting-ready"]], "GitHub Universe 2019": [[10, "github-universe-2019"]], "Gregory P. Smith: Steering Council Expenditures Update": [[16, "gregory-p-smith-steering-council-expenditures-update"]], "Gym": [[2, "gym"]], "HTML-ivating your Django web app\u2019s experience with HTMX, AlpineJS, and streaming HTML": [[6, "html-ivating-your-django-web-app-s-experience-with-htmx-alpinejs-and-streaming-html"]], "Hacktoberfest PRs- 2020": [[11, null]], "Hallway Track": [[16, "hallway-track"], [17, "hallway-track"]], "Hallway Track and Expo Hall": [[16, "hallway-track-and-expo-hall"], [16, "id2"]], "Hallway track": [[6, "hallway-track"], [8, "hallway-track"]], "Harvest Moon": [[1, "harvest-moon"]], "Heinz History Center": [[16, "heinz-history-center"]], "Hidden gems of Django 5.x by Sarah Boyce": [[8, "hidden-gems-of-django-5-x-by-sarah-boyce"]], "Hollywood Walk of Fame": [[13, "hollywood-walk-of-fame"]], "Hollywood Walk of Fame, TCL Theatre, Hollywood Sign, Dolby Theater": [[13, "hollywood-walk-of-fame-tcl-theatre-hollywood-sign-dolby-theater"]], "How CPython Works": [[22, "how-cpython-works"]], "How Companies Do Things": [[22, "how-companies-do-things"]], "How Location Pages Work on the Taco John\u2019s Website": [[4, "how-location-pages-work-on-the-taco-john-s-website"]], "Ice at Santa Monica": [[13, "ice-at-santa-monica"]], "If We Had $1,000,000: What Could The DSF Do With 4x Its Budget? by Jacob Kaplan-Moss": [[8, "if-we-had-1-000-000-what-could-the-dsf-do-with-4x-its-budget-by-jacob-kaplan-moss"]], "Implementations I Considered": [[21, "implementations-i-considered"]], "In Closing": [[6, "in-closing"]], "Inclusion": [[18, "inclusion"]], "Innovation Week Global Hackathon": [[2, "innovation-week-global-hackathon"]], "Inside Out: My Journey of Understanding Inclusion": [[6, "inside-out-my-journey-of-understanding-inclusion"]], "Intro": [[6, "intro"], [8, "intro"], [13, "intro"], [16, "intro"]], "It\u2019s Going to Be Great": [[15, "its-going-to-be-great"]], "It\u2019s Not the End": [[15, "its-not-the-end"]], "JPMorgan Chase 2023- DjangoCon US Recap": [[19, "jpmorgan-chase-2023-djangocon-us-recap"]], "JPMorganChase Eclipse Watch Party": [[2, "jpmorganchase-eclipse-watch-party"]], "JPMorganChase Plano Chinese Lunar New Year Celebration": [[2, "jpmorganchase-plano-chinese-lunar-new-year-celebration"]], "January": [[2, "january"]], "Join Us?": [[5, "join-us"]], "Juggling": [[16, "juggling"]], "July": [[2, "july"]], "June": [[2, "june"]], "K. Jay Miller Keynote": [[16, "k-jay-miller-keynote"]], "Key": [[22, "key"]], "Keynote - How To Be A Developer and Other Lies We Tell Ourselves by Mario Munoz": [[8, "keynote-how-to-be-a-developer-and-other-lies-we-tell-ourselves-by-mario-munoz"]], "Keynote - Power to the People who Teach the People by Sheena O\u2019Connell": [[8, "keynote-power-to-the-people-who-teach-the-people-by-sheena-o-connell"]], "Keynote - The Fellowship of the Pony by Natalia Bidart": [[8, "keynote-the-fellowship-of-the-pony-by-natalia-bidart"]], "Kinesis Advantage360": [[2, "kinesis-advantage360"]], "Knowing Which Versions of Python and Django to Include": [[14, "knowing-which-versions-of-python-and-django-to-include"]], "Kojo Idressa and Peter Grandstaff Kick Off the Conference": [[6, "kojo-idressa-and-peter-grandstaff-kick-off-the-conference"]], "Lectures and Assignments": [[18, "lectures-and-assignments"]], "Lemurs at Tanganyka Wildlife Park": [[2, "lemurs-at-tanganyka-wildlife-park"]], "Lightbulb Moment": [[21, "lightbulb-moment"]], "Lightning Talk Cameo": [[8, "lightning-talk-cameo"]], "Loaf": [[6, "loaf"]], "Looking Ahead": [[1, "looking-ahead"]], "Los Angeles 2023": [[13, null]], "Los Angeles 2023 Trip Recap": [[2, "los-angeles-2023-trip-recap"]], "Los Angeles City Hall Observation Deck": [[13, "los-angeles-city-hall-observation-deck"]], "Luci\u2019s Bakery": [[2, "luci-s-bakery"]], "Make Your Own": [[21, "make-your-own"]], "Making a Scraper for Hacktoberfest": [[4, "making-a-scraper-for-hacktoberfest"]], "March": [[2, "march"]], "May": [[2, "may"]], "McClaren Sports Cars": [[2, "mcclaren-sports-cars"]], "Measuring the performance of CPython": [[16, "measuring-the-performance-of-cpython"]], "Meeting Lorenzo": [[8, "meeting-lorenzo"]], "Meeting the New Django Fellow Natalia Bidart": [[6, "meeting-the-new-django-fellow-natalia-bidart"]], "Meeting the New PSF Executive Director Deb Nicholson": [[6, "meeting-the-new-psf-executive-director-deb-nicholson"]], "Mel\u2019s Drive-In": [[13, "mel-s-drive-in"]], "Monday": [[5, "monday"], [6, "monday"], [8, "monday"], [13, "monday"], [16, "monday"]], "More Great Books": [[22, "more-great-books"]], "More Sight Seeing and Food!": [[8, "more-sight-seeing-and-food"]], "Mother and Sons": [[8, "mother-and-sons"]], "Museum of Life and Science": [[6, "museum-of-life-and-science"]], "My Craft:": [[12, null]], "My Favorite Lecture": [[18, "my-favorite-lecture"]], "My Journey Through Implementations": [[21, "my-journey-through-implementations"]], "My TIL Requirements": [[21, "my-til-requirements"]], "My Top Picks": [[13, "my-top-picks"]], "Navigating Django\u2019s Future: Djangonaut Space": [[6, "navigating-django-s-future-djangonaut-space"]], "New Certifications": [[1, "new-certifications"]], "North Italia": [[13, "north-italia"]], "Noticeable Sightings at the Conference Center": [[16, "noticeable-sightings-at-the-conference-center"]], "November": [[2, "november"]], "October": [[2, "october"]], "Opening Reception at the Expo Hall": [[16, "opening-reception-at-the-expo-hall"]], "Organizer Photos": [[19, "organizer-photos"]], "Overcoming GIL with subinterpreters and immutability": [[16, "overcoming-gil-with-subinterpreters-and-immutability"]], "PS Connect": [[1, "ps-connect"]], "PSF Members Luncheon": [[16, "psf-members-luncheon"]], "Pablo Galindo Salgado: Free-Threading Update (a.k.a. No GIL)": [[16, "pablo-galindo-salgado-free-threading-update-a-k-a-no-gil"]], "Panel Discussion: Open, friendly, and welcoming: on the history and future of mentoring in Django": [[8, "panel-discussion-open-friendly-and-welcoming-on-the-history-and-future-of-mentoring-in-django"]], "Parizade": [[6, "parizade"]], "Parting Thoughts": [[2, "parting-thoughts"]], "Parts and Labor, The Parlour, and Back to the Hotel": [[6, "parts-and-labor-the-parlour-and-back-to-the-hotel"]], "Petersen Automotive Museum": [[13, "petersen-automotive-museum"]], "Photos and Tea": [[16, "photos-and-tea"]], "Pic with Julie": [[2, "pic-with-julie"]], "Pinax Release": [[0, "pinax-release"]], "Pinax Release Tutorial": [[14, null]], "Pizzeria Toro": [[6, "pizzeria-toro"]], "Plano Fun": [[1, "plano-fun"]], "Podcasts": [[22, "podcasts"]], "Posters": [[16, "posters"]], "PostgreSQL Beyond Django: Strategies to Get Max Performance by \u00c1lvaro Justen": [[8, "postgresql-beyond-django-strategies-to-get-max-performance-by-alvaro-justen"]], "Pre-Conference Activities": [[6, "pre-conference-activities"], [8, "pre-conference-activities"]], "Press Coffee, Crepes, and Cocktails": [[8, "press-coffee-crepes-and-cocktails"]], "Press Coffee, Crepes,and Cocktails": [[6, "press-coffee-crepes-and-cocktails"]], "Preventative Care": [[2, "preventative-care"]], "Product": [[22, "product"]], "Profile Pic": [[16, "profile-pic"]], "Public Speaking": [[0, "public-speaking"]], "PyCascades 2020": [[0, "pycascades-2020"], [10, "pycascades-2020"]], "PyCon US 2019": [[10, "pycon-us-2019"]], "PyCon US 2019 Recap": [[15, null]], "PyCon US 2024": [[2, "pycon-us-2024"], [10, "pycon-us-2024"]], "PyCon US 2024 Recap": [[2, "pycon-us-2024-recap"], [16, null]], "PyGotham 2017": [[10, "pygotham-2017"]], "PyGotham 2018": [[10, "pygotham-2018"]], "PyGotham 2019 Recap": [[17, null]], "PyLadies Auction": [[16, "pyladies-auction"]], "PyLadies Lunch": [[16, "pyladies-lunch"]], "PyTexas 2024": [[2, "pytexas-2024"], [10, "pytexas-2024"]], "Python Books": [[22, "python-books"]], "Python Tutorials and Teachers": [[22, "python-tutorials-and-teachers"]], "Python Use Spectrum": [[17, "python-use-spectrum"]], "Python and Django Authorities": [[22, "python-and-django-authorities"]], "Python and Django Features and Release": [[22, "python-and-django-features-and-release"]], "Python and WebAssembly": [[5, "python-and-webassembly"]], "Python, Governments, and Contracts": [[17, "python-governments-and-contracts"]], "Quality, Standards, Inner source": [[1, "quality-standards-inner-source"]], "Queeny\u2019s": [[8, "queeny-s"]], "Refactoring, Patterns, Clean Code": [[22, "refactoring-patterns-clean-code"]], "Reflections on Stanford Code in Place": [[18, null]], "Regex Pattern Explanation": [[4, "regex-pattern-explanation"]], "Release Highlights": [[0, "release-highlights"]], "Release Plan": [[14, "release-plan"]], "Republique": [[13, "republique"], [13, "id1"]], "Required Setup": [[14, "required-setup"]], "Rodeo Drive": [[13, "rodeo-drive"]], "Rooftop View of Durham": [[8, "rooftop-view-of-durham"]], "Running the Test Matrix Locally Using tox": [[14, "running-the-test-matrix-locally-using-tox"]], "Santa Monica Beach at Sunset and Pier Burger": [[13, "santa-monica-beach-at-sunset-and-pier-burger"]], "Santa Monica Pier Carousel": [[13, "santa-monica-pier-carousel"]], "Santa Monica Pier at Night": [[13, "santa-monica-pier-at-night"]], "Santa Monica Promenade": [[13, "santa-monica-promenade"]], "Santa Monica and Venice Beaches": [[13, "santa-monica-and-venice-beaches"]], "Sarah P. Duke Gardens": [[6, "sarah-p-duke-gardens"], [8, "sarah-p-duke-gardens"]], "Saturday": [[13, "saturday"], [15, "saturday"], [16, "saturday"]], "Sections": [[18, "sections"]], "September": [[2, "september"]], "Shrimp and Grits": [[8, "shrimp-and-grits"]], "Sight Seeing": [[5, "sight-seeing"]], "Sight Seeing and More Food!": [[6, "sight-seeing-and-more-food"]], "Sightseeing Downtown": [[16, "sightseeing-downtown"]], "Sightseeing and Some Great Meals": [[8, "sightseeing-and-some-great-meals"]], "Simon Says Dip This": [[6, "simon-says-dip-this"]], "Simon Willison Keynote": [[16, "simon-willison-keynote"]], "Speaker Photos": [[19, "speaker-photos"]], "Speaker and Organizer Dinner": [[6, "speaker-and-organizer-dinner"], [8, "speaker-and-organizer-dinner"]], "Speaker, Board, and Organizer Photos": [[19, null]], "Sprints": [[5, "sprints"], [8, "sprints"]], "Stanford Code in Place Article": [[1, "stanford-code-in-place-article"]], "Stanford Code in Place and 100 Days of Code": [[0, "stanford-code-in-place-and-100-days-of-code"]], "Statue of Liberty and Ellis Island": [[17, "statue-of-liberty-and-ellis-island"]], "Steering Council Updates": [[16, "steering-council-updates"]], "Step Changes Recap": [[0, "step-changes-recap"]], "Stepping Through the Program": [[4, "stepping-through-the-program"]], "Strange Loop 2019": [[10, "strange-loop-2019"]], "Sumana Harihareswara Keynote": [[16, "sumana-harihareswara-keynote"]], "Summer Fun for My Nieces": [[2, "summer-fun-for-my-nieces"]], "Sunday": [[13, "sunday"], [15, "sunday"], [16, "sunday"]], "Swag": [[8, "swag"]], "Swag Stuffing": [[6, "swag-stuffing"], [8, "swag-stuffing"]], "Sync vs. Async in Python: Tools, Benchmarks, and ASGI/WSGI Explained": [[16, "sync-vs-async-in-python-tools-benchmarks-and-asgi-wsgi-explained"]], "T Swirl Japanese Crepe": [[2, "t-swirl-japanese-crepe"]], "TIL- 100 Days of Code Version": [[21, null], [21, "id1"]], "TL;DR": [[0, "tl-dr"], [14, "tl-dr"]], "Table of Contents": [[6, "table-of-contents"], [8, "table-of-contents"], [13, "table-of-contents"], [16, "table-of-contents"], [19, "table-of-contents"]], "Tacos 1986 and Santa Monica Beach at Sunset": [[13, "tacos-1986-and-santa-monica-beach-at-sunset"]], "Tagging and Publishing": [[14, "tagging-and-publishing"]], "Takeaways": [[13, "takeaways"]], "Tanganyka Wildlife Park": [[2, "tanganyka-wildlife-park"]], "Tangential Learning": [[1, "tangential-learning"]], "Test Matrix Configurations": [[14, "test-matrix-configurations"]], "Testing": [[22, "testing"]], "Testing Modern Web Apps Like a Champion": [[6, "testing-modern-web-apps-like-a-champion"]], "Thank You": [[17, "thank-you"]], "Thank You Dinner": [[5, "thank-you-dinner"]], "The Boxcar Bar and Arcade": [[8, "the-boxcar-bar-and-arcade"]], "The Can Opener": [[8, "the-can-opener"]], "The Cecil Hotel": [[13, "the-cecil-hotel"]], "The Challenge": [[4, "the-challenge"]], "The Durham Hotel": [[8, "the-durham-hotel"]], "The Getty Center": [[13, "the-getty-center"]], "The Grammy Museum": [[13, "the-grammy-museum"]], "The Griffith Observatory": [[13, "the-griffith-observatory"]], "The Most Important Python Content of 2024": [[20, null]], "The Natural State of Computers": [[5, "the-natural-state-of-computers"]], "The Parlour": [[8, "the-parlour"]], "The Solution": [[4, "the-solution"]], "The Wharton School and Simpl": [[0, "the-wharton-school-and-simpl"]], "This Year\u2019s Theme": [[2, "this-year-s-theme"]], "Thomas Wouters: Overview of Python 3.13": [[16, "thomas-wouters-overview-of-python-3-13"]], "Thursday": [[8, "thursday"], [13, "thursday"], [13, "id4"], [15, "thursday"], [16, "thursday"]], "Transformational Leadership": [[22, "transformational-leadership"]], "Travel Serendipity": [[13, "travel-serendipity"]], "Travel, Food, and Fun": [[1, "travel-food-and-fun"]], "Travel:": [[12, null]], "Troubleshooting is a Lifestyle \ud83d\ude0e by Jack Linke": [[8, "troubleshooting-is-a-lifestyle-by-jack-linke"]], "Tuesday": [[5, "tuesday"], [6, "tuesday"], [8, "tuesday"], [13, "tuesday"]], "Universal Theme Park": [[13, "universal-theme-park"]], "Unlocking Performance: Benchmarking and profiling Django for Maximum Efficiency by Ron Maravanyika": [[8, "unlocking-performance-benchmarking-and-profiling-django-for-maximum-efficiency-by-ron-maravanyika"]], "Unlocking the Parallel Universe: Subinterpreters and Free-Threading in Python 3.13": [[16, "unlocking-the-parallel-universe-subinterpreters-and-free-threading-in-python-3-13"]], "Unscripted Rooftop Pool": [[8, "unscripted-rooftop-pool"]], "Until Next Time": [[16, "until-next-time"]], "Venue Selection": [[8, "venue-selection"]], "Via Alloro": [[13, "via-alloro"]], "Visa Frustration": [[8, "visa-frustration"]], "Warner Brothers Studio Tour": [[13, "warner-brothers-studio-tour"]], "Warner Brothers Studio Tour versus Universal Studios Tour": [[13, "warner-brothers-studio-tour-versus-universal-studios-tour"]], "Wednesday": [[6, "wednesday"], [8, "wednesday"], [13, "wednesday"], [13, "id2"], [16, "wednesday"]], "Welcome to Kati\u2019s Portfolio!": [[12, null]], "Wellness Screening": [[2, "wellness-screening"]], "What Can the DSF Do for Me? What Can I Do for the DSF?": [[6, "what-can-the-dsf-do-for-me-what-can-i-do-for-the-dsf"]], "What Does Baseball Have to Do With Programming?!": [[18, "what-does-baseball-have-to-do-with-programming"]], "What I Am Paying Attention to in 2024": [[22, null]], "What I Got Out of the Course": [[18, "what-i-got-out-of-the-course"]], "What I Learned About Performance": [[21, "what-i-learned-about-performance"]], "What Universal Studios Tour Had Going For It": [[13, "what-universal-studios-tour-had-going-for-it"]], "What Warner Brothers Had Going For It": [[13, "what-warner-brothers-had-going-for-it"]], "What is Scraping?": [[4, "what-is-scraping"]], "What\u2019s Next": [[18, "what-s-next"]], "Why Do a New Release?": [[14, "why-do-a-new-release"]], "Work": [[2, "work"]], "Wrapping Up": [[4, "wrapping-up"]], "Writing Content Using String Versus List": [[21, "writing-content-using-string-versus-list"]], "YT Higher Lower": [[11, "yt-higher-lower"]], "Yoshi Shabu Shabu": [[2, "yoshi-shabu-shabu"]], "Your Web Framework Needs You": [[5, "your-web-framework-needs-you"]], "os.listdir(), TIL Dictionary, and Python Standard Library": [[21, "os-listdir-til-dictionary-and-python-standard-library"]], "os.walk() and Program Structure": [[21, "os-walk-and-program-structure"]], "pugdebug PyPI Package": [[11, "pugdebug-pypi-package"]], "tox Output": [[14, "tox-output"]], "tox Test Environments": [[14, "tox-test-environments"]]}, "docnames": ["2020-year-in-review", "2023-recap", "2024-recap", "about-me", "building-a-taco-johns-scraper", "djangocon-us-2019-recap", "djangocon-us-2023-recap", "djangocon-us-2023-topics-inspiration-list", "djangocon-us-2024-recap", "djangocon-us-2024-topics-inspiration-list", "favorite-conference-snapshots", "hacktoberfest-prs-2020", "index", "los-angeles-2023", "pinax-release-tutorial", "pycon-us-2019-recap", "pycon-us-2024-recap", "pygotham-2019-recap", "reflections-on-stanford-code-in-place", "speaker-board-and-organizer-photos", "the-most-important-python-content-of-2024", "til-100-days-of-code-version", "what-i-am-paying-attention-to-in-2024"], "envversion": {"sphinx": 63, "sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2}, "filenames": ["2020-year-in-review.md", "2023-recap.md", "2024-recap.md", "about-me.md", "building-a-taco-johns-scraper.md", "djangocon-us-2019-recap.md", "djangocon-us-2023-recap.md", "djangocon-us-2023-topics-inspiration-list.md", "djangocon-us-2024-recap.md", "djangocon-us-2024-topics-inspiration-list.md", "favorite-conference-snapshots.md", "hacktoberfest-prs-2020.md", "index.rst", "los-angeles-2023.md", "pinax-release-tutorial.md", "pycon-us-2019-recap.md", "pycon-us-2024-recap.md", "pygotham-2019-recap.md", "reflections-on-stanford-code-in-place.md", "speaker-board-and-organizer-photos.md", "the-most-important-python-content-of-2024.md", "til-100-days-of-code-version.md", "what-i-am-paying-attention-to-in-2024.md"], "indexentries": {}, "objects": {}, "objnames": {}, "objtypes": {}, "terms": {"": [0, 1, 5, 7, 9, 10, 11, 14, 16, 17, 21, 22], "0": [0, 4, 5, 6, 11, 14, 21], "00": 2, "000": [2, 4, 6, 16, 18], "0009": 5, "000x": 16, "01": 14, "0471": 21, "08": 4, "09": 4, "0936": 4, "0x9ed745c4be038bd6": 4, "1": [0, 2, 4, 5, 6, 10, 11, 13, 14, 15, 16, 21], "10": [0, 1, 2, 4, 6, 7, 9, 14, 15, 16, 17, 18], "100": [6, 12, 14, 16, 18, 22], "1000": 5, "10th": 16, "10x": 6, "11": [0, 6, 8, 16, 22], "1101": 4, "12": [2, 6, 14, 16, 17], "120": 2, "1200": 5, "1262": 5, "13": [10, 11, 18, 19], "130": 6, "1328": 5, "14": [0, 1, 6, 10, 16, 19], "15": [2, 4, 6, 10, 14, 16, 21], "150": 16, "152": 2, "158": 1, "15z": 4, "16": [6, 10, 19], "160": 0, "1626": 4, "1634": 11, "1639": 11, "17": [9, 19], "1738": 13, "18": [10, 16, 19], "185": 1, "186": 2, "189": 2, "19": [2, 10, 19], "1908": 17, "1912": 17, "194": 2, "1940": 8, "1980": 6, "1997": 6, "1s0x0": 4, "1st": 2, "2": [0, 2, 4, 6, 8, 11, 13, 14, 16, 21], "20": [0, 2, 6, 10, 16, 17, 19, 21, 22], "200": [4, 6, 16], "2008": 6, "2016": [6, 15], "2017": [0, 6, 11, 12, 16, 17], "2018": [5, 6, 8, 12, 15, 16, 21], "2019": [6, 8, 12, 16, 22], "2020": [1, 2, 4, 12, 16, 17], "2021": [1, 12, 16], "2022": [2, 6, 12, 16], "2023": [8, 12, 16], "2024": [1, 6, 12], "2025": 8, "2026": 16, "20th": 16, "21": [2, 10, 19], "215": 17, "21c": 10, "22": [2, 5, 8, 10, 14, 19], "23": [2, 6, 10], "23rd": 4, "24": [2, 8], "24786129593849": 4, "2478613": 4, "25": [4, 6, 16], "255": 8, "26": [11, 13], "27": [5, 8, 10, 15, 19], "28": [0, 5, 19], "282": 16, "28th": 8, "29": [1, 2], "290": 5, "2nd": [2, 22], "3": [0, 5, 6, 8, 9, 10, 11, 13, 14, 21, 22], "30": [0, 6, 13, 15, 16], "300": [16, 17], "310": 14, "32": 14, "360": 6, "37": 14, "38": [4, 14], "39": 14, "3d": 2, "3d38": 4, "3m4": 4, "3x": [8, 16], "4": [0, 6, 8, 14, 16, 17], "40": [5, 14, 15, 16], "400": 16, "404": 6, "41": 14, "4107": 4, "427": 16, "44": 16, "45": [0, 5, 13], "48": 13, "4d": 4, "4m5": 4, "5": [0, 2, 5, 6, 10, 14, 15, 16, 18, 21], "50": [0, 13, 16], "500": [2, 6, 8], "59": 6, "594": 16, "6": [0, 1, 6, 7, 10, 11, 14, 15, 16, 19], "60": [5, 16, 17], "602": 16, "66044": 4, "696": 16, "6th": 4, "6x": 16, "7": [0, 1, 6, 10, 11, 14, 18], "70": [2, 4, 8], "700": 16, "702": 16, "703": 16, "705": 16, "729": 16, "730": 16, "731": 16, "732": 16, "738": 16, "742": 16, "744": 16, "75": 16, "750": 2, "750k": 2, "770": 4, "785": 4, "79": 14, "7th": 17, "8": [0, 8, 10, 11, 14, 18, 21], "80": [0, 6, 18], "800": 18, "84": 6, "843": 4, "8m2": 4, "9": [1, 10, 11, 13, 14, 17, 21], "90": [5, 16], "900": 2, "90028": 13, "90th": 8, "91": 2, "93": 6, "95": 4, "971": 5, "9728433610435": 4, "9728434": 4, "99": 16, "A": [0, 1, 2, 4, 5, 10, 11, 12, 13, 14, 15, 16, 21, 22], "And": [0, 5, 6, 15, 17], "As": [0, 2, 4, 5, 6, 8, 10, 13, 14, 15, 16, 17, 18, 21], "At": [0, 5, 6, 8, 10, 13, 16, 17, 18, 21], "BY": 6, "Be": [4, 6, 12, 16, 22], "Being": [6, 8, 17, 22], "But": [4, 5, 6, 16, 17, 21], "By": [2, 6, 14, 15, 17, 18], "For": [0, 1, 4, 5, 6, 7, 8, 10, 11, 14, 16, 18, 21], "If": [4, 5, 6, 13, 14, 16, 17, 22], "In": [0, 1, 2, 4, 5, 8, 10, 11, 12, 14, 15, 16, 17, 18, 21], "Ins": 5, "Into": [5, 8], "It": [0, 1, 2, 5, 6, 8, 10, 11, 12, 14, 16, 17, 18, 21], "Its": 6, "No": [8, 17], "Not": [0, 2, 6, 8, 10, 12, 13, 14, 16, 17, 18, 22], "On": [1, 2, 5, 6, 7, 8, 10, 13, 15, 16, 17, 18, 19], "One": [0, 2, 4, 5, 6, 8, 10, 13, 16, 17, 18, 21, 22], "That": [0, 2, 5, 6, 13, 15, 16], "The": [1, 7, 9, 11, 12, 14, 15, 16, 17, 18, 21, 22], "Their": [5, 16], "Then": [14, 16], "There": [0, 2, 5, 13, 16, 17, 18, 21], "These": [2, 4, 6, 14, 16, 21], "To": [4, 6, 14, 16, 18], "Will": 6, "Willing": [1, 2, 10, 16], "With": [0, 1, 5, 6, 13], "__file__": 11, "aaron": 16, "aback": 0, "abbr": 4, "abdullah": 16, "abdur": 16, "abi": 16, "abigail": [6, 8, 10, 16], "abil": [8, 17, 18, 21], "abl": [0, 2, 6, 8, 14, 16, 17, 18, 21], "about": [0, 1, 2, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15, 16, 22], "abov": [5, 6, 13], "abraham": 8, "absolut": [0, 2, 6, 8, 13, 21], "absorb": 8, "abstract": [4, 6, 8, 13, 18], "abund": 15, "accept": [0, 5, 6, 8, 10, 11, 12, 15, 16], "access": [0, 4, 6, 8, 9, 14, 16, 17, 18, 21], "accid": 18, "accident": 6, "accommod": 16, "accomplish": [6, 15], "accord": [6, 8, 17, 21], "accordingli": 0, "account": [0, 2, 4, 6, 11, 17, 18, 21], "accoust": 5, "accur": 17, "accuraci": 16, "achiev": [0, 5, 6, 16, 17, 18, 22], "acknowledg": [0, 8, 16], "acknowleg": [5, 6], "ackon": 6, "acount": 6, "acquir": 1, "acr": 6, "across": [0, 1, 2, 4, 6, 8, 11, 13, 15, 16, 18, 21], "act": [6, 8, 16], "action": [0, 5, 6, 7, 8, 9, 11, 12, 15, 18, 21], "activ": [2, 4, 12, 14, 16, 17], "actual": [0, 10, 13, 16], "ad": [0, 1, 2, 5, 6, 8, 11, 13, 14, 16, 21], "adam": [10, 19, 22], "adapt": 16, "add": [5, 6, 7, 8, 14, 15, 16, 21], "addit": [0, 1, 4, 5, 6, 8, 13, 14, 16, 17, 18, 21], "addr_ful": [4, 11], "address": [4, 7, 16], "addresscountri": 4, "addressloc": [4, 11], "addressregion": [4, 11], "adequ": 18, "admin": [6, 7, 8, 14], "admir": [5, 15, 22], "admit": [16, 18], "admittedli": 11, "adopt": [6, 16, 21], "ador": 18, "advanc": [4, 5, 6, 8, 13, 15, 22], "advantag": [2, 6, 8, 15, 16, 21], "advantage2": 2, "advent": [1, 22], "adventur": [7, 9, 13], "advers": 17, "advic": [0, 6, 8, 16, 18, 22], "advisor": 0, "advoc": [16, 17], "aerial": 0, "aerob": 2, "aerospac": 6, "affect": [8, 17, 21], "afi": [6, 8, 10, 16], "afraid": [2, 5, 8, 17], "africa": [1, 8, 16], "african": [6, 8], "afropython": 16, "after": [0, 2, 4, 5, 6, 8, 10, 11, 13, 14, 15, 16, 17, 18, 21], "afternoon": [8, 15], "afterw": 6, "afterward": [5, 6, 8, 13], "ag": [2, 18], "again": [0, 2, 4, 5, 6, 8, 10, 13, 15, 16, 17], "against": 14, "aggreg": 4, "agil": 12, "ago": [2, 16, 17], "ahead": [5, 10, 12, 13, 15, 17], "ahi": 5, "ai": [0, 2, 16, 18], "aim": 16, "aioli": 6, "air": [5, 13], "airmask": 5, "airport": [4, 17], "ajax": 6, "al": [0, 8, 9, 16, 18, 22], "alain": 13, "album": 13, "alert": [8, 15], "alex": 8, "alfr": 13, "alfredo": [5, 13], "algorithm": [12, 16, 18], "alic": 16, "alien": 13, "align": [8, 16, 18], "aliti": 8, "aliv": 16, "all": [0, 1, 2, 4, 5, 6, 8, 10, 13, 14, 15, 16, 17, 18, 21, 22], "all_articl": 21, "allard": [2, 16], "allei": 13, "allen": [6, 10, 16], "allow": [16, 17], "allowed_domain": [4, 11], "alltheplac": [4, 11], "allud": 18, "almost": [13, 16], "alon": [0, 6, 10, 13, 17], "along": [2, 5, 6, 8, 10, 13, 15, 16, 17], "alongsid": [16, 17], "alorwu": [6, 10, 16], "alpin": [6, 7, 8, 9], "alpinej": 8, "alreadi": [0, 2, 4, 5, 6, 8, 10, 13, 16, 17, 18], "also": [0, 1, 2, 4, 5, 6, 8, 10, 13, 14, 15, 16, 17, 18, 21, 22], "alt": 17, "altern": [5, 6, 8, 9, 14, 17, 18], "although": [0, 1, 2, 4, 6, 8, 10, 13, 14, 15, 16, 18, 21, 22], "alum": 18, "alumna": 6, "alvaro": 8, "alwai": [2, 4, 5, 6, 8, 10, 15, 16, 17], "am": [0, 1, 2, 5, 6, 8, 10, 12, 13, 16, 18, 19], "amanda": 16, "amaz": [0, 2, 5, 6, 8, 10, 13, 15, 22], "amazingli": 17, "amazon": [6, 16], "ambassador": [5, 6, 17], "amber": [5, 16], "ambianc": 6, "ambrosio": 16, "america": [6, 13, 15, 17], "american": [5, 6, 12, 13, 15], "amid": 5, "amnesti": 16, "amofah": [6, 8, 10, 16], "among": [1, 2, 5, 6, 9, 10, 13, 16, 17], "amount": [4, 6, 17], "amus": 13, "amusingli": 18, "an": [0, 1, 2, 4, 5, 8, 9, 10, 11, 13, 14, 15, 16, 17, 18, 21, 22], "ana": 0, "anaconda": 16, "analogi": 18, "analysi": [4, 8], "analyst": 6, "analyz": [8, 16], "anaya": 2, "ancestor": 17, "anderson": [10, 16], "andi": [6, 18, 22], "andrea": 2, "andrei": 21, "andrew": [5, 6, 16, 22], "android": [11, 16], "anecdot": 8, "angel": [1, 12, 16], "ani": [0, 1, 4, 6, 14, 15, 16, 17, 18], "anim": [6, 18], "animatron": 13, "anis": 8, "annot": 16, "announc": [6, 8, 11, 16], "annual": [6, 16], "anoth": [0, 1, 5, 11, 13, 15, 16, 17, 18, 21], "ansibl": 16, "anson": 13, "answer": [6, 8, 16, 17, 18], "anthoni": [16, 22], "anthrop": 16, "anti": [8, 21], "anticip": [5, 15], "anyhow": 13, "anyon": [5, 16], "anyth": [6, 8, 15, 16, 18], "anywai": 13, "anywher": [6, 13], "apart": [1, 6, 21], "api": [4, 5, 6, 7, 8, 9, 11, 12, 16, 17, 18], "app": [0, 5, 7, 8, 9, 11, 14, 15, 16, 17, 21], "appconf": 14, "appeal": [2, 17], "appear": [5, 6, 8, 13, 17], "append": 21, "appet": 5, "appl": [6, 11, 16], "applaud": 15, "appli": [0, 5, 6, 8, 15, 17, 18, 22], "applic": [4, 6, 8, 11, 12, 16, 22], "appreci": [5, 6, 15, 18], "apprentic": 1, "approach": [0, 5, 7, 8, 9, 11, 15, 16, 21], "approv": [11, 16, 17], "approxim": [13, 17, 18], "april": [0, 1, 10, 16, 21], "ar": [0, 2, 4, 5, 6, 8, 10, 13, 14, 16, 17, 18, 21, 22], "arbor": [10, 16], "arch": 13, "architect": 6, "architectur": [5, 6, 8, 9, 13, 16, 22], "archiv": 21, "area": [5, 6, 13], "arena": 16, "argu": [5, 6], "argument": [11, 16], "aria": 4, "arkansa": 4, "arkham": 13, "arm": 6, "armani": 13, "aromat": 8, "around": [0, 2, 5, 6, 8, 10, 13, 14, 15, 16, 17, 21, 22], "arrai": 16, "arrang": [6, 17], "arriv": [0, 2, 5, 13, 15, 16, 17], "arrow": 4, "art": [0, 2, 6, 8, 10, 13, 15, 16], "articl": [2, 4, 8, 12, 17, 21], "artifact": 13, "artifici": [6, 16], "artisan": 8, "artura": 2, "artwork": [2, 8, 13, 18], "arugula": 16, "arun": 16, "asada": 5, "asgi": 5, "ashia": 16, "ask": [0, 2, 5, 6, 8, 10, 13, 15, 16, 18], "asl": 17, "asm": 5, "aspect": [5, 6, 15, 16], "aspectlib": 8, "assert": 6, "assess": 16, "asset": [2, 5, 8], "assign": [12, 21], "assist": [5, 6, 8, 16], "associ": [5, 6, 17], "assum": [4, 16], "astronomi": 16, "asylum": 13, "async": [6, 7, 9], "asynchron": 5, "ate": [5, 6, 13, 15], "atla": 13, "atmospher": [0, 5, 6, 8, 15, 17, 18], "atom": [10, 19, 22], "atomimages509": [10, 19], "attempt": [2, 4, 6, 13, 21], "attend": [0, 1, 2, 5, 6, 8, 10, 13, 15, 16, 17, 18], "attende": [1, 5, 6, 8, 10, 13, 16], "attent": [5, 12, 16], "attir": 2, "attitud": 0, "attract": [6, 8, 22], "attribut": 6, "au": [6, 13], "auction": 15, "audienc": [0, 5, 6, 8, 11, 13], "audit": [6, 16], "augment": 16, "august": [10, 16, 19], "aunt": 2, "austen": 10, "auster": 17, "austin": [1, 2, 10], "australia": 6, "authent": [1, 5, 13], "author": [0, 2, 5, 6, 7, 10, 12, 15, 16, 17], "auto": [17, 21], "autofield": 8, "autograph": 13, "autom": [0, 6, 8, 16, 17, 18, 22], "automat": 16, "av": [4, 10, 13], "avail": [2, 6, 8, 13, 14, 16, 18], "avenu": [13, 17], "averag": [8, 16], "avid": 2, "avocado": [0, 8], "avoid": [2, 6, 8, 17, 21], "aw": [1, 6, 16, 22], "awai": [2, 6, 15, 16, 18], "await": 5, "awar": [17, 22], "award": [13, 17], "awesom": [6, 16], "awestruck": 16, "awkward": 13, "azur": 16, "b": [6, 13], "back": [0, 2, 5, 8, 15, 16, 17], "backdrop": 15, "backend": [8, 11], "background": [1, 2, 16, 17, 18], "backlot": 13, "backport": 16, "backslash": 14, "backstag": 13, "backward": [5, 16], "bacon": [6, 13], "bad": [2, 6, 8, 16], "badg": [6, 16], "badli": 13, "bag": [6, 8], "baggag": 17, "baguett": 13, "bai": [5, 16], "bakeri": [1, 6, 13], "balanc": [2, 5, 6], "balconi": 13, "balf": 16, "balloon": 2, "ballroom": 15, "bamboo": 1, "bamhar": [8, 10, 16], "bana": 16, "banafato": [16, 17], "banana": [2, 8], "bang": 13, "bank": [8, 16], "banker": 2, "banquet": 13, "banter": 13, "bar": [5, 6, 16], "barb": 13, "barbara": [13, 17], "barbi": 6, "barrier": 8, "bartek": [5, 6, 8, 10, 19], "bartpawlik": [5, 6, 8, 10, 19], "base": [1, 2, 5, 6, 7, 8, 9, 11, 13, 14, 16, 17, 18, 21], "baselin": 16, "basement": 13, "basenam": 21, "basic": [11, 16, 17, 21, 22], "basketbal": 10, "bat": 18, "batavia": 5, "batcheld": [6, 10, 16], "bate": 13, "bathroom": [5, 8], "batman": 13, "batteri": [16, 17], "battl": [1, 22], "baumgartn": 5, "bavarian": 5, "bbq": 15, "bdfl": [6, 8, 10, 15, 16], "beach": [5, 10, 15, 16], "beachgoer": 5, "bead": 8, "bean": [0, 2, 6, 8], "beani": 2, "bear": 16, "beard": 13, "beat": 5, "beaten": 2, "beatl": 15, "beauti": [0, 1, 2, 5, 6, 8, 11, 13, 16, 17], "beautifulli": 13, "beautifulsoup": 11, "beaven": 5, "becam": [0, 1, 6, 15, 17, 18], "becaus": [0, 2, 4, 5, 6, 8, 10, 11, 13, 14, 15, 16, 17, 18, 21], "beck": 22, "becom": [5, 6, 8, 13, 15, 16, 17, 21], "bed": 6, "beef": [0, 6, 13], "been": [0, 1, 2, 4, 5, 6, 7, 8, 10, 11, 13, 14, 15, 16, 17, 18, 21, 22], "beer": 6, "beewar": [5, 16], "befor": [0, 1, 2, 5, 6, 8, 10, 11, 13, 14, 15, 16, 17, 18], "began": [0, 2, 6, 8, 15, 16, 17, 18, 21], "begin": [0, 5, 16, 17, 18, 21], "beginn": [1, 8, 17, 21], "behavior": 6, "behind": [2, 6, 13, 16, 17, 18, 19, 22], "being": [1, 4, 5, 6, 13, 14, 15, 16, 17, 18, 21], "bel": 13, "believ": [2, 5, 6, 13, 14, 16, 17, 18], "belli": [2, 13], "belong": [4, 6, 8, 17], "below": 21, "bench": 17, "benchmark_weav": 8, "benedict": [6, 8, 10, 16], "benefit": [2, 5, 6, 8, 11, 14, 15, 16], "bennett": [5, 6], "bernat": 2, "berri": 8, "best": [0, 1, 2, 6, 7, 8, 9, 13, 14, 16, 17, 18, 21], "besti": 10, "bet": 13, "beta": 16, "better": [0, 1, 2, 4, 5, 6, 7, 8, 9, 11, 13, 15, 16, 18, 21, 22], "betti": 10, "between": [4, 5, 6, 13, 14, 15, 16, 17, 21, 22], "beverli": 13, "bewitch": 13, "beykpour": 10, "beyond": [0, 6, 7, 9, 13, 16, 17, 18, 22], "bezerra": 5, "bi": 13, "bia": [5, 6, 17], "bias": 6, "bicycl": 8, "bid": 15, "bidart": [1, 2, 10, 22], "big": [0, 5, 6, 8, 10, 13, 16, 18], "bigautofield": 8, "bigger": [8, 16], "biggest": 8, "bijan": 10, "bill": 16, "billboard": 16, "billi": 15, "billion": 16, "binari": [5, 8, 14, 16], "bind": 6, "biolog": 17, "bird": 13, "birdsey": 0, "birthplac": 10, "bit": [6, 8, 10, 13, 15, 16], "bite": 22, "bitter": 8, "biz": 10, "black": [0, 2, 5, 6, 10, 14, 15, 16], "blank": 21, "blast": [8, 13, 15], "blaster": 2, "blend": 8, "blind": 6, "blindli": 8, "blister": [13, 15], "blob": [4, 11], "block": [5, 8, 11, 13, 14, 15, 21], "blog": [0, 4, 6, 8, 11, 12, 13, 16, 18, 21, 22], "bloke": 6, "blomquist": 6, "blood": [2, 8], "bloom": [6, 8], "bloomberg": [15, 16], "blow": [13, 17], "blown": 16, "blue": 5, "blur": 6, "blyth": 5, "bmi": 2, "boaky": 8, "board": [0, 1, 5, 7, 10, 12, 15, 16, 17], "boardwalk": [5, 13], "boat": 5, "bob": 22, "bodi": [2, 5, 6, 15, 16, 17], "boi": [6, 13], "boilerpl": 16, "bomb": 13, "bone": 2, "bonu": [6, 10, 16], "bonus": 18, "book": [2, 6, 8, 10, 12, 13, 16, 17, 18], "bookend": 6, "bookmark": [21, 22], "boot": 6, "booth": [8, 15], "bootstrap": 8, "border": 5, "bore": [16, 17, 18, 22], "born": 16, "borrow": [6, 15], "boscaiola": 13, "bot": [0, 16, 18], "botan": 8, "both": [2, 6, 8, 10, 15, 17, 21], "bottom": [6, 16], "bought": [2, 6], "boulevard": 13, "bound": 5, "boundari": [6, 16], "bourbon": 6, "bowl": [0, 1], "box": [2, 5, 6, 16, 21], "bpd": 8, "bracelet": 8, "bracket": 14, "brai": 2, "brain": [8, 17], "branch": [5, 14, 16], "branchaud": 21, "brand": 6, "brandt": 16, "bras\u00e3o": 1, "brazilian": 1, "bread": [0, 6, 8, 13], "break": [6, 8, 10, 14, 15, 16], "breakdown": 8, "breakfast": [1, 5, 6, 13], "breakout": 8, "breakpoint": 8, "breast": 0, "breath": 17, "breathtak": [0, 5, 13], "brenner": 16, "brett": [16, 22], "brew": 8, "brian": [16, 22], "briann": 16, "brick": 16, "bridg": [0, 5, 6, 8, 16], "brief": 11, "briefli": [10, 16], "brigad": 17, "bright": [2, 6, 8, 10], "brightli": [5, 18], "brilliant": 2, "bring": [0, 5, 6, 7, 8, 9, 10, 17], "brisket": 0, "brittl": 6, "broad": 8, "broadcast": 16, "broadu": 2, "brodhead": [6, 8], "broke": 2, "broken": [2, 16, 17, 18], "bronchiti": 13, "brooklyn": 17, "brother": [1, 2, 12], "brought": [1, 2, 5, 6, 15, 16], "brousseau": 16, "brower": 8, "brown": [5, 16], "browni": [6, 13, 16], "browser": [4, 5, 6, 8, 21], "bruce": 10, "brunch": [1, 13], "bs4": 11, "bu": 5, "bucatini": 13, "bucher": 16, "bucket": [1, 10], "bucketlist": 2, "buddi": 2, "budget": [1, 6, 16], "buffet": [5, 8], "bug": [5, 8, 14, 16], "bugsnag": 8, "bui": [2, 8, 13, 15], "build": [0, 2, 5, 7, 9, 11, 13, 15, 17, 18, 21, 22], "built": [0, 4, 6, 8, 13, 16, 17, 18, 21], "bulk": 21, "bull": [0, 6], "bulldog": 6, "bulldoggi": 6, "bunch": 10, "bureau": 16, "burger": 1, "burgertim": 8, "burnout": [5, 16, 17], "burrito": 0, "burst": 13, "busi": [0, 2, 4, 6, 8, 11, 13, 16, 22], "businessman": 2, "bustl": 17, "butter": [7, 8, 9, 13], "butterfli": 6, "bye": 13, "byte": [5, 8, 16], "bytecod": [5, 16], "c": [4, 5, 11, 16, 17, 18, 22], "ca": [13, 17], "cabbag": [0, 5], "cach": 16, "cadillac": 8, "caf\u00e9": 13, "cagan": 22, "cake": 5, "caktu": [6, 8], "calabrian": 13, "calcul": 2, "caleb": 6, "calhoun": 6, "california": [5, 10, 13, 16, 19], "calimari": 5, "call": [0, 2, 4, 5, 6, 8, 9, 11, 12, 13, 14, 15, 16, 18, 21], "callback": [4, 11], "calver": 16, "came": [0, 2, 4, 6, 11, 13, 15, 16, 17, 18, 21], "camil": 22, "camp": 16, "campground": 5, "campu": [1, 2, 6], "can": [0, 2, 4, 5, 10, 11, 13, 14, 15, 16, 17, 18, 21, 22], "canada": 15, "canadian": 13, "cancel": [0, 1, 16], "cancer": 2, "candi": 2, "candid": 1, "cannon": [2, 10, 16, 22], "cannot": [6, 16], "canon": 1, "cao": 16, "capabl": [6, 22], "capacitor": 13, "capella": 8, "capelleti": 8, "capit": [16, 21], "caprock": 8, "captain": 5, "caption": [17, 18, 21], "captur": [8, 10], "car": [13, 17], "caramel": [5, 8], "caramelo": 8, "card": [6, 8, 16], "cardamon": 8, "care": [4, 5, 6, 15, 16], "career": [0, 1, 2, 6, 8, 16, 22], "carlton": [5, 6, 8, 10, 22], "carn": 5, "carol": [1, 2, 10, 16], "carolin": 8, "carolina": [2, 6, 8, 10, 16, 19], "carousel": 2, "carpet": 13, "carri": [5, 15], "cart": [6, 13], "carter": 13, "casablanca": 13, "case": [0, 4, 6, 9, 13, 16, 17, 18, 21], "casei": [5, 10, 17], "casper": 16, "cast": [13, 16], "castl": 5, "cat": 21, "cat_articl": 21, "cat_cont": 21, "catalog": 22, "catch": [4, 6, 8, 10, 16, 18], "categor": [16, 22], "categori": [0, 1, 8, 11, 17, 21], "catfish": 6, "catherin": [6, 10, 16], "caught": [6, 13, 16, 18], "caus": [6, 13], "caution": 8, "cc": 6, "cd": [7, 9, 14], "cedar": 16, "ceder": 15, "ceelo": 13, "celeb": 13, "celebr": [4, 6, 8, 15, 16], "celeri": [8, 17], "cell": 16, "cemeteri": 2, "center": [6, 8, 15], "centerfest": 10, "central": [0, 6, 13], "ceo": 10, "ceremoni": 13, "certain": [6, 15, 16], "certif": 12, "certifi": 22, "cfo": 10, "cfp": [1, 16], "chai": 8, "chaim": 6, "chain": [4, 6], "chair": [1, 2, 5, 6, 8, 10, 13, 15, 16, 17], "challeng": [1, 5, 6, 8, 15, 16, 18, 22], "chalmer": [10, 16], "chanc": [5, 8, 10, 13, 15, 16, 17, 18], "chang": [2, 5, 6, 8, 11, 12, 14, 15, 16, 17, 18, 21, 22], "changelog": 22, "changeset": 16, "channel": [2, 6, 8, 13, 15, 17], "chaplin": 13, "chapter": [1, 6, 16], "charact": [4, 14], "charl": 6, "charla": [10, 15], "charli": 13, "charnis": 13, "chart": 5, "charter": 16, "chartreus": 16, "chase": [1, 2, 16, 22], "chat": [0, 5, 6, 8, 10, 15, 16, 17], "chatbot": 16, "chatgpt": [7, 9], "cheap": [5, 16], "cheat": [16, 22], "cheatsheet": 22, "check": [1, 4, 6, 8, 11, 13, 14, 15, 16, 21, 22], "checklist": [5, 22], "checkout": 6, "checkqa": 14, "cheddar": 13, "cheer": 2, "chees": [0, 5, 6], "chef": [2, 8, 13], "chemo": 16, "cherri": 6, "cheryl": 15, "chesterton": 8, "chicago": 16, "chicken": [0, 2, 13], "chief": 16, "child": [8, 13, 17], "childhood": [8, 13, 15], "childlik": 13, "children": [6, 13], "chile": 0, "chili": 13, "chines": 13, "chip": [1, 6], "chipotl": 5, "chocol": [2, 5, 6, 8, 13, 15, 16], "chocolat": [6, 13], "choic": [0, 6, 14, 16, 17, 18, 21], "choir": 6, "cholesterol": [2, 8], "choos": [6, 16, 17], "chop": [1, 9], "choral": 6, "chore": 6, "chorizo": 6, "chose": [6, 15], "chosen": [0, 15], "chri": [0, 5, 6, 9, 15, 16, 18], "christensen": 16, "christi": 5, "christma": 1, "christoph": 16, "chronolog": 21, "chua": 17, "chuck": 13, "church": 10, "ci": [7, 9, 14], "cindi": [6, 8], "cinnamon": 6, "cioara": 21, "circa": 8, "circl": 5, "circle_": 14, "circuitpython": 0, "circumv": 5, "cisnero": 8, "cite": [6, 16], "citi": [0, 1, 2, 4, 5, 6, 8, 10, 11, 16, 17], "citizen": 17, "citru": 2, "city_pattern": [4, 11], "cityscap": 13, "citywalk": 13, "ckad": 22, "clam": 6, "clang": [5, 16], "clarif": 15, "clarifi": 6, "clark": 16, "class": [1, 4, 5, 11, 16], "classic": [11, 13, 22], "classifi": 11, "classroom": [0, 8, 17], "clau": 13, "claud": 16, "clean": [12, 16], "clear": [5, 21], "clearli": 22, "cleveland": [10, 15, 16], "clever": [2, 10, 18], "cli": 14, "click": [4, 6], "clickbait": 6, "client": [6, 11], "clientsid": 5, "climb": 18, "clinic": 5, "clock": [16, 17], "clone": 14, "close": [0, 1, 2, 4, 5, 12, 13, 16, 19, 21], "closer": 13, "cloud": [1, 6, 16], "club": 5, "clue": 2, "cm": [7, 9], "co": [1, 2, 4, 5, 6, 7, 8, 9, 10, 13, 16, 17, 22], "coach": 6, "coalit": 17, "coast": [5, 13], "coaster": 13, "cockroach": [6, 16, 22], "cockroachdb": [1, 9, 16], "cocoa": 6, "code": [4, 5, 6, 8, 10, 11, 12, 14, 15, 16, 17], "codebas": 14, "codecomputerlov": 11, "codecov": 14, "coder": [0, 6, 17], "coffe": [1, 16], "coffeehous": 8, "cognit": 5, "coher": 15, "coil": 16, "coin": [6, 16], "coincid": [2, 6], "collabor": [0, 4, 6, 8, 10, 16, 17], "colleagu": [1, 6, 13, 16, 22], "collect": [2, 4, 6, 8, 11, 13, 15, 16, 17, 18, 21], "colleg": 17, "colon": [2, 14], "color": [2, 5, 8, 16, 18], "colossu": 17, "column": 8, "com": [4, 5, 6, 8, 10, 11, 14, 18, 19, 21], "combin": [0, 2, 4, 5, 6, 14], "come": [1, 5, 6, 8, 10, 15, 16, 21], "comedian": 13, "comfort": [2, 6], "comma": 4, "command": [8, 14, 18], "comment": [0, 2, 5, 6, 8, 14, 16, 18], "commentari": 13, "commit": [2, 5, 16], "committe": [6, 16], "common": [1, 6, 8, 11, 15, 16, 21], "commonli": [4, 5, 11], "commun": [0, 1, 2, 5, 7, 8, 9, 10, 13, 15, 16, 17, 22], "commut": 15, "compani": [6, 7, 8, 9, 12, 16, 17], "company_id": 6, "compar": [4, 5, 6, 9, 13, 16], "comparison": [6, 11, 13], "compass": 16, "compat": [5, 14, 16], "competit": [1, 5, 8, 13], "competitor": 6, "compil": [2, 4, 5, 11, 22], "complet": [0, 1, 2, 5, 6, 13, 14, 16, 17, 18, 21, 22], "complex": [0, 6, 8, 11, 14, 16, 21], "complimentari": 6, "compon": [6, 8], "compound": 8, "comprehend": 16, "comprehens": 22, "comput": [4, 6, 14, 16, 17, 18], "conan": 13, "concaten": 21, "concept": [0, 6, 8, 18, 22], "concern": 8, "conclus": 16, "concret": 5, "concurr": 16, "condit": [6, 16], "condition": 8, "conduct": [6, 8, 16], "conf": 14, "confer": [0, 1, 5, 15, 17], "confid": [2, 18, 21], "config": [11, 14], "configur": [0, 5, 17], "conflict": [6, 16], "confront": 13, "congratul": 16, "connect": [0, 2, 6, 12, 13, 15, 16, 17], "connel": 6, "consecut": 21, "consensu": 13, "consequ": [4, 17], "consid": [4, 6, 16, 22], "consider": [1, 22], "consist": [0, 4, 6, 13, 18], "consol": 8, "consult": 16, "consum": 16, "contact": 12, "contain": [4, 6, 11, 21], "content": [1, 2, 4, 11, 12, 15, 17, 18, 22], "context": [8, 17], "contextvar": 16, "continu": [0, 1, 2, 5, 6, 8, 17, 21], "contour": 2, "contract": [1, 8, 12], "contractor": [1, 17], "contrast": [5, 13, 18], "contrato": 17, "contribut": [0, 1, 4, 5, 6, 7, 8, 9, 11, 14, 17], "contributor": [0, 5, 6, 7, 9, 17], "control": [0, 4, 5, 8, 16, 17, 18], "controlar": 17, "controversi": [4, 22], "conven": [2, 16], "conveni": [2, 13], "convent": [6, 8, 15, 16], "converg": 17, "convers": [1, 2, 5, 6, 8, 9, 16, 17, 18], "convert": 16, "convert_til_2_readm": 21, "convo": 16, "conwai": 6, "cooki": 6, "cool": [6, 13, 15, 16, 17, 21], "coordin": [2, 4], "cope": [0, 8], "copi": [0, 16], "cord": 2, "core": [0, 4, 5, 6, 7, 8, 9, 10, 15, 16, 17, 22], "corn": 16, "corner": [6, 8], "cornmeal": 6, "coronado": 5, "corpor": [5, 6, 8], "correct": 4, "correctli": 17, "correspond": 21, "corrupt": 17, "cosmo": 16, "cost": [2, 6, 8, 16, 17], "costum": 13, "cottag": 5, "could": [0, 2, 4, 5, 6, 7, 10, 11, 13, 15, 16, 17, 18, 21], "couldn": [0, 5, 8, 10, 11, 13, 15, 16], "council": [7, 9], "count": [6, 8, 10, 11, 16, 21], "counter": [1, 6, 7, 9, 13, 16], "countless": 2, "countri": [4, 6, 8, 11, 15, 16], "coupl": [0, 4, 16, 21, 22], "courag": [6, 22], "cours": [0, 1, 8, 12, 15, 16, 17, 21, 22], "coursework": 18, "court": 13, "courtesi": 6, "courtyard": [5, 13], "cousin": [2, 8], "cove": 13, "cover": [2, 14, 16, 18], "coverag": 16, "covid": [0, 16], "cprofil": 8, "cpu": 16, "cpython": [5, 10, 12, 15, 17], "crab": 16, "craft": [8, 13], "craig": 10, "craisin": [2, 10], "crap": 6, "crari": [8, 16], "crash": [13, 16, 18, 22], "crawford": 16, "crawl": [4, 11], "cream": [2, 5, 6, 13], "creami": [8, 13], "creat": [0, 1, 2, 4, 5, 6, 8, 9, 10, 11, 13, 14, 15, 16, 17, 18, 21], "creation": 13, "creativ": 18, "creator": [6, 8, 10, 16, 21, 22], "credit": [0, 5, 6, 8, 10, 15, 17, 19], "cremieux": 8, "creol": 6, "crepe": 13, "crew": [6, 13], "crime": [13, 15], "crispi": 6, "critic": 6, "croissant": [6, 13], "cron": 17, "croslei": 0, "cross": [5, 6, 16], "crossroad": 5, "crossword": 4, "crowd": [2, 5, 8, 13, 15, 16, 19], "crucial": 16, "cruis": 5, "crumb": 6, "crummi": 11, "crunch": 16, "crush": [2, 13], "crutchfield": 5, "crystal": 13, "cs106a": [0, 18], "css": [6, 8, 11], "cuban": 0, "cubo": 0, "cuckoo": 16, "cuisin": 8, "cultur": [0, 2, 5, 6, 13, 17], "cumul": [2, 22], "cunningham": 15, "cup": [1, 5, 6], "curat": [18, 21, 22], "curd": 5, "curent": 8, "curios": [2, 21], "curiou": 18, "current": [2, 5, 6, 8, 14, 16, 17, 21, 22], "curriculum": [1, 17, 18], "curv": 6, "custard": 2, "custom": 6, "cute": 6, "cutler": 22, "cutout": 16, "cuttlesoft": 16, "cve": 16, "cycl": [6, 15, 16], "cypress": 6, "d": [0, 1, 2, 4, 6, 8, 10, 13, 15, 16, 17, 18, 21, 22], "da": [15, 16], "dai": [1, 2, 6, 7, 8, 9, 10, 12, 13, 15, 16, 17, 18], "daili": [12, 22], "dalla": [2, 16], "dan": 2, "danger": [6, 15], "daniel": [6, 16], "danish": 13, "daphn": 5, "dark": [8, 13], "darl": 6, "dashboard": [8, 16], "dask": 16, "data": [0, 4, 5, 6, 8, 11, 12, 16, 17, 18, 21], "data_fil": 14, "data_format": [4, 11], "databas": [2, 4, 6, 7, 8, 9, 10, 12, 16], "datacent": 8, "dataclass": 16, "datadog": 16, "datasett": [7, 9, 16, 21, 22], "datastar": 8, "date": [0, 2, 10, 16, 21, 22], "datetim": 21, "dave": 16, "davi": 17, "david": [0, 16], "dawn": [0, 6, 16, 19], "daytim": 13, "db": [8, 16], "dba": 16, "de": [0, 1, 6, 8, 16, 17], "dead": [16, 22], "deadlin": 6, "deaf": 17, "deal": [5, 11, 16], "deanna": 2, "death": 13, "deatz": 5, "deb": [1, 10, 16], "debat": [7, 9, 18], "debilit": 2, "debug": [4, 11, 16, 18], "debugg": [8, 11], "decad": [6, 10, 16], "decaf": 8, "decemb": [1, 16, 19, 22], "decent": 13, "decid": [0, 2, 4, 6, 8, 10, 11, 13, 14, 15, 16, 17, 18], "decis": [6, 16], "deck": [5, 15, 16], "decod": 16, "decomposit": 18, "decor": [8, 13], "decref": 16, "dedic": [0, 16], "deep": [1, 2, 8, 12, 16, 22], "def": [4, 5, 11, 16, 21], "default": [6, 8, 14, 16], "defibril": 16, "defin": [6, 8, 16], "definit": [5, 6, 9, 13, 21], "defna": [2, 5, 7, 10, 12, 15, 16, 17, 19], "deftli": 5, "degre": 16, "del": [5, 6, 13], "delet": [6, 8], "delici": [0, 5, 6, 8, 13, 15], "delight": [0, 13], "deliv": 6, "delorean": 13, "demand": 16, "dementia": 2, "demo": [1, 8, 16, 17], "democrat": 0, "demonstr": [5, 6, 11, 18], "demystifi": 8, "denial": 6, "densiti": 2, "dep": [5, 6, 14, 22], "depart": [1, 2, 13, 22], "department": 1, "depend": [2, 4, 6, 16, 21], "depict": 17, "deploi": [5, 16], "deploy": [6, 7, 9, 16], "deprec": 16, "depth": 13, "descent": 6, "describ": [8, 17], "descript": [11, 12], "desert": 6, "design": [1, 4, 5, 10, 13, 22], "desir": [6, 16], "desk": [5, 6, 17], "desktop": 16, "despit": [16, 17], "dessert": [5, 16], "dest": 21, "detail": [0, 4, 5, 11, 13, 16, 18, 22], "detect": [13, 16], "detector": 17, "determin": [1, 6, 14, 16, 17, 21], "detriment": 17, "dev": [0, 2, 5, 6, 7, 9, 10, 11, 15, 16, 22], "devast": 17, "devdai": 6, "develop": [1, 2, 4, 5, 6, 7, 9, 10, 11, 12, 16, 17, 21], "deviat": 8, "devic": [6, 8, 17, 21], "devict": 0, "devlin": [10, 16], "devot": 13, "devrel": 6, "dewei": 8, "df": 16, "dfw": 1, "di": 2, "diagnos": 8, "diagnost": [5, 18], "dicaprio": 13, "dictionari": [16, 18], "did": [0, 1, 2, 6, 8, 13, 15, 16, 17, 18, 21], "didn": [5, 6, 8, 10, 11, 13, 15, 16, 17, 18], "die": [1, 8], "diego": [2, 5, 10, 13, 19], "diet": [2, 8], "diff": 14, "differ": [0, 4, 5, 6, 7, 8, 9, 11, 16, 17, 18, 21], "difficult": [0, 1, 5, 7, 9, 17, 18, 21], "difficulti": [6, 8, 21], "dig": 5, "digit": [4, 16], "digust": 5, "dine": [6, 13], "diner": 13, "dinner": [0, 10, 12, 13], "dior": 13, "dip": 8, "dir": [4, 21], "direct": [6, 16, 18], "directli": [4, 5, 6, 14, 16, 21], "director": [1, 2, 8, 10, 15, 16, 17], "directori": [4, 11, 14, 21], "disabl": [16, 17], "disappear": 6, "disappoint": [6, 16], "disast": 17, "disclaim": [2, 6, 8, 16, 22], "disclosur": 17, "discomfort": 6, "discont": 6, "discord": 16, "discov": [5, 6, 13, 16, 21], "discover": 0, "discoveri": 21, "discuss": [5, 6, 15, 16, 22], "diseas": [2, 13], "disgust": 5, "dish": [1, 8, 13], "dishearten": 2, "dislik": [17, 22], "disnei": 16, "disorgan": 21, "displai": 18, "disput": 6, "disqualifi": 17, "disrupt": 16, "dissect": 8, "dissolv": [5, 6], "distanc": [5, 8], "distant": 5, "distinct": [1, 6], "distinctli": [16, 17], "distinguish": 8, "distribut": [1, 2, 6, 8, 13, 16, 17], "district": [5, 13], "disturb": 0, "div": [4, 11], "dive": [1, 2, 8, 12, 22], "diver": 8, "divers": [5, 6, 7, 8, 9, 12, 15, 16, 17], "diversif": 6, "divid": 22, "divin": 5, "di\u00e1taxi": 22, "dj": [8, 14], "dj32": 14, "dj40": 14, "dj41": 14, "django": [0, 2, 7, 9, 10, 12, 15, 16, 17, 18, 21], "djangocon": [0, 15, 16, 17, 21], "djangogirl": 16, "djangonaut": [8, 9, 16], "djurham": 6, "dmc": 13, "do": [0, 1, 2, 4, 5, 7, 9, 10, 12, 13, 15, 16, 17, 21], "doc": [5, 6, 7, 9, 10, 11, 17, 22], "dock": 1, "docker": [5, 10, 17], "document": [0, 1, 4, 6, 8, 11, 14, 16, 17, 21, 22], "documentari": 13, "doe": [6, 8, 9, 10, 16, 22], "doesn": [4, 6, 16, 17], "dog": [6, 13, 17, 18], "dogb": [6, 10, 16], "domest": 17, "dominguez": 10, "don": [1, 2, 4, 8, 13, 15, 16, 17, 18], "donat": 16, "done": [2, 5, 6, 9, 10, 13, 14, 15, 16, 17], "donkei": 8, "donor": 8, "door": [6, 13, 16, 17], "doozi": 13, "dorchest": 13, "dorsei": 10, "doubl": [6, 14, 21], "doubt": 21, "doug": 16, "down": [0, 1, 2, 5, 6, 8, 13, 16, 17, 18], "download": [2, 6, 14, 17, 18], "download_delai": [4, 11], "downplai": 15, "downsid": [8, 21], "downtown": [0, 2, 5, 8, 15], "dozen": 0, "dr": [5, 6, 8, 12, 13, 15], "draft": [5, 16, 21], "dragon": 22, "dragun": 10, "dramat": 5, "drasner": 22, "drastic": [5, 6], "draw": 5, "dream": [0, 1, 2, 5, 8, 10, 16], "dress": 13, "drew": [2, 8, 10], "drf": [6, 11], "drill": 16, "drink": [5, 6, 8], "drive": [4, 5, 6], "driven": [8, 22], "driver": 13, "droettboom": 16, "drop": [0, 6, 8, 13, 14, 18], "drove": [2, 6, 13], "drown": 13, "dry": 18, "dsf": [9, 16], "dsl": 16, "ducass": 13, "duck": [1, 2, 8, 16], "due": [1, 4, 5, 6, 8, 13, 15, 16, 17, 18], "dufi": 8, "dulc": 8, "dun": 6, "dunder": [2, 10], "dunham": 5, "duplic": 6, "durbin": [15, 16], "dure": [0, 1, 2, 4, 6, 8, 10, 13, 16, 17, 18, 19], "durham": [2, 6, 10, 16, 19], "durhan": 8, "dustin": 11, "dutch": 17, "duti": 8, "dynam": [6, 8, 16], "e": [8, 18], "e203": 14, "e265": 14, "e501": 14, "each": [0, 2, 4, 5, 6, 8, 10, 14, 16, 17, 18, 21], "ear": [13, 17], "earli": [0, 1, 2, 6, 8, 10, 15, 16], "earlier": [10, 16], "earn": [1, 2], "eas": 0, "easi": [0, 2, 5, 6, 8, 11, 16, 18, 21], "easier": [0, 4, 5, 6, 8], "easiest": 18, "easili": [0, 4, 6, 14, 15, 16], "east": [0, 13], "eat": [0, 5, 6, 8, 10, 13, 15, 22], "eaten": [6, 8, 13], "ecosystem": [4, 5, 8, 15, 17, 18], "ecstat": 16, "ed": 16, "edg": [13, 16], "edgedb": 16, "edgewat": 15, "edit": [16, 21, 22], "editor": 17, "editori": 16, "educ": [6, 7, 8, 17, 18], "edward": 2, "ee": [13, 16], "effect": [6, 7, 8, 9, 13, 16, 17], "effici": [5, 13, 16, 21], "effort": [5, 6], "egg": [6, 13], "egger": [2, 16, 17], "ei": 16, "eight": 6, "either": [4, 6, 13, 17, 18], "elabor": 13, "elast": 16, "eldarion": [5, 15, 17], "eleanor": 5, "elect": [0, 6, 16], "electr": 17, "eleg": 16, "element": [6, 11, 16], "elev": 6, "elf": 16, "eliana": 6, "eliasen": 5, "elif": [4, 11], "elisa": 13, "elit": 6, "elizabeth": [8, 16], "elli": 12, "ellipt": 2, "elo": 16, "els": [4, 6, 11, 16, 17, 18], "elsewher": 15, "elvi": 15, "email": [8, 18, 21], "embarcadero": 5, "embark": [5, 17], "embarrass": 17, "embrac": [6, 15, 17], "emce": [5, 16], "emerg": [5, 6, 8, 17], "emili": 15, "eminem": 13, "emmi": 13, "emoji": [21, 22], "empanada": 2, "empathet": 16, "emphasi": 22, "emploi": 22, "employ": 2, "employe": [1, 17], "empow": [1, 6, 10, 17, 22], "empower": 15, "empti": [16, 17, 21], "emscripten": 5, "en": 11, "enabl": [1, 4, 6, 14, 16, 17], "enact": 17, "encamp": 13, "encapsul": 21, "encod": [11, 16, 21], "encount": 18, "encourag": [2, 6, 8, 15, 18, 21], "end": [0, 1, 2, 4, 5, 6, 8, 10, 11, 12, 16, 17, 18, 21], "endeavor": 6, "endpoint": 17, "endswith": 21, "energect": 8, "energi": [5, 17], "engag": [1, 6, 8, 16, 17], "engin": [1, 2, 4, 6, 7, 8, 9, 10, 12, 16, 17, 21], "english": [8, 10, 15, 19], "engross": 17, "enhanc": [6, 16, 22], "enjoi": [0, 1, 2, 5, 6, 8, 10, 13, 15, 16, 18], "enlighten": [8, 16], "enough": [5, 6, 8, 13, 16, 18, 21], "enscrib": 17, "enscripten": 5, "ensur": [0, 17], "enter": [8, 17], "enterpris": [16, 22], "entertain": [6, 13], "enthusiast": [10, 16], "entir": [6, 8, 13, 16, 18, 21], "entiti": 17, "entitl": [0, 8, 16], "entranc": [0, 13], "entrepreneurship": 15, "entri": [4, 8, 21], "environ": [4, 6, 8, 17, 18, 22], "environment": 16, "envlist": 14, "ephiphani": 21, "epic": [16, 18], "equal": 16, "equip": 13, "equit": 16, "equiti": 17, "equival": [2, 6], "eri": 15, "eric": [6, 10, 16, 18, 22], "erika": 16, "erin": 6, "ernest": 15, "error": [4, 14, 16], "escap": [4, 11], "espa\u00f1ol": 15, "especi": [0, 6, 15], "esqu": 18, "essenti": 16, "establish": [6, 13], "etc": [7, 8, 9], "ethic": [6, 16], "eti": 0, "europ": [1, 5, 6, 8], "ev": 6, "eva": [8, 10], "evalu": [8, 16], "evan": 22, "even": [0, 4, 5, 6, 7, 8, 10, 11, 13, 15, 16, 17, 18], "event": [0, 1, 2, 6, 8, 10, 15, 16, 17], "eventu": [2, 6, 17], "ever": [0, 2, 4, 5, 6, 8, 10, 11, 13, 15, 16, 17, 18, 21], "evergreen": 22, "everi": [1, 2, 4, 6, 8, 13, 14, 16, 17, 18, 21, 22], "everitt": 8, "everydai": [13, 16], "everyon": [2, 6, 8, 10, 15, 16, 17, 22], "everyth": [0, 5, 6, 8, 13, 16], "everywher": [0, 5, 8, 13, 15], "evolut": [6, 16], "evolv": [14, 16], "exact": 16, "exactli": [2, 6, 16, 22], "exampl": [2, 4, 5, 6, 8, 13, 14, 16, 18, 21, 22], "excel": [0, 5, 6, 8, 13, 16, 17, 18, 22], "except": [4, 6, 18, 21, 22], "exchang": 16, "excit": [0, 2, 6, 8, 15, 16, 18, 21], "excitedli": 18, "exclud": [6, 14, 21], "exclude_lin": 14, "excluded_fold": 21, "exclus": 18, "excruci": 13, "execut": [1, 8, 10, 14, 16, 21], "executor": 8, "exempl": 8, "exercis": [2, 4, 11, 13, 18], "exeri": 8, "exhaust": 6, "exhibit": [6, 13, 15, 17, 18], "exist": [4, 5, 6, 13, 14, 16, 21], "exit": 13, "expect": [0, 5, 6, 13, 15, 16, 17, 18], "expens": [16, 17], "experi": [0, 1, 2, 5, 7, 8, 9, 10, 13, 15, 16, 17, 18, 21], "experienc": [5, 6, 8, 13, 16, 18, 22], "experiment": [4, 7, 9, 16, 18, 22], "expert": [0, 5, 8, 13, 16, 22], "expertis": 0, "explain": [5, 6, 8, 17, 21], "explicitli": 14, "explor": [13, 17, 18, 22], "expos": [16, 17], "exposur": 17, "express": [4, 6, 18], "extend": [5, 8, 16, 17], "extens": [0, 5, 8, 13, 16, 17, 22], "extern": [16, 17], "extra": [4, 6, 8], "extract": [4, 11, 16], "extract_first": [4, 11], "extrem": [0, 2, 4, 13, 15, 17, 18, 22], "ey": [2, 6, 13], "eyebal": 8, "f": [4, 21], "f1": 2, "fabul": [1, 22], "face": [0, 2, 5, 6, 10, 13, 15, 17, 18], "facetim": 2, "facilit": [15, 16], "fact": 2, "fade": 6, "fail": 13, "failur": 16, "fair": [8, 13], "fairli": [0, 2, 11, 16, 18], "faist": [5, 10, 17], "fall": [0, 2, 6, 17], "fallen": [0, 6], "fallon": [11, 13], "falsehood": 6, "falutin": 13, "fame": 15, "familar": 5, "famili": [8, 13, 17], "familiar": [0, 5, 8, 16, 18], "famou": [0, 8, 13, 15, 17, 22], "fan": [6, 13, 16, 18], "fanat": 17, "fanci": 13, "fantast": 8, "faq": [14, 16], "far": [2, 5, 6, 13, 17, 18], "fare": 8, "farm": 8, "farmer": [8, 13], "farmyard": 6, "fascin": [13, 17, 18], "fashion": [13, 21], "fast": [2, 6, 7, 8, 9, 16, 18], "fastapi": [2, 6], "faster": [5, 16, 22], "fastest": [6, 8], "fate": 16, "fatigu": 8, "faulkner": 8, "favorit": [0, 1, 6, 7, 8, 9, 12, 13, 15, 16, 22], "fd": 21, "fear": [0, 6, 13], "feat": 22, "featur": [1, 4, 6, 7, 8, 9, 10, 11, 12, 13, 14, 16, 17, 18, 21], "februari": [0, 10], "feed": [0, 2, 10, 18], "feedback": [6, 8, 16], "feel": [0, 2, 6, 8, 10, 13, 15, 16, 17, 18, 21], "feet": [5, 8], "felip": [5, 16], "felisiak": [5, 6, 22], "fell": [2, 6, 18], "fellow": [1, 2, 5, 7, 8, 9, 10, 16, 17, 22], "fellowship": 21, "felt": [2, 5, 6, 13, 15, 16, 17, 18, 21], "femal": 6, "fenc": [8, 11], "fennel": [6, 8], "ferraioli": 16, "ferri": [2, 13, 17], "festiv": [8, 10, 15, 16], "fetch": 5, "fettucchin": 13, "fettuccin": 13, "fettuccini": 13, "few": [0, 1, 2, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17], "fgcu": 0, "fibonacci": 16, "fiction": 17, "field": [4, 5, 8, 17], "figur": [6, 8, 9, 16], "file": [0, 4, 6, 11, 14, 16, 21], "file_nam": 21, "filenam": 21, "fill": [1, 2, 5, 6, 8, 15, 21], "filter": [6, 16, 18, 22], "final": [1, 2, 6, 10, 12, 13, 15, 16, 17, 21], "financ": 2, "financi": [16, 17], "find": [0, 4, 5, 8, 13, 15, 16, 17, 21], "find_packag": 11, "fine": [0, 8, 10, 17], "fingerl": 13, "fingerstick": 2, "finish": [0, 1, 2, 6, 13, 14, 15, 16], "fire": [1, 8], "firefight": 8, "first": [0, 1, 2, 4, 5, 6, 8, 10, 13, 14, 15, 16, 17, 18, 21, 22], "firstli": [4, 8, 15, 16], "firstparti": 14, "fish": [1, 5, 6, 8], "fit": [2, 4, 5, 6, 16, 17], "fitch": 2, "five": [1, 5, 6, 8, 11, 16, 18], "fix": [1, 5, 6, 8, 14, 16], "flag": [14, 16], "flake8": 14, "flaki": 6, "flanneri": [15, 16], "flash": 13, "flask": 0, "flat": 21, "flav": 13, "flava": 13, "flavor": [2, 6, 8, 13], "flaw": [14, 16], "flew": 10, "flex": 9, "flexibl": 18, "flight": [5, 6], "float": [2, 16], "flood": 13, "floor": [8, 13, 15], "florida": 0, "flour": 0, "flow": [5, 13, 18], "flower": [2, 6], "fluent": 22, "flux": 13, "fly": 13, "foam": 6, "focu": [1, 6, 14, 17], "focus": [6, 8, 13, 22], "folder": [14, 21], "folk": 0, "follow": [0, 4, 5, 6, 8, 10, 11, 13, 15, 16, 21, 22], "fomo": 15, "food": [0, 5, 12, 13, 15, 16], "foodi": 13, "foot": 15, "footbal": 1, "footprint": 13, "footstep": [10, 13], "forc": 18, "forese": 16, "forest": 6, "forev": 0, "forgac": 16, "forget": [1, 5, 6], "fork": [8, 21], "form": [4, 6, 15, 17], "format": [4, 5, 6, 8, 10, 11, 14, 16, 19, 21], "former": [0, 1, 2, 6, 10, 15, 16, 17, 18, 22], "formerli": 16, "fortun": [1, 2, 6, 13, 15, 16, 17, 21], "fortworth": 16, "forum": [8, 22], "forward": [1, 2, 4, 6, 8, 10, 11, 16, 17], "foss": 17, "foster": 17, "foucault": 13, "found": [0, 2, 5, 6, 8, 10, 14, 15, 16, 17, 18, 21], "foundat": [0, 1, 5, 6, 8, 9, 15, 16, 17], "founder": [2, 6, 8, 10, 16, 22], "fountain": [5, 13], "four": [2, 4, 6, 8, 13, 16, 21], "fournier": 22, "fourth": 17, "fowl": 1, "fowler": 22, "foxlei": [6, 8, 10], "fraction": [6, 16], "frame": [5, 16], "framework": [0, 7, 8, 9, 11, 12, 14, 16, 17, 21, 22], "franc": 8, "francisco": [10, 15, 17], "frank": [5, 6, 8, 16, 17], "frankli": 13, "fredonia": 13, "free": [1, 2, 8, 11, 17, 22], "freedom": 13, "freestyl": 2, "freez": 13, "french": [6, 13], "fresh": 13, "fri": [2, 5, 8, 13], "fridai": [1, 5, 12, 18, 22], "fridman": 22, "friedman": 10, "friend": [0, 1, 2, 5, 8, 10, 13, 15, 16, 17, 18, 22], "friendli": [2, 6, 10, 15], "friendship": 16, "fring": 17, "frisco": 2, "frogger": 8, "froi": [10, 17], "from": [0, 1, 2, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15, 16, 17, 18, 21, 22], "front": [2, 4, 5, 8, 10, 13, 15, 16, 17, 21], "frontend": [8, 11], "fruit": [6, 13], "frustrat": [5, 17], "frustratingli": 18, "ftw": 17, "fudg": 16, "fulfil": 15, "full": [0, 2, 6, 8, 13, 15, 16, 18, 22], "fulli": [16, 18, 21], "fun": [0, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 16, 17, 18, 21], "function": [4, 5, 6, 8, 16, 17, 18, 21], "fund": [5, 16, 17], "fundament": 18, "funder": 8, "funding": 16, "funer": 2, "funni": 15, "funniest": 11, "further": [1, 2, 5, 16, 18], "futur": [0, 5, 7, 9, 13, 14, 15, 16, 18, 21], "g": 13, "gabor": 2, "gaggl": [10, 16], "gaia": 1, "gain": 0, "galindo": [15, 22], "galleri": [10, 16, 17], "gallo": 0, "game": [0, 7, 8, 9, 11, 13, 17, 18], "ganssl": 16, "gap": 6, "garbag": 16, "garbanzo": 0, "garden": [0, 13, 17], "gardner": 8, "gari": 16, "garlic": [0, 2, 6], "garrett": 16, "garson": [16, 17], "gartner": 6, "gate": [13, 17], "gather": 6, "gave": [0, 1, 5, 6, 8, 10, 11, 13, 15, 16, 17, 18], "gaze": 5, "gazebo": 13, "gbadago": [6, 8, 10], "gbagado": [10, 16], "gcp": 6, "gear": 13, "gem": [13, 22], "gemfir": 1, "gemini": 16, "gender": [5, 15, 16, 18], "gener": [0, 2, 5, 6, 8, 10, 11, 12, 13, 16, 21], "gentl": [2, 10], "genuin": 18, "geo": 4, "geocoordin": 4, "geofrei": 6, "geograph": 4, "geojson": 16, "geojsonpointitem": [4, 11], "german": 17, "get": [0, 1, 2, 4, 5, 6, 7, 9, 10, 11, 12, 13, 14, 16, 17, 18, 21], "getfileattribut": 21, "ghana": [6, 10, 16], "ghanian": [6, 16], "gi": 0, "gibbon": 16, "gibson": [5, 6, 8, 10, 22], "gift": [6, 8, 10, 16], "gil": [2, 5], "gilmor": 13, "ginger": [6, 8], "giorgio": 13, "girl": [13, 16], "gir\u00e3o": 16, "gist": 16, "git": [0, 5, 7, 9, 14, 21], "github": [0, 4, 6, 7, 9, 11, 12, 14, 16, 18, 21, 22], "give": [0, 1, 4, 5, 6, 8, 10, 11, 13, 16, 17, 18, 21], "given": [2, 5, 8, 10, 15, 16, 18], "glad": [13, 15, 16, 18], "glass": 2, "glimps": 4, "glitter": 5, "global": [1, 6, 14, 16, 21], "globe": 16, "gloriou": 6, "glove": [13, 15], "glue": 22, "glyph": 16, "gmail": [18, 21], "gnocchi": 8, "gnome": 16, "gnu": 11, "go": [0, 2, 5, 6, 7, 8, 9, 10, 12, 16, 17, 18, 21, 22], "goal": [0, 6, 15, 16, 17], "goat": [1, 22], "gobsmack": [5, 15, 17], "goddard": [2, 10], "godfath": 13, "godwin": [5, 6, 16], "goe": [4, 8, 16], "goer": [6, 15], "gogh": 13, "gold": [5, 15], "golden": 17, "goma": 2, "gone": [2, 15], "good": [0, 1, 2, 5, 6, 7, 8, 9, 13, 15, 16, 17, 18, 21, 22], "googl": [4, 6, 11, 13, 14, 16, 22], "gore": 5, "gorgeou": [5, 6, 16], "gos\u00e9": 6, "got": [0, 2, 5, 6, 8, 10, 12, 13, 15, 16, 22], "gotten": [4, 10], "gould": [6, 8, 10], "gourmet": 8, "govern": [1, 5, 6, 8, 12, 16], "gplv3": 11, "gpt": 16, "grab": 13, "grace": 16, "grad": 6, "grade": [6, 13, 18], "graduat": 17, "graffiti": 13, "graham": 16, "grand": [6, 13], "grandmast": 13, "grandmoth": 2, "grandstaff": [8, 10], "granola": 13, "grant": [8, 16, 17], "granular": 17, "graph": [2, 10], "graphic": 22, "grappl": [5, 18], "grasp": 16, "grass": 5, "grassa": 0, "grassroot": 17, "grate": 0, "gravit": 6, "great": [0, 1, 2, 5, 9, 10, 11, 12, 13, 16, 18, 21], "greater": 17, "greatli": [8, 13], "green": [13, 14, 17], "greenest": 5, "greer": 8, "gregori": [10, 19], "grew": 5, "grid": [4, 11], "grill": [1, 5], "grinch": 13, "grit": [13, 18], "groceri": 8, "gross": 16, "ground": [6, 13, 16], "group": [0, 1, 4, 5, 6, 8, 10, 13, 14, 15, 17, 18, 19, 22], "grove": 22, "grover": [10, 17], "grow": [1, 6, 15, 17], "grown": [6, 17], "growth": [1, 6, 8, 22], "gruyer": 6, "guacamol": 0, "guarante": 16, "guess": [2, 13], "guest": [5, 8, 9, 13, 22], "gui": [5, 6, 18], "guid": [5, 6, 8, 13, 15, 16, 21, 22], "guidebook": 22, "guido": [0, 6, 10, 15, 16], "guild": 8, "guitar": 5, "gym": 13, "h": 6, "ha": [0, 1, 2, 4, 5, 6, 7, 8, 10, 13, 14, 15, 16, 17, 18, 21, 22], "habit": 22, "hack": [5, 8, 17], "hackathon": 1, "hacker": [2, 21, 22], "hacktoberfest": 0, "had": [0, 1, 2, 4, 5, 6, 10, 14, 15, 16, 17, 18, 21, 22], "hadn": [2, 5, 6, 13, 15, 17, 21], "haha": 13, "half": [0, 6, 8, 13, 16, 18], "hall": [0, 1, 15, 17], "hallow": 17, "hallucin": 6, "hallwai": [0, 10, 12, 15], "ham": [6, 13], "hamburg": 13, "hamilton": 16, "hammer": 8, "hamt": 16, "hand": [0, 2, 5, 6, 10, 16, 17, 18, 21], "handcraft": 0, "handl": [6, 8, 16], "handler": 5, "handmad": 13, "handprint": 13, "handwritten": 15, "hang": [10, 14, 16], "hangar": 5, "hansen": 5, "happen": [1, 2, 4, 5, 6, 8, 10, 13, 14, 15, 16, 17, 18, 22], "happi": [0, 4, 6, 8, 10, 11, 16, 17, 21], "happili": 11, "harbor": [5, 17], "hard": [2, 5, 6, 7, 8, 13, 16, 17, 22], "harder": 16, "hardwar": 5, "harri": [5, 13], "harvest": 12, "hash": [8, 13, 16], "hast": [2, 15], "hasti": 0, "hat": [1, 5, 6, 8, 16], "hatcheri": 15, "hate": 15, "have": [0, 1, 2, 4, 5, 6, 7, 8, 9, 10, 13, 14, 15, 16, 17, 21], "haven": [6, 7, 8, 9, 17], "hazelnut": 8, "he": [0, 2, 5, 6, 8, 10, 13, 15, 16, 17, 18, 21, 22], "head": [0, 10, 13, 15], "header": [16, 21], "headquart": [10, 17], "heal": 17, "health": [2, 8, 16, 17], "healthi": [6, 13], "healthier": 13, "heap": 16, "hear": [2, 5, 8, 10, 13, 17], "heard": [7, 8, 9, 13, 16, 17, 18, 21], "heart": [2, 8, 10, 16, 17], "heather": 16, "heavenli": 0, "heavi": [1, 2], "heavili": 2, "hei": [6, 15, 18], "height": [0, 13], "held": [0, 16], "hello": [15, 16, 17], "help": [0, 1, 2, 5, 6, 8, 10, 13, 14, 15, 16, 17, 18, 21, 22], "helpfulli": 17, "helpless": 17, "henschel": [8, 10], "her": [2, 5, 6, 8, 10, 13, 15, 16, 17, 22], "here": [0, 2, 4, 5, 6, 8, 10, 11, 13, 14, 16, 17], "hernandez": 16, "hero": [8, 15], "heroku": 5, "herself": 6, "hi": [2, 5, 6, 8, 10, 13, 15, 16, 17, 21, 22], "hidden": [4, 6, 9, 11, 18, 19], "hide": 13, "higgin": 16, "high": [0, 1, 2, 5, 6, 8, 13, 16, 17, 18, 22], "higher": [0, 1, 8, 16], "higherlowergam": 11, "highest": [15, 21], "highli": [1, 2, 5, 7, 9, 15, 16, 18, 22], "highlight": [5, 6, 10, 11, 13, 15, 17], "highwai": 4, "hildebrandt": 15, "hill": 13, "hilton": [15, 16], "him": [2, 6, 8, 10, 13, 15, 16, 21, 22], "himself": [6, 8], "hint": [7, 9, 13], "hip": 13, "hire": [6, 8], "histor": [6, 7, 8, 9, 16, 17], "histori": [0, 5, 13, 15], "hit": [0, 5, 8, 13], "hitchcock": 13, "hobbyist": 17, "hodgkin": 16, "holberton": 8, "hold": [2, 10], "hole": [15, 16], "holi": 6, "holidai": 17, "holist": 17, "holm": 6, "holscher": [6, 10], "home": [1, 6, 15, 16, 17], "homeless": 13, "homemad": [13, 16], "homepag": 6, "homework": 16, "honei": [8, 13], "honestli": 6, "honeybadg": 8, "honor": [1, 5, 8, 16], "hook": [13, 17, 18, 22], "hoop": 6, "hop": 13, "hope": [1, 2, 4, 6, 8, 10, 15, 16, 17, 18, 22], "hopefulli": 5, "horizon": [5, 7], "horn": [0, 2, 16], "horror": 5, "hors": 13, "host": [0, 2, 5, 6, 8, 10, 17, 21], "hot": [6, 13, 16], "hotel": [5, 10, 15, 17], "hotpot": 2, "hotspot": 13, "hour": [2, 8, 10, 13, 17, 21], "hous": [1, 5, 6, 8, 10, 13], "housel": 22, "housemad": 8, "how": [0, 1, 5, 6, 7, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 21], "howard": 18, "howev": [4, 11, 13, 18, 21], "href": [4, 11], "html": [4, 8, 9, 11], "htmx": [7, 9], "http": [4, 5, 6, 8, 10, 11, 14, 19], "hub": 8, "huberman": 8, "huddl": 17, "hug": [16, 17], "huge": [0, 5, 6, 10, 15, 17], "hugo": [2, 16], "human": [4, 6, 15, 17, 22], "humanli": 4, "humbl": [6, 18], "humil": 16, "hummu": 0, "humor": [5, 15], "hunch": 15, "hungri": 8, "hunner": [5, 10, 15, 16, 22], "hunt": [2, 6, 8], "hunter": 2, "huntington": 15, "hurri": [13, 16], "hurrican": 17, "hurt": [6, 16, 17, 18], "husband": 16, "hustl": 22, "hynek": [16, 17, 22], "hyperlink": 21, "hypothet": 4, "i": [0, 1, 2, 5, 7, 9, 10, 11, 12, 13, 14, 15, 16, 17, 19], "ia": 4, "ic": [5, 6], "iclud": 16, "icon": [0, 10, 13], "id": [4, 6, 8, 11, 18], "id1130297669": 11, "idea": [2, 6, 7, 8, 9, 10, 13, 15, 18, 21, 22], "ideat": 17, "ident": 8, "identifi": [1, 4, 8, 11, 21], "idiomat": 22, "idressa": [2, 8, 16], "idrissa": [5, 17], "ignit": 1, "ignor": [8, 14], "iii": 15, "il": 4, "ill": [2, 10, 17], "illumin": 5, "imag": [8, 13, 17], "imagin": [4, 5, 6, 13, 16, 17], "imit": [8, 10, 16], "immedi": [2, 4, 13, 15, 16, 17, 18, 21], "immers": 13, "immigr": 17, "immut": 8, "impact": [1, 5, 6, 8, 16, 17], "impass": [6, 17], "implement": [5, 6, 16, 17], "import": [0, 1, 4, 5, 6, 8, 11, 14, 15, 16, 17, 18, 21, 22], "imposs": 6, "impress": [2, 5, 6, 13, 15, 16], "impromptu": [1, 6, 15], "improv": [4, 5, 6, 8, 10, 15, 16, 17, 21], "inact": 6, "inadequ": 8, "inappropri": 6, "inc": 10, "incarcer": 15, "incept": 6, "inch": 8, "incident": [6, 21], "includ": [0, 1, 2, 5, 6, 8, 9, 10, 11, 13, 15, 16, 17, 18, 21, 22], "include_trailing_comma": 14, "inclus": [4, 12, 15, 16], "incom": 16, "incomp": 14, "incompat": [5, 14], "inconsist": 4, "inconveni": 4, "incorpor": [0, 14, 17, 21, 22], "increas": [1, 2, 5, 8, 13, 16, 17, 21], "increasingli": [1, 5], "incred": [2, 5, 6, 8, 10, 13, 15, 16, 22], "incredibli": [10, 15], "incref": 16, "increment": 16, "indefinit": [4, 18], "indent": 14, "independ": 11, "index": [2, 4, 8, 21, 22], "indic": [4, 8, 14], "indistract": 22, "individu": [5, 8, 16, 18], "induc": 2, "industri": [13, 15], "ineffici": 16, "inexperienc": 6, "infam": 13, "influenti": 22, "info": [1, 6, 8, 14, 16], "inform": [0, 4, 6, 9, 14, 18, 21, 22], "infrastructur": [6, 16], "ing": 16, "ingram": 11, "ingredi": 13, "inherit": 5, "ini": 14, "initi": [0, 5, 6, 9, 16, 17, 18, 21], "inject": 16, "ink": 8, "inlin": 14, "inmat": 15, "inner": [5, 8, 12], "innov": 1, "input": [6, 15, 17], "inquir": 15, "ins": 5, "insati": 18, "insectarium": 6, "insid": [1, 8, 13, 16], "insight": [0, 5, 11, 15, 16, 17], "inspir": [0, 1, 6, 8, 15, 16, 17, 18, 21], "instagram": 13, "instal": [5, 8, 11, 14, 16, 18], "install_requir": 11, "instanc": [0, 4, 6, 11], "instant": 22, "instantli": 13, "instead": [2, 4, 5, 6, 8, 14, 16, 18, 21], "institut": 8, "instruct": [4, 11, 14, 16, 18, 21], "instructor": 18, "int": 16, "intact": 13, "intang": 8, "integerfield": 8, "integr": [0, 15, 17], "intellectu": 6, "intellig": [6, 8, 10, 16], "intend": [4, 5, 6, 11, 18, 22], "intent": [2, 18, 21], "intention": 17, "interact": [6, 8, 13, 16], "interdepend": 0, "interest": [0, 1, 2, 4, 5, 6, 7, 8, 9, 11, 13, 14, 15, 16, 17, 18, 21], "interfac": [4, 16], "interior": 8, "intermedi": [1, 22], "intermitt": 2, "intern": [1, 4, 5, 6, 16, 17, 22], "internet": [6, 16, 17], "internship": 6, "interpet": 17, "interpret": [14, 16, 17], "intersect": 13, "interview": [13, 16, 22], "interwoven": 17, "intrigu": 22, "intro": [5, 12], "introduc": [5, 6, 8, 16, 21], "introduct": [1, 22], "introductori": [0, 1, 18], "intuit": [7, 9, 18], "invalu": [0, 17, 18], "invari": 14, "invent": [5, 13], "inventori": 1, "invest": [5, 6, 8], "investig": [13, 17], "investor": 10, "invis": [6, 16, 17], "invit": [1, 2, 5, 6, 8, 9, 10, 15, 16, 17], "involv": [4, 5, 6, 8, 18], "io": [5, 16], "ip": 6, "ipad": 11, "iphon": 11, "ipod": 11, "iqbal": 16, "iris": 13, "irish": 15, "irizarri": [10, 17], "irk": 13, "iron": 16, "irwin": 16, "isdir": 21, "ish": [7, 9, 22], "island": [5, 8, 12], "isn": [0, 16], "isol": [6, 8, 13, 16], "isort": [0, 14], "isra": 0, "issu": [0, 4, 5, 6, 8, 11, 16, 17, 21], "itali": [5, 13], "italian": [5, 8, 13], "item": [4, 6, 11, 15, 16, 17], "itemprop": [4, 11], "itemscop": 4, "itemtyp": 4, "iter": [2, 14, 16, 21], "its": [2, 4, 5, 6, 13, 14, 16, 18, 21, 22], "itself": [0, 2, 5, 7, 11, 17, 18], "ivat": 8, "j": [5, 8, 9, 13], "jack": [10, 13], "jack1q": 11, "jacket": 13, "jacki": [10, 15, 16], "jackson": [13, 15], "jacob": [6, 16], "jacqu": 8, "jai": [2, 6, 8, 10], "jain": 1, "jam": 13, "jamaica": 4, "jame": [5, 6, 10, 13, 16], "jan": 2, "jane": 10, "janhang": 16, "janni": [15, 16], "japanes": 0, "jasmin": 0, "jason": [2, 6, 10], "java": 5, "javascript": [5, 6, 7, 8, 9, 11, 22], "jaw": [2, 6, 8, 13], "jawdrop": 5, "jean": [13, 15], "jedi": 16, "jeff": [2, 5, 6, 7, 8, 16], "jeffrei": 5, "jell": 16, "jenn": 17, "jeremi": 18, "jess": [16, 17], "jessica": [5, 15, 17], "jigyasa": [10, 17], "jim": [2, 10, 16], "jimmi": [11, 13], "jing": 16, "jinja": 6, "jiryu": 17, "jit": 2, "joann": 0, "job": [0, 6, 8, 16, 17, 18], "joel": [10, 15], "john": [0, 8, 11, 15, 21, 22], "johnson": [17, 22], "joi": [6, 13], "join": [1, 2, 8, 10, 12, 15, 16, 17, 18, 21], "joke": 13, "joker": 13, "jolla": 13, "jon": [6, 8, 10, 16, 17], "jonan": [0, 10], "jone": [2, 13], "joni": [2, 5, 8], "josh": [2, 10, 16, 21], "jos\u00e9": 17, "journal": [16, 21], "journalist": [10, 15, 17], "journei": [1, 2, 8, 16, 18, 22], "jp": 16, "jpmc": 2, "jpmorgan": [1, 16, 22], "jpmorganchas": [6, 8, 22], "json": [6, 11, 17], "jude": 15, "judgement": 13, "judgment": 18, "judi": 2, "judkin": 6, "juggl": 10, "juic": [6, 16], "juli": [0, 1, 16, 17, 22], "julia": [16, 22], "julian": 16, "juliu": 8, "jumbo": 5, "jump": [6, 18], "jumpstart": [4, 10], "june": [1, 6, 15, 16], "junior": 6, "junk": 16, "junod": 10, "jupyrest": 16, "jupyt": 5, "just": [0, 2, 5, 6, 8, 10, 13, 15, 16, 17, 18, 21], "justic": [13, 17], "justifi": [8, 16], "k": [2, 4, 6, 10, 11, 13, 17, 18, 22], "kabob": 0, "kadlec": 8, "kahlua": 16, "kale": 5, "kamar": 16, "kansa": [0, 2, 4, 10, 15], "kaplan": [6, 16], "karlin": 16, "kart": 8, "katherin": [5, 15, 17], "kathryn": 1, "kati": [8, 15], "katimichel": [18, 21], "kayvon": 10, "kazil": [10, 15, 16], "kb": 6, "keanya": 8, "keaton": 13, "kebab": 2, "keen": [6, 16, 17], "keep": [0, 2, 6, 8, 15, 16, 18, 21], "kefkowitz": 16, "kei": [2, 6, 8, 12, 16, 18], "keith": [5, 6, 15, 16], "kemenad": [2, 16], "ken": [5, 6, 8, 10], "kennedi": 4, "kenneth": [2, 10], "kent": 22, "kenya": 8, "kenyan": 8, "kept": 13, "kernel": 16, "kevin": [2, 16], "keyboard": 2, "keynot": [1, 2, 5, 6, 10, 12, 15], "keyword": [5, 14], "khanhicetea": 21, "kiara": [8, 10, 16], "kick": [5, 8, 13, 15, 17], "kickoff": [1, 6], "kickstart": [0, 1, 6], "kid": [2, 6, 8, 13, 17], "kill": 6, "killer": 13, "kilpatrick": 6, "kim": [16, 21], "kind": [0, 2, 5, 6, 8, 13, 15, 16, 17, 18], "kindli": [0, 16], "king": [2, 13], "kirbi": 6, "kiss": 8, "kkk": 0, "knew": [0, 6, 8, 13, 15, 16, 18, 21], "knight": [6, 16, 21, 22], "know": [0, 1, 2, 4, 5, 6, 7, 8, 9, 13, 15, 16, 17, 18, 21, 22], "knowledg": [0, 1, 2, 5, 11, 16, 17, 18], "known": [0, 1, 5, 7, 8, 9, 11, 16, 18, 21], "known_django": 14, "known_third_parti": 14, "knox": 11, "kofi": [6, 10, 16], "koji": [2, 8], "kojo": [5, 8, 16, 17], "kong": [2, 8], "koo": [2, 10], "koushik": 16, "kpmg": 6, "krenn": 16, "krishnan": 16, "kruger": 6, "kthrnmichel": [18, 21], "ku": 10, "kubernet": [6, 22], "kuchinski": 16, "kudo": 2, "kudzayi": [8, 10, 16], "kurt": 10, "kushal": [15, 16], "kwarg": 6, "ky": 4, "l": [6, 16, 21], "la": [0, 13, 17], "lab": [2, 8, 16, 22], "label": [4, 6, 11], "lacan": 8, "lacei": [2, 8, 10, 18], "lack": [6, 8, 17], "ladi": 13, "lag": 6, "laguardia": 17, "laid": 6, "lake": 15, "laloka": 16, "lam": 13, "lam\u00e9": 15, "land": [2, 17], "landfal": 17, "landini": 5, "landlock": 13, "landmark": [13, 15], "landscap": [5, 9, 13, 17], "lane": 13, "langa": [16, 22], "languag": [1, 4, 5, 6, 11, 12, 14, 16, 22], "lanyard": 8, "laptop": 16, "laravel": 6, "larg": [0, 5, 6, 8, 13, 15, 16, 17, 21, 22], "larger": [2, 5], "largest": [2, 5, 6, 10], "larri": 15, "larson": [16, 22], "laser": [6, 8], "last": [0, 1, 2, 5, 6, 8, 9, 10, 13, 15, 16, 17, 18, 22], "lat": [4, 11], "late": [0, 5, 6, 10, 11, 18], "latenc": [8, 16], "later": [0, 1, 4, 5, 6, 8, 10, 13, 15, 16, 17, 18, 21], "latest": [11, 22], "latin": 15, "latitud": [4, 11], "latt": [6, 8, 13], "laugh": [5, 13], "launch": [1, 16, 22], "laura": 5, "lava": 6, "lavin": 16, "lawn": [5, 6, 8], "lawrenc": [4, 8, 10, 16, 21], "lax": 13, "layman": 22, "layout": 2, "lazi": 8, "lead": [0, 1, 2, 4, 6, 13, 16, 17, 22], "leader": [0, 1, 6, 8, 16, 18, 22], "leadership": [1, 6, 7, 9, 10, 12, 15, 16], "leaf": 5, "leagu": 13, "leak": 6, "leapt": 13, "learn": [0, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 16, 17, 18], "least": [8, 16, 17], "leav": [6, 16, 17], "lebanes": 0, "lech": 8, "lectur": 12, "led": [1, 5, 6, 8, 15, 16, 17], "lee": [5, 8], "left": [5, 6, 8, 10, 13, 15, 16, 18], "legaci": [1, 2, 5], "legendari": 22, "leidel": [15, 16], "lemon": [0, 8], "lemur": [6, 10], "len": 21, "length": [6, 14], "lennon": 15, "leonard": 16, "leonardo": 13, "lerner": 16, "less": [4, 6, 8, 16, 18], "lesser": [7, 8, 9], "lesson": [1, 6, 7, 9, 16, 17, 22], "let": [4, 6, 14, 15, 17, 21], "leticia": 0, "letter": 4, "lettuc": 0, "level": [5, 6, 8, 16, 17, 18, 22], "leverag": [2, 16, 17, 21], "levi": 16, "lex": 22, "lfsando": 11, "li": [4, 11], "liaison": 1, "lias": 2, "lib": 16, "liberti": 12, "librari": [0, 4, 6, 13, 16, 18], "licens": [8, 11, 16], "lie": 8, "life": [0, 2, 4, 5, 8, 10, 13, 15, 16, 17, 22], "lifetim": [5, 17], "lift": [1, 2, 8, 17], "light": [2, 5, 6, 8], "lightheart": 13, "lightn": 16, "like": [0, 2, 4, 5, 8, 10, 13, 14, 15, 16, 17, 18, 21, 22], "lime": 6, "limit": [2, 5, 6, 16, 17, 18], "lincoln": 5, "lindsei": 10, "line": [5, 6, 8, 14, 15, 16, 21], "lineup": 5, "linguini": 6, "link": [0, 4, 6, 11, 16, 21], "linkedin": 13, "lion": 5, "list": [1, 4, 6, 10, 11, 13, 15, 16, 17, 18, 22], "listen": [8, 16], "liter": [4, 6, 13], "littl": [2, 5, 6, 8, 13, 16, 17], "live": [2, 4, 6, 8, 13, 15, 16, 17, 22], "livestream": 22, "livewir": 6, "lizzo": 13, "ll": [4, 5, 13, 21, 22], "llama": 16, "llm": [16, 22], "lloyd": 13, "llvm": 16, "lmsy": 16, "lo": [1, 12, 16], "load": [6, 8, 16], "loaf": 13, "loan": 2, "lobbi": [6, 8, 10], "lobster": [8, 16], "local": [0, 1, 5, 6, 7, 8, 9, 10, 11, 13, 15, 16, 17, 21], "localfold": 14, "locat": [0, 1, 5, 11, 16], "location_pattern": [4, 11], "lock": [4, 8, 16], "log": [6, 8, 16, 17], "logan": 6, "logic": 8, "logo": [2, 10, 15], "loiter": 13, "lol": [2, 10, 16, 18, 19], "lon": [4, 11], "long": [2, 4, 5, 6, 13, 15, 16, 18, 21, 22], "long_descript": 11, "long_description_content_typ": 11, "longer": [5, 6, 14, 21], "longest": [5, 6], "longhorn": 2, "longitud": [4, 11], "longterm": [2, 5, 17, 18], "longtim": [5, 6, 10], "look": [0, 2, 4, 5, 6, 8, 9, 10, 11, 12, 13, 16, 17, 18, 21, 22], "lookout": 5, "loop": [5, 12, 16, 17], "loos": 21, "lord": 0, "loren": [8, 16], "lorena": [15, 16, 17], "lorenzo": 10, "lose": 5, "lost": [5, 6], "lot": [0, 1, 2, 4, 5, 6, 8, 10, 13, 15, 16, 17], "loud": 16, "loui": [10, 17], "louis": 13, "loung": 2, "love": [0, 2, 5, 6, 8, 10, 13, 15, 16, 17, 18, 22], "lover": 15, "low": [6, 8, 10, 16], "lower": [2, 16], "lua": 16, "luca": 5, "luck": 13, "lucki": [10, 16, 18], "ludwick": 16, "lunch": [0, 1, 6, 8, 10, 15, 22], "lunchtim": 16, "lustau": 8, "lyft": 13, "lyme": 2, "lymphoma": 16, "lynda": 13, "lynn": [1, 15, 16], "lyric": 15, "m": [0, 2, 5, 6, 8, 13, 15, 17, 18, 21, 22], "m1": 16, "m2": 16, "m3": 16, "maam": 8, "mabel": 15, "mac": 5, "maca": 6, "macbook": 14, "machin": [5, 6, 8, 10, 16, 18], "machineri": 17, "maco": 16, "madagascar": [2, 6, 10], "made": [0, 1, 2, 4, 5, 6, 10, 11, 13, 14, 15, 16, 17, 18, 21, 22], "madison": 17, "maduro": 0, "mage": [5, 6, 15, 16], "magic": [5, 6, 10, 13, 15, 16], "magnet": 2, "maguei": 6, "mahi": 5, "mai": [1, 6, 7, 9, 10, 15, 16, 17], "main": [1, 4, 8, 13, 15, 16, 18, 21], "mainli": 11, "mainstream": 5, "maintain": [0, 5, 6, 10, 14, 15, 16, 17, 22], "mainten": 5, "major": [0, 1, 2, 5, 6, 8, 13, 15, 16, 18, 21], "make": [0, 2, 5, 7, 8, 9, 10, 11, 13, 14, 15, 16, 17, 18, 22], "makefil": 14, "makeup": 11, "malcolm": [10, 16], "mammogram": 2, "man": [6, 8, 16, 17, 18], "manag": [0, 1, 2, 5, 7, 8, 9, 12, 16, 18], "maneuv": 5, "mango": [0, 2], "manhattan": [10, 17], "mani": [0, 1, 2, 5, 6, 8, 10, 13, 14, 15, 16, 17, 18, 21, 22], "manicur": 5, "manifesto": 22, "manipul": 18, "manual": [14, 21, 22], "map": [4, 6, 16, 22], "marc": 16, "march": [0, 9, 16, 18], "marcia": 10, "mardal": 16, "margarita": 6, "margin": 5, "mari": [16, 17], "maria": 17, "mariatta": [10, 15, 16], "marin": 0, "marina": 5, "mariusz": [5, 6, 22], "mark": [6, 13, 16], "markdown": [11, 21], "markel": 2, "market": [0, 5, 6, 13, 16], "markup": 17, "marlen": 16, "marriot": 5, "marriott": [5, 6, 8], "marti": 22, "martin": 22, "marvel": 17, "marygold": 16, "mascot": 2, "maslow": 8, "mason": [2, 16, 17], "mass": [2, 16, 17], "massiv": [2, 4, 5, 8, 16, 18], "master": [4, 5, 8, 11, 14, 15, 16], "masteri": 8, "match": [4, 11], "materi": 16, "math": [6, 16, 17, 18], "matt": [5, 18, 22], "matter": [4, 5, 17, 21], "matth": [6, 10, 16, 18, 22], "mat\u00e9": 6, "mauritiu": 16, "mav": 2, "max": [6, 13, 14, 15, 21], "mayb": [4, 8, 16], "mayo": 5, "mccartnei": 15, "mckellar": 15, "mclaren": 2, "mclite": 13, "md": [0, 21], "me": [0, 1, 2, 5, 8, 10, 11, 12, 13, 15, 16, 17, 21, 22], "meagan": 16, "meal": [6, 10, 13, 16], "mean": [2, 13, 16], "meaning": [6, 17], "meant": [2, 11], "meantim": 16, "meanwhil": [6, 18], "measur": 14, "meat": [1, 13], "meatbal": 13, "mechan": [8, 16], "media": [2, 6, 8, 10, 16], "medic": 2, "mediterranean": [0, 6], "medium": 8, "meet": [0, 1, 2, 5, 10, 13, 15, 16, 17], "meetup": [0, 1, 2, 6], "meg": 17, "mega": 16, "mehran": [0, 18], "mel": 17, "melani": [5, 10, 16], "melchiorr": [6, 10], "mellon": 16, "member": [0, 1, 2, 5, 6, 7, 8, 10, 13, 15, 17, 18, 22], "membership": [6, 9], "memcopi": 16, "memhiv": 16, "memo": 2, "memor": 0, "memorabilia": [13, 15], "memori": [0, 10, 16, 21], "men": 5, "mental": [7, 9, 17, 18], "mention": [5, 17], "mentor": [0, 1, 6, 16], "mentorship": 6, "menu": [4, 8], "merci": 4, "mere": 8, "merg": [0, 4, 5], "meringu": 8, "mesa": [15, 16, 17], "mesrenyam": [6, 10, 16], "messag": [8, 14, 16, 17, 18], "met": [0, 2, 5, 6, 8, 10, 15, 16, 17, 18], "meta": 4, "metacognit": 8, "metaphor": [8, 10], "method": [1, 2, 6, 7, 8, 9, 10, 21], "methodologi": 8, "meticul": 4, "metric": [16, 17], "mexican": [0, 1, 15], "mexico": [5, 15], "meyer": 6, "mezcal": 6, "mfon": 0, "mi": 4, "miami": 0, "michael": [13, 15, 16], "michel": [5, 15, 17], "michelin": 13, "michigan": 4, "micro": [5, 6, 16], "microbenchmark": 16, "microbiom": 16, "microsoft": [16, 22], "mid": [5, 10], "middl": 17, "middlewar": 5, "midpoint": 18, "midwai": 5, "might": [0, 4, 5, 6, 13, 15, 16, 17, 18, 21], "mignonett": 8, "migrat": 14, "mike": 5, "mild": 8, "mile": 13, "mileston": 0, "milkshak": 13, "mill": 13, "millei": 16, "miller": [2, 6, 8, 10], "million": [16, 17], "min": 8, "mind": [4, 5, 13, 16, 17], "mindset": [1, 8, 21], "mine": [0, 21], "mingl": 15, "mini": [5, 15, 16], "miniatur": 16, "minifi": 4, "minim": [6, 16], "minimum": 8, "minut": [0, 2, 5, 6, 8, 13, 15, 16, 21, 22], "mirror": [8, 18], "misl": 6, "mismanag": 17, "miss": [2, 6, 14, 15, 16, 17, 18], "missingcompanyexcept": 6, "mission": [5, 13], "missouri": 10, "mistak": [6, 8, 16], "mister": 16, "mistral": 16, "mitchel": 5, "mix": [6, 13, 16, 18], "mkdoc": 17, "mlc": 16, "mn": 4, "mo": 4, "mobil": [6, 16], "mocha": 8, "mock": 17, "mocktail": 2, "model": [4, 5, 6, 7, 8, 9, 16, 17], "moder": [8, 21], "modifi": [14, 16, 21], "modul": [1, 4, 8, 16, 18, 22], "moe": 16, "mohka": 8, "mojito": 2, "moleskin": 16, "mom": [2, 10], "moment": [0, 5, 6, 8, 13, 16, 22], "momento": 13, "momentum": [0, 2], "mondai": [2, 12, 15, 18], "monei": [2, 8, 13, 16, 22], "mongodb": [2, 16], "monica": [1, 2, 8], "monitor": 8, "monkei": 17, "month": [0, 2, 4, 6, 8, 16, 17, 18], "monthli": 1, "mooc": 18, "moon": [0, 12, 13], "morai": 16, "more": [0, 1, 2, 4, 5, 7, 9, 10, 11, 12, 13, 14, 16, 17, 18, 21], "morehous": 15, "morenita": 0, "morgan": 22, "morn": [0, 2, 5, 6, 8, 10, 15, 16], "morovia": 6, "morsel": [16, 22], "mosh": [0, 16], "moss": [6, 16], "most": [1, 2, 4, 5, 6, 8, 13, 15, 17, 18, 21, 22], "motel": 13, "mother": [2, 13], "motiv": [8, 17, 18], "motorola": 16, "mount": 6, "mountain": 18, "mous": 4, "mouthwat": 6, "move": [0, 1, 5, 6, 8, 16, 17, 18, 21], "mover": 22, "movi": [5, 6, 13], "mozilla": [11, 16], "mozzarella": 6, "mr": [13, 16], "mra": 2, "mre": 8, "mt": 4, "mte90": 11, "mtv": 5, "much": [0, 4, 5, 6, 8, 10, 11, 13, 15, 16, 17, 18, 21], "muck": 16, "muheu": [10, 16], "multi": [5, 6, 9, 16], "multi_line_output": 14, "multilin": 21, "multipl": [1, 6, 8, 10, 13, 14, 16, 18], "multiprocess": 16, "multiten": [1, 6], "murder": 13, "muscl": [2, 4, 13, 21], "museum": [5, 10, 15, 17], "mushroom": [6, 13], "music": [2, 5, 6, 8, 13], "must": [2, 6, 8, 10, 18, 22], "mustard": 6, "mutat": 16, "my": [0, 1, 4, 5, 7, 8, 10, 11, 15, 16, 17, 19, 22], "myriad": 6, "myself": [0, 1, 2, 5, 6, 8, 10, 13, 15, 16, 17, 18, 21], "n": [8, 13, 16, 21], "n0shake": 4, "naacp": 13, "nacho": 5, "nail": [8, 16], "name": [4, 8, 11, 13, 16, 17, 18, 21, 22], "namibia": 6, "nantucket": 16, "nanyonga": [8, 10], "naomi": [15, 16], "napoleon": 16, "narrow": [8, 16], "nat": 10, "natalia": [1, 2, 10, 22], "nation": [16, 17], "nativ": [5, 6, 16], "natur": [6, 15, 16, 17], "navig": [5, 22], "na\u00efvet\u00e9": 0, "nc": 8, "nd": 4, "ne": 4, "nearbi": [5, 6, 10, 13, 15, 16], "nearli": [2, 5, 6, 15, 18, 21], "necessari": 16, "necessarili": [4, 6], "ned": [6, 10, 16], "need": [0, 4, 6, 8, 12, 14, 16, 17, 18, 21, 22], "neetcod": 22, "neetu": 1, "neg": [5, 17], "negoti": 1, "neighborhood": 16, "neil": 2, "neither": [11, 16, 17], "neo4j": [2, 10], "neomond": 6, "nest": [6, 21], "net": 8, "netflix": [13, 16, 22], "network": [2, 5, 6, 8, 15, 16, 17, 18], "neugebau": 15, "neural": 18, "nevada": 4, "never": [2, 5, 6, 10, 13, 15, 16], "nevermind": 15, "nevertheless": 13, "new": [0, 4, 5, 7, 8, 9, 10, 11, 12, 15, 16, 17, 18, 21], "newcom": [8, 11, 14, 16], "newest": 22, "newli": 16, "newman": 13, "newrel": 8, "newsfe": 21, "newslett": [2, 12, 22], "next": [1, 2, 4, 5, 6, 10, 12, 13, 15, 17], "ngazetungu": [10, 16], "ngeuebauer": 16, "nic": 16, "nice": [0, 8, 10, 15, 16, 18, 21], "nichol": 10, "nichola": 0, "nicholson": [1, 10, 13, 16], "nick": [2, 18], "nicol": 8, "nigeria": 16, "night": [2, 5, 6, 8, 10, 11, 16, 17], "nine": 13, "ninja": 9, "noah": [6, 10, 16], "node": [5, 16], "nomin": [6, 13, 16], "non": [5, 6, 8, 13, 16, 17, 18], "noon": 15, "nor": [11, 16, 17], "norm": [4, 6], "normal": [0, 1, 4, 5, 8, 11, 13, 15], "normalci": 0, "norman": 13, "north": [2, 5, 6, 8, 10, 15, 16, 17, 19], "notabl": [0, 5, 8], "note": [5, 12, 14, 16, 22], "notebook": [5, 16], "noth": [0, 5, 6, 13, 16], "notic": 21, "notion": 6, "notori": 13, "novel": [6, 7, 8, 9, 21], "novemb": [1, 6, 10], "now": [1, 2, 4, 5, 6, 7, 8, 10, 11, 13, 14, 15, 16, 17, 18, 21], "npm": 11, "ntale": 6, "number": [0, 1, 2, 4, 6, 8, 13, 14, 15, 16, 17, 18, 21, 22], "numer": 17, "nutshel": [16, 21], "nv": 4, "nvidia": 16, "ny": [4, 16], "nyc": 17, "o": [5, 6, 11, 16, 17], "obituari": 2, "object": [4, 8, 16], "obscura": 13, "observ": [6, 8, 15, 16], "obstacl": 17, "obtain": [1, 4, 6, 16, 22], "obviou": 21, "obvious": 18, "occasion": [0, 6], "occassion": 18, "occup": 5, "occupi": 16, "occur": [4, 5, 14], "ocean": [4, 5, 13, 16], "octob": [1, 4, 5, 6, 10, 19], "octocat": 10, "odd": [8, 10], "off": [0, 2, 5, 8, 13, 15, 16, 17, 18], "offer": [0, 1, 8, 16, 17], "offic": [6, 8, 13, 17], "offici": [4, 8, 11, 16, 17, 21], "oficina": 17, "often": [0, 4, 5, 6, 8, 15, 16, 18, 21], "oh": [2, 4, 8, 10, 13], "ohio": [10, 15], "oil": 0, "ok": [6, 8], "okken": 22, "okr": [7, 9], "oladel": 8, "old": [0, 2, 5, 8, 10, 13, 16, 21], "oliv": [0, 6], "oliveira": 5, "olivia": 13, "ol\u00e9": 4, "omit": 14, "onc": [1, 4, 5, 6, 14, 16, 17, 21], "one": [0, 2, 4, 5, 6, 8, 10, 11, 13, 14, 15, 16, 17, 18, 21, 22], "ones": [0, 6, 8], "ongo": 17, "onion": 13, "onli": [0, 4, 6, 8, 9, 10, 11, 13, 14, 15, 16, 17, 18], "onlin": [0, 1, 10, 16, 17, 18], "onsit": 1, "onto": 17, "op": [13, 16], "opaqu": 8, "open": [0, 1, 2, 4, 5, 7, 9, 10, 11, 13, 14, 15, 17, 18, 21, 22], "openai": 6, "openli": 16, "opensourcesurvei": 11, "openunit": 8, "oper": [5, 6, 8, 11, 14, 16, 21], "opinion": [6, 7, 9, 12, 16, 17, 21, 22], "opportun": [0, 1, 5, 6, 8, 10, 11, 13, 15, 16, 17, 18], "opt": 5, "optim": [6, 7, 9, 16, 17], "optimist": 16, "option": [4, 5, 6, 7, 8, 9, 11, 14, 16, 18, 22], "opul": 13, "oracl": 16, "orang": 8, "orchestr": [1, 2, 9, 16], "order": [0, 4, 6, 8, 13, 14, 16, 17, 18, 21], "ordinari": 13, "oregano": 13, "oregon": [0, 10], "org": [4, 8, 11, 16, 18], "organ": [0, 2, 5, 10, 11, 12, 13, 14, 16, 17, 21], "orient": [4, 5, 6, 8], "origin": [0, 8, 11, 13, 15, 21], "orm": 5, "orzo": 8, "oscar": 13, "osi": 11, "other": [0, 1, 2, 5, 6, 7, 10, 11, 13, 14, 15, 16, 17, 18, 21, 22], "otherwis": [2, 4], "our": [0, 1, 2, 4, 5, 6, 7, 8, 9, 10, 13, 15, 16, 17, 18, 22], "ourselv": [14, 15], "out": [0, 1, 2, 4, 5, 8, 10, 11, 12, 13, 14, 15, 16, 17, 21, 22], "outcom": [6, 18], "outfit": 13, "outlin": [5, 16, 17], "outlook": [7, 9], "output": [4, 21, 22], "outreach": 15, "outreachi": 6, "outright": 21, "outsid": [2, 6, 8, 10], "outstand": [1, 8, 10, 18, 22], "ovat": [6, 10, 13, 15], "over": [0, 1, 2, 5, 6, 8, 10, 13, 14, 16, 17, 18, 21, 22], "overal": 5, "overcast": 15, "overflow": [5, 14], "overhal": 16, "overhead": [5, 6, 16], "overkil": 21, "overli": 21, "overlook": [8, 13, 17, 21], "overpr": 13, "overrid": 6, "oversaw": [0, 16], "overse": [1, 2, 10, 11, 15, 17], "overseen": [18, 22], "overtak": 2, "overus": 6, "overview": [0, 5], "owasp": [7, 9], "own": [2, 4, 5, 6, 8, 11, 13, 14, 16, 17, 18], "owner": 11, "oyster": [8, 10], "oyugi": 8, "oz": 13, "p": 12, "paa": 6, "pablo": [15, 22], "pac": 8, "pace": 13, "pacif": 13, "pack": 13, "packag": [0, 2, 4, 6, 7, 8, 9, 10, 14, 16, 17, 22], "paddl": 16, "padilla": 17, "page": [2, 5, 6, 8, 10, 11, 14, 16, 17], "pagin": 17, "pai": [0, 6, 8, 12], "paid": [2, 6, 16], "pail": 8, "pain": [6, 13], "paint": [5, 18], "palm": [2, 5, 10], "palma": 13, "palooza": [10, 16], "pancreat": 2, "panda": [16, 22], "pandem": [1, 13], "pandi": 6, "panel": [5, 6, 10, 21], "panoram": 5, "paolo": [6, 9, 10], "paper": [16, 17], "paprika": 0, "parabl": 2, "parad": 2, "paradigm": 5, "paradox": 6, "parallel": [5, 8], "parallelis": 8, "paramet": [4, 16, 18], "paramount": 13, "parent": [6, 11], "parenthes": 4, "pariti": 16, "parizad": 10, "park": [10, 15, 17], "parlant": 18, "pars": [4, 5, 11, 16, 21], "parse_articl": 21, "parse_c": [4, 11], "parse_loc": [4, 11], "parse_st": [4, 11], "part": [0, 1, 4, 5, 8, 10, 13, 15, 16, 17, 18, 21], "parti": [1, 4, 6, 8, 17], "partial": 8, "particip": [0, 1, 2, 4, 6, 8, 13, 16, 18, 21], "particular": [5, 6, 8, 18], "particularli": [2, 5, 8, 13, 15, 17], "partner": 6, "partnership": 8, "pass": [2, 4, 5, 10, 16, 17, 18, 21], "passeng": [6, 13], "passenv": 14, "passion": [1, 6], "passiv": 6, "past": [0, 5, 6, 8, 13, 16, 17, 18], "pasta": [0, 5, 8, 13], "pastel": 5, "patch": [14, 16, 17], "path": [4, 6, 11, 14, 16, 17, 21, 22], "pathlib": 11, "pathwai": 18, "patio": 13, "patron": [5, 8], "pattern": [6, 8, 9, 12, 21], "patti": 18, "paul": [8, 13, 15, 16], "paus": 22, "pavilion": 6, "pawlik": [5, 6, 8, 10, 19], "payrol": 2, "pdb": 8, "pea": [8, 13], "peac": 15, "peacefulli": 2, "peak": [6, 16], "peanut": 2, "pearl": 2, "peck": 2, "pecorino": [8, 13], "pedest": 17, "peel": 8, "peke": 1, "pen": 16, "pendulum": 13, "penn": 17, "pennsylvania": [0, 2, 10, 17], "peopl": [0, 4, 5, 6, 9, 10, 13, 15, 16, 17, 18, 21, 22], "pep": [14, 16, 21, 22], "pepper": 8, "per": [2, 14, 16], "percentag": [14, 18], "percentil": 8, "percept": [16, 17], "perfect": [5, 6, 8, 10, 13], "perfectli": 13, "perform": [2, 4, 5, 6, 9, 15, 22], "pergola": [6, 8], "perhap": [0, 4, 6, 8, 13, 15, 16, 17, 18, 21, 22], "perimet": 17, "perman": 6, "permiss": [0, 17, 18], "perpetu": 18, "person": [0, 2, 4, 5, 6, 8, 10, 13, 15, 16, 17, 18, 21], "pescado": 5, "pespect": 8, "pet": 18, "peter": [5, 8, 10, 13, 16], "petr": 16, "pe\u00f1a": [8, 10], "phase": [5, 16], "phebe": 16, "phelp": 8, "philadelphia": 6, "philip": [8, 16], "philli": 16, "philosoph": 8, "philosophi": [8, 17, 18], "phone": [4, 6, 11], "photo": [0, 1, 2, 5, 6, 8, 10, 12, 13, 15, 17, 18], "photograph": [2, 16], "php": [6, 11], "phrase": 6, "physic": [2, 6, 16, 17], "physicist": 16, "physiqu": 2, "piazza": 5, "pic": [1, 6, 8, 10, 13], "pick": [4, 6, 12, 15, 17, 18], "pickl": [8, 16], "pico": 0, "pictur": [0, 2, 5, 10, 17], "picturesqu": [0, 5], "pie": [6, 8], "piec": [4, 6, 17, 21], "piech": [0, 18], "pier": [2, 5], "piggi": 16, "pillow": [16, 18], "pilot": [7, 9, 13], "pinax": [5, 11, 12, 15, 16, 17, 18], "pinch": 16, "pineappl": 1, "pink": [6, 13], "pinki": 2, "pip": [2, 16], "pipe": 16, "pipelin": [6, 16, 17], "piper": [13, 17], "piqu": [2, 8, 11, 18, 21], "pistachio": [2, 8], "pit": 6, "pita": 0, "pitch": 2, "pitfal": 6, "pittsburgh": [2, 10, 16], "pixel": 18, "pizza": [6, 8], "pizzeria": 5, "place": [2, 4, 5, 6, 7, 8, 10, 12, 13, 14, 15, 16, 17, 21], "plai": [2, 5, 8, 10, 11, 13, 15, 19], "plain": 13, "plan": [0, 1, 2, 4, 5, 8, 13, 15, 16, 17, 21], "plane": 5, "plano": 12, "plant": [4, 6], "plantain": 2, "plaqu": 17, "plate": 5, "platform": [0, 5, 16, 21], "playa": 13, "playbook": 17, "player": 5, "playwright": [6, 7, 9], "plaza": 13, "plea": 8, "pleas": 15, "pleasantli": 0, "pleasur": [2, 5, 6, 8, 10, 15, 16, 17, 22], "plenti": 0, "plu": [5, 15, 21], "plugin": 16, "pm": [10, 15, 16], "podcast": [8, 9, 12], "poem": 17, "poinant": 17, "point": [2, 5, 6, 8, 11, 13, 16, 17, 18, 21], "pointer": 16, "poke": 5, "polar": 13, "polici": [6, 8], "polish": [6, 11, 16], "polk": 16, "pollin": 16, "polygon": 16, "ponder": 16, "ponysauru": [6, 8], "ponzu": 2, "pool": [5, 6], "poor": 17, "poorli": [4, 21], "popul": [2, 6, 10], "popular": [2, 5, 6, 7, 8, 9, 10, 14, 16, 17, 21, 22], "porchetta": 13, "pork": [1, 2, 13], "port": [5, 8], "portal": 6, "portfolio": 0, "portion": [0, 2, 6, 13], "portland": [0, 10], "portrait": 15, "pos1": 21, "pos2": 21, "pos3": 21, "pos4": 21, "pos5": 21, "pose": 16, "posit": [0, 5, 13, 16, 21], "possess": 6, "possibl": [4, 6, 8, 10, 16, 17, 18], "possibli": 18, "post": [0, 1, 4, 6, 8, 11, 12, 13, 16, 18, 21, 22], "postal": 4, "postaladdress": 4, "postalcod": [4, 11], "postcod": [4, 11], "postgr": [1, 8, 9, 16, 17], "postgresql": [16, 22], "potato": [4, 8, 13], "potenti": [0, 6, 16, 17, 21], "potter": [5, 13], "pound": 14, "pour": [1, 6, 8], "poverti": 13, "power": [1, 4, 6, 10, 12, 15, 16, 18, 21], "pr": [0, 5], "pra": 17, "practic": [0, 1, 5, 6, 7, 8, 9, 10, 15, 16, 18, 22], "practition": [1, 2], "pragmat": 22, "prais": [5, 6], "pre": [5, 10, 12, 13, 16, 19], "preconceiv": 6, "predic": 6, "predict": [4, 8, 16, 18], "prefer": [8, 21], "prefetch": [5, 8], "prejudic": 6, "premier": 13, "premium": 17, "prep": [5, 6], "prepar": [16, 18], "present": [0, 1, 2, 5, 6, 8, 10, 13, 16, 18], "presid": [6, 8, 16], "preslei": 15, "press": [2, 13], "pressur": 2, "presumpt": 6, "pretend": 13, "pretezel": 5, "pretti": [0, 13, 16], "prettier": 11, "preval": 6, "prevent": [5, 6, 16, 17], "preview": 6, "previou": 0, "price": [8, 13], "primari": [6, 8], "primarili": [5, 14, 17, 18], "primeagen": 22, "primer": 22, "primit": 16, "princeton": 16, "princip": [6, 10], "principl": 22, "print": 13, "prior": 2, "priorit": [7, 9, 15], "prioriti": [5, 6, 13, 15, 18], "prison": 15, "privat": [2, 8, 13, 16, 21], "privileg": [6, 8, 17], "prize": [6, 10], "pro": [2, 8, 11, 16], "proactiv": 15, "probabl": [2, 5, 6, 8, 10, 13, 16, 21], "problem": [4, 5, 6, 8, 9, 17, 18, 21, 22], "problemat": 16, "procedur": 21, "process": [0, 2, 4, 5, 6, 8, 11, 16, 17, 18, 21, 22], "procida": 6, "procur": 8, "prod": [7, 8, 9], "produc": [0, 1, 13, 15, 22], "product": [0, 1, 4, 5, 6, 7, 9, 10, 11, 12, 13, 16, 17], "profession": [0, 6, 17, 22], "profil": [6, 9, 10, 13, 22], "profit": [5, 6, 7, 8, 9, 16, 17], "program": [0, 1, 2, 5, 6, 8, 11, 14, 15, 16, 17, 22], "program_inform": 21, "programat": 4, "programm": [6, 16, 17, 22], "programmat": 21, "progress": [0, 4, 5, 7, 8, 9, 10, 15, 16, 18, 21, 22], "project": [0, 1, 2, 4, 5, 6, 11, 12, 14, 15, 16, 17, 21, 22], "prolif": [8, 16, 22], "prolong": [0, 16], "promis": [5, 8], "promot": [6, 15, 16, 17], "prompt": 16, "prone": [6, 16], "pronounc": 16, "proof": 18, "prop": 13, "proper": 5, "properli": [5, 11], "properti": [4, 6, 11, 13], "proport": 6, "propos": [0, 1, 4, 6, 10, 14, 16, 21, 22], "prospect": [2, 17, 18], "protect": 16, "protocol": 16, "prototyp": [7, 9, 16], "prot\u00e9g\u00e9": 8, "proud": [2, 5, 6, 8, 10, 15, 16], "proudli": 16, "prove": 15, "provid": [0, 2, 5, 6, 8, 11, 13, 14, 16, 17, 18], "provok": 15, "proxim": 13, "psf": [1, 2, 8, 10, 15, 17, 22], "psycho": 13, "psychoanalyt": 8, "psycholog": [8, 17, 18], "psychologi": [5, 17, 22], "pub": [15, 16], "public": [1, 4, 8, 10, 11, 12, 13, 15, 16, 18, 22], "publicli": 6, "publish": [0, 1, 2, 5, 7, 9, 11, 15, 17, 22], "puerto": 17, "pull": [2, 4, 5, 6, 11, 14], "pumpkin": [6, 13], "puppet": 13, "purcel": 16, "purchas": 2, "pure": [5, 8, 16], "purpos": [4, 14], "pursu": 17, "push": [6, 13, 14, 16], "pusher": 8, "put": [0, 2, 4, 5, 6, 8, 16, 17, 18, 22], "py": [4, 6, 11, 14, 16, 21, 22], "pybai": 16, "pycascad": [12, 16], "pycharm": 18, "pycon": [0, 1, 5, 6, 8, 12, 17], "pydant": [2, 16], "pydata": 6, "pyenv": 14, "pygotham": [1, 12, 15, 16], "pyguid": 22, "pyhat": 6, "pylad": 16, "pyladi": [0, 6, 15], "pylatam": [10, 15], "pylint": 11, "pymug": 16, "pyodid": 5, "pyohio": 16, "pypa": 11, "pyperform": 16, "pypi": [2, 14, 16], "pyqt5": 11, "pyramid": 6, "pyscript": [7, 9], "pytest": [6, 7, 8, 9, 22], "pytexa": [1, 6, 12, 16], "python": [0, 1, 4, 6, 7, 9, 10, 11, 12, 15], "python_requir": 11, "pythonista": [15, 16, 17], "pytz": 16, "quadrupl": 8, "qualif": 6, "qualifi": [4, 11, 17], "qualiti": [0, 6, 8, 12, 14, 17, 18, 22], "quansight": [2, 16], "quantit": 16, "quarter": [1, 5], "queeni": 10, "queri": 8, "queryset": 8, "question": [0, 6, 8, 13, 15, 16, 17, 18], "queue": 16, "quibbl": 18, "quick": [5, 6, 8, 13, 16, 21], "quicker": 6, "quickli": [6, 8, 16, 17, 18, 21, 22], "quickstart": 16, "quiet": 13, "quintessenti": 5, "quirki": [0, 2], "quit": [0, 1, 5, 6, 8, 10, 13, 15, 16, 18, 21], "quo": 8, "quot": [8, 11, 14, 21], "quotat": 6, "qwerti": 2, "race": 6, "rachel": [6, 18], "racism": 0, "rack": [8, 16], "radar": [1, 22], "radiat": 16, "radish": 8, "raegon": 21, "rag": 16, "ragu": 13, "rahmaan": 16, "rai": 17, "railroad": 8, "rais": [6, 7, 9, 16], "raleigh": 6, "ralli": 0, "ramen": 2, "ramirez": 13, "ramp": 17, "ran": [5, 8, 21], "random": 2, "randomli": [13, 15, 18], "rang": [1, 6], "ranger": 17, "rank": 16, "rapid": 15, "rare": [6, 16], "rat": 2, "rate": [0, 1, 2, 8, 16], "rather": [5, 14, 15, 16], "ravag": 17, "rave": [2, 6], "raw": [13, 16], "raygun": 8, "re": [4, 5, 6, 11, 15, 16, 17, 21], "reach": [0, 2, 5, 6, 16, 17, 18], "react": [0, 6, 7, 8, 9, 17], "reactiv": [6, 8], "reactj": 6, "read": [0, 2, 4, 5, 6, 8, 10, 13, 16, 17, 22], "read_text": 11, "readi": [5, 6, 12, 16], "readm": [0, 21], "real": [2, 5, 6, 8, 10, 11, 13, 15, 16, 17, 18, 22], "realiti": [13, 17], "realiz": [6, 8, 10, 13, 15, 17, 18, 21], "realli": [0, 1, 2, 6, 8, 13, 15, 16, 17, 18], "realpython": 11, "reason": [13, 16], "rebecca": 6, "rebel": 13, "reboot": 17, "rebuild": 16, "recal": 6, "recap": [10, 13], "receiv": [4, 6, 11, 14, 15, 18], "recent": [0, 4, 6, 8, 11, 13, 14, 16, 17, 21, 22], "recept": [5, 15], "recipi": 10, "recod": 10, "recogn": [6, 16, 17], "recognit": 5, "recommend": [2, 4, 5, 6, 13, 15, 16, 22], "reconnect": 15, "record": [0, 2, 6, 10, 13, 16, 19, 21, 22], "recreat": 8, "recruit": [8, 17], "recurs": [9, 16], "red": [1, 4, 6, 8, 13], "redeem": [8, 16], "redefin": [2, 5], "redesign": [5, 17], "redi": [8, 17], "redirect": 8, "redondo": 13, "reduc": [0, 5, 8], "redux": [6, 8, 11], "ref": [4, 11, 16], "refactor": [8, 12], "refer": [4, 6, 8, 14, 16, 18], "referenc": [8, 17], "reflect": [0, 1, 2, 6, 8, 12, 16, 17, 22], "reformat": 14, "refresh": 18, "regardless": [11, 17], "region": [0, 15, 16, 17], "regist": [15, 16], "registr": [6, 17], "regret": [13, 15], "regular": [2, 4, 6, 13, 18], "regularli": [2, 13, 16, 18, 21], "rehears": 13, "rei": 13, "reilli": [16, 22], "reimburs": 2, "reinforc": [0, 18], "reinvent": 5, "reitz": 2, "reject": 15, "rekindl": [2, 6], "rel": [7, 11, 16, 21], "relat": [0, 16, 21, 22], "relationship": [6, 15], "relax": [0, 5, 8, 15], "releas": [2, 11, 12, 15, 16, 17, 18], "relev": [2, 4, 5, 7, 9, 11, 14], "reli": 16, "reliabl": 17, "reliev": 16, "relleno": 0, "reload": 16, "reloc": 16, "relocat": 16, "remain": 5, "remak": 17, "remark": [6, 10, 19], "rememb": [15, 16, 17, 21], "remind": [0, 6, 8, 18], "remiss": 0, "remot": [0, 6], "remov": [6, 8, 16, 17, 21], "renam": 6, "renato": 5, "render": 6, "renew": [6, 16], "reno": 4, "renov": 0, "repeat": [16, 18], "repetit": 16, "repl": [5, 6], "replac": [5, 6, 11], "replai": [2, 5, 6, 8, 16], "repli": [15, 16], "replica": 17, "repo": [0, 2, 4, 6, 11, 14, 16, 18, 21], "report": [6, 8, 16, 17], "repres": [6, 10, 13, 15, 16], "represent": [6, 8, 15, 18], "representaton": 17, "reproduc": 8, "request": [2, 4, 5, 6, 11, 14], "requir": [4, 5, 6, 16, 17, 18], "requisit": 16, "rerun": 14, "research": [0, 5, 6, 13, 15], "reserv": 13, "resid": [16, 22], "residenti": 13, "resili": 6, "resist": [8, 10, 11, 13, 15, 16], "resolut": 16, "resolv": 11, "reson": [5, 17], "resourc": [1, 6, 8, 9, 11, 12, 16, 17, 21], "respect": 16, "respond": 22, "respons": [4, 6, 11, 16, 17], "rest": [7, 9, 11, 16, 17, 22], "restaur": [0, 4, 5, 6, 8, 10, 13, 16], "restauraunt": 13, "restrict": [6, 17], "result": [0, 4, 5, 6, 8, 11, 14, 16, 17, 21], "resum": [0, 6], "retain": 17, "retent": 6, "retir": 8, "retriev": [8, 16], "retro": 1, "retrofit": 5, "retrospect": [7, 9], "return": [0, 2, 5, 6, 8, 11, 13, 15, 17, 21], "reunit": 6, "reusabl": 2, "reuven": 16, "reveal": [8, 13], "revers": 21, "review": [1, 2, 4, 5, 6, 10, 13, 16, 17], "revis": [0, 16], "revisit": [8, 21, 22], "reviv": 16, "revolut": 0, "revsi": [6, 8, 16], "rewrit": 21, "rgb": 18, "ribbon": 5, "rican": 17, "rice": [0, 2, 6], "rich": [4, 6, 17], "richard": [6, 13, 18], "richardson": 16, "rico": 17, "riddler": 13, "ride": [0, 8, 13, 16, 17], "riggin": 2, "right": [2, 4, 5, 6, 8, 15, 16], "rim": 6, "rink": 13, "rippl": 13, "rise": 5, "risk": [6, 8, 21], "riskiest": 6, "rita": 16, "river": 16, "rivera": [10, 15, 17], "road": [4, 8], "roadmap": [7, 9, 22], "roald": 16, "roar": [6, 16], "roast": 2, "rob": [8, 16], "robot": 0, "rock": [13, 15], "rode": [13, 17], "rodeo": 1, "rodrigo": [13, 16], "rodrigu": 16, "roger": 16, "role": [2, 6, 8, 10, 15, 16, 17], "roll": [8, 15], "rollbar": 8, "roller": 13, "rollerblad": 5, "roof": 13, "rooftop": 16, "room": [5, 6, 8, 10, 13, 15, 16, 17], "root": [1, 6, 8, 15, 16, 17, 21], "ropita": 0, "rose": [2, 5, 8, 15], "rossum": [0, 6, 10, 15, 16], "roughli": 16, "roughrid": 2, "round": [5, 16], "roundup": 2, "rout": 6, "router": 6, "routin": 21, "row": [2, 5, 8, 10, 13, 15, 16], "roxi": 13, "rub": 13, "rubber": [8, 16], "rudimentari": 17, "rule": [14, 16], "run": [4, 5, 6, 8, 11, 13, 16, 17, 18, 21], "rundown": 6, "runkl": 16, "runtim": [5, 16], "russel": [5, 6, 8, 15, 16], "russellvil": 4, "r\u00e9publiqu": 13, "sa": 6, "sabella": 15, "sabet": 10, "sad": 13, "sadli": 17, "safe": [5, 6, 8, 16], "safeti": [6, 8, 16], "saffron": [0, 2], "sahami": [0, 18], "sai": [0, 4, 5, 8, 10, 15, 16, 17, 18, 22], "said": [0, 2, 4, 5, 6, 8, 13, 15, 16, 17, 22], "sailboat": 13, "saint": 10, "sake": 2, "salad": [0, 8], "salari": 8, "sale": 22, "salesforc": 10, "salgado": [15, 22], "salsa": 1, "salt": [5, 6, 8, 16], "saltin": 8, "sam": 16, "samara": 13, "same": [2, 4, 5, 6, 8, 11, 13, 15, 16, 17, 18, 21], "sampl": [8, 11, 15], "sampleproject": 11, "san": [2, 5, 10, 13, 15, 17, 19], "sand": [5, 13], "sandra": 8, "santa": [1, 2], "sara": 5, "sarah": [16, 22], "sat": [8, 13, 16], "satisfi": [0, 6, 16, 17], "satur": 16, "saturdai": [6, 8, 10, 12, 17], "sauc": [2, 5, 6, 8, 13], "saucelab": 16, "sausag": [6, 8, 13], "save": [4, 5, 21], "savori": [6, 8], "saw": [0, 1, 2, 8, 10, 13, 15, 16, 17], "sbom": 16, "scalabl": [5, 22], "scale": [4, 5, 7, 8, 9, 16, 17, 21], "scallion": 8, "scallop": [8, 16], "scandir": 21, "scari": 0, "scenario": [4, 8], "scene": [6, 8, 13, 15, 16], "scenic": 13, "schedul": [4, 14, 15, 16], "scheffler": [0, 10], "schema": [4, 6, 11], "scheme": 6, "schill": [2, 6, 8, 9, 10], "schlawack": [16, 17, 22], "schmanci": 13, "schneider": 16, "school": [6, 8, 12, 13, 17], "scienc": [2, 13, 17], "scientist": [4, 16, 17], "scoop": [6, 22], "scope": 8, "score": [15, 16], "scott": [0, 16], "scottish": 17, "scrabbl": 2, "scrambl": [6, 13], "scrape": [11, 17], "scraper": 0, "scrapi": [4, 11], "scratch": 0, "scream": 13, "screen": [8, 13, 16], "screenshot": 10, "scribbl": 17, "script": [0, 4, 11, 15], "scroll": 8, "scrum": 12, "sd": 4, "sea": [5, 6, 16], "seafood": 1, "search": [4, 5, 6, 8, 13, 14, 17], "searchabl": 17, "season": [6, 8], "seaver": 16, "sec": [0, 6], "second": [1, 2, 5, 6, 8, 10, 13, 16, 18, 21], "secondli": [4, 15], "secret": [8, 13], "secretari": [6, 16], "section": [0, 1, 12, 14, 21], "secur": [1, 5, 6, 7, 9, 14, 16, 22], "see": [0, 1, 2, 4, 7, 9, 10, 11, 12, 13, 14, 16, 17, 18, 21, 22], "seek": 8, "seem": [0, 8, 11, 16, 18, 21], "seemingli": [18, 21], "seen": [5, 6, 13, 15, 16, 17], "segal": 10, "segment": 16, "select": [1, 5, 15, 16, 18], "selenium": [6, 7, 9], "self": [4, 5, 6, 11, 15, 16, 17, 21], "selfi": [10, 15, 16], "selivanov": 16, "sell": 16, "semin": 6, "senat": 16, "send": [6, 16, 17], "senior": [2, 6, 8, 16], "sens": [2, 6, 8, 13, 17, 18], "sent": [6, 8, 15], "sentenc": [15, 16], "sentri": [8, 16], "seoul": 6, "separ": [1, 2, 5, 14, 16], "septemb": [0, 1, 5, 8, 10, 19], "sequenc": 16, "sequenti": 8, "serend": 6, "serendip": 10, "serendipit": [6, 16], "serendipiti": [8, 17], "serhii": 16, "seri": [9, 22], "serial": 13, "seriou": 22, "serr\u00e3o": 16, "serv": [0, 1, 4, 6, 8, 13, 14, 16], "server": [5, 6], "servic": [2, 5, 6, 8, 13, 15, 16, 17, 18], "sesam": 2, "session": [1, 2, 5, 6, 8], "set": [1, 4, 5, 6, 8, 10, 13, 14, 16, 17, 21], "seth": [16, 22], "settl": [13, 16, 21], "setup": [5, 11], "setuptool": 11, "seuss": [2, 10], "seven": [8, 16], "seventh": 8, "sever": [0, 4, 5, 6, 8, 13, 14, 15, 17, 18, 22], "sfo": 15, "sha": 15, "shade": 15, "shadow": 17, "shaker": 22, "shakira": 13, "shakur": 13, "shallow": 8, "shame": 16, "shania": 13, "shape": [2, 6], "share": [1, 2, 5, 6, 15, 16, 18], "shark": 8, "shaw": 16, "shawcroft": 0, "she": [2, 5, 6, 8, 10, 13, 15, 16, 17, 18, 22], "sheena": 6, "sheet": 22, "shehack": 5, "sheldon": 2, "shell": 5, "shelter": [0, 17, 18], "shero": 5, "sherri": 8, "ship": [5, 17], "shirt": [4, 10, 15, 16], "shock": 13, "shockingli": 10, "shoestr": 6, "shoot": 5, "shop": [1, 5, 6, 8, 13], "short": [2, 4, 5, 6, 8, 16, 18, 22], "shorten": 2, "shot": [2, 10, 13], "should": [5, 6, 7, 8, 13, 14, 16, 17, 18], "shoulder": 13, "shouldn": 18, "shout": 8, "shoutout": [2, 5, 8], "show": [0, 4, 5, 6, 8, 10, 11, 13, 14, 16, 17, 18], "show_miss": 14, "shred": [0, 6], "shrimp": 13, "shurett": 17, "shut": 16, "shutter": 13, "shy": 6, "sick": 5, "side": [0, 1, 5, 6, 8, 10, 13, 16, 17], "sidewalk": [0, 13], "sierra": 16, "sight": [12, 13, 17], "sightse": [5, 13], "sigma": 8, "sign": [0, 5, 8, 12, 14, 15, 18], "signal": 16, "signatur": [6, 8], "signific": [6, 17], "significantli": [16, 21], "silenc": 13, "silicon": 16, "silk": 8, "silki": 6, "simba": [0, 18], "similar": [2, 4, 5, 6, 16, 18, 21], "similarli": [5, 8], "simon": [8, 10, 21, 22], "simonetti": 8, "simpl": [5, 8, 11, 12, 13, 16, 21, 22], "simpleimag": 18, "simpler": 16, "simplest": [16, 21], "simpli": [6, 13, 18], "simplic": 16, "simul": [0, 8, 13, 15], "simultan": [0, 10, 18, 19], "sinc": [0, 2, 6, 8, 10, 13, 16, 21], "sing": [6, 8], "singer": 6, "singl": [5, 6, 8, 14, 16], "sip": 11, "sister": 2, "sit": [1, 2, 6, 8, 10, 13, 16, 17], "site": [4, 6, 8, 17, 18, 22], "situat": [4, 16], "six": [6, 8, 16], "sixth": 6, "size": [0, 2, 8, 15, 18], "sizeabl": 0, "skate": 13, "skateboard": 13, "skatepark": 13, "skater": 13, "skeksi": 13, "skeleton": 6, "sketch": 5, "skid": 13, "skill": [0, 1, 15, 16, 17, 18, 22], "skillset": 17, "skip": [4, 8], "skip_glob": 14, "sky": 5, "skylin": [5, 8, 15, 17], "slack": 6, "slash": 4, "slate": 21, "slice": [1, 2, 8], "slide": [0, 1, 4, 5], "slightli": [2, 16], "slop": 16, "slot": 6, "slow": [8, 16], "slower": [16, 21], "slowest": 6, "small": [0, 2, 8, 13, 15, 17, 18, 21, 22], "smaller": [2, 5, 8, 11, 13, 15, 16, 18], "smallintegerfield": 8, "smart": 16, "smartphon": 16, "smile": [2, 15], "smog": 13, "smoke": 8, "smooth": 6, "snap": 1, "snapshot": [12, 16], "snippet": [4, 11, 16], "snl": 11, "snow": 8, "snowflak": 16, "so": [0, 1, 2, 4, 5, 6, 8, 10, 11, 13, 15, 16, 17, 18, 21], "sober": 8, "social": [2, 9, 10, 13, 16, 17], "societ": 17, "sock": 16, "sofa": [2, 13], "soft": [2, 6, 10, 13], "softwar": [0, 1, 2, 5, 6, 7, 8, 9, 11, 14, 16, 17, 21, 22], "sold": [5, 15, 16], "solicit": 11, "solidar": 16, "solut": [16, 18, 21], "solv": [4, 5, 8, 9, 17, 18, 21], "some": [0, 1, 2, 4, 5, 6, 10, 11, 13, 14, 15, 16, 17, 18, 21, 22], "somebodi": 6, "somedai": [6, 8], "somehow": 11, "someon": [6, 13, 15, 16, 17, 18], "someth": [0, 2, 4, 6, 8, 13, 15, 16, 17, 18, 21], "sometim": [0, 4, 5, 6, 13, 15, 17], "somewher": [8, 17], "son": 10, "soo": 6, "soon": [1, 6, 10, 16, 17, 18], "sophist": 0, "sorri": 13, "sort": [14, 21], "sottil": 22, "souffl\u00e9": 5, "sought": 0, "soultrain": 13, "sound": [5, 6, 13], "soundstag": 13, "soup": [11, 16], "sourc": [0, 2, 4, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 21, 22], "south": [6, 8, 13, 17], "southern": 6, "southwest": 0, "souveni": 17, "spa": 6, "space": [0, 4, 8, 9, 10, 11, 14, 15, 16, 17, 18], "spaghetti": [13, 16], "spain": 6, "spam": 16, "span": [4, 11], "spanish": [10, 19], "sparkl": 5, "spawn": 16, "speak": [1, 5, 6, 12, 16, 17, 19], "speaker": [2, 5, 10, 12, 15, 16, 17, 22], "spearhead": 8, "spec": 16, "special": [2, 5, 6, 8, 10, 14, 15, 16, 17, 18, 21], "specif": [2, 4, 6, 8, 11, 14, 16, 18, 21, 22], "specifi": 14, "spectacular": [5, 13], "specul": 13, "sped": 5, "speed": [16, 21, 22], "spell": 13, "spend": [2, 6, 8, 10, 15, 16, 17, 18, 21, 22], "spent": [0, 1, 8, 13, 15, 16, 17], "sphinx": 17, "spice": [0, 6, 13], "spider": [4, 11], "spielberg": 13, "spirit": [8, 11], "spit": 17, "splash": 13, "split": [2, 16, 17, 18, 21], "spokan": [10, 16, 19], "spoke": [5, 6, 16], "sponsor": [4, 6, 8, 15, 16], "sponsorship": [1, 2, 5, 6, 8, 16, 17], "spontan": [16, 17], "spooki": 16, "spot": [5, 8, 13, 15, 17, 18], "spotifi": 16, "spread": 6, "springboard": 16, "sprint": [1, 6, 10, 12, 16], "sprinter": 5, "spur": 13, "spy": 6, "sql": [1, 8, 9, 16, 21], "sqlite": 22, "squar": [10, 16, 17], "squeez": 16, "squid": 8, "sre": 22, "ssh": 6, "st": [4, 17], "stabl": 16, "stack": [5, 6, 14, 16, 22], "staff": [13, 16, 18, 22], "stage": [0, 6, 8, 13, 16, 17, 19], "stai": [1, 13, 16, 21], "stair": [13, 17], "stalker": 13, "stan": 6, "stand": [2, 5, 6, 8, 9, 10, 13, 15, 16, 17, 22], "standalon": 11, "standard": [0, 4, 5, 6, 8, 12, 16, 18], "stanford": [12, 21], "star": 13, "starlight": 13, "start": [0, 1, 2, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15, 16, 17, 18, 21], "start_url": [4, 11], "starter": [14, 15, 16], "startswith": 21, "startup": [0, 6, 8], "stat": [2, 6, 8, 21], "state": [4, 6, 8, 10, 11, 13, 16, 17, 21], "state_pattern": [4, 11], "statement": 8, "staten": 17, "static": [6, 16], "station": [5, 16, 17], "statu": [6, 8, 10, 12, 13, 21, 22], "stdlib": 14, "steak": [0, 13], "steakhous": 1, "steel": 16, "steer": [6, 7, 9], "stellar": [1, 5, 13, 21], "stem": 16, "step": [1, 2, 6, 8, 11, 12, 13, 16, 17, 21], "stepter": 15, "stereotyp": 8, "steven": 13, "stevensvil": 4, "stew": 0, "steward": 6, "stick": [6, 8], "sticker": [6, 8, 15], "still": [5, 6, 8, 13, 14, 15, 17], "stilt": 13, "sting": 13, "stoker": 2, "stomp": 13, "stone": [1, 10, 16], "stood": [15, 17], "stop": [5, 6, 10, 13, 16, 17], "storchaka": 16, "store": [4, 6, 8, 11, 17, 21], "storefront": 13, "stori": [0, 2, 5, 6, 7, 8, 9, 10, 13, 15, 16, 17], "storm": 17, "storytel": 15, "str": 16, "straggler": 10, "straight": [4, 11, 16], "straightforward": [5, 18, 21], "strang": [2, 12, 13, 17], "stranger": 0, "strategi": [0, 1, 2, 5, 6, 9], "strau": 13, "straw": 5, "strawberri": [2, 6, 8, 13], "stream": [8, 9, 16, 22], "streaminghttprespons": 6, "streamlit": 16, "street": [1, 2, 4, 5, 8, 13, 15, 16, 17], "streetaddress": [4, 11], "strength": [5, 8, 16], "strengthen": 4, "strftime": 21, "stribl": 5, "strike": 6, "strip": [4, 5, 11, 13, 21], "stripe": 8, "strong": 17, "stronger": 21, "strongli": [6, 18], "strptime": 21, "structur": [4, 6, 9, 12, 16, 18], "struggl": [5, 8, 16, 17], "strung": 5, "stuck": [2, 16, 18], "student": [1, 2, 6, 8, 13, 16, 17, 18], "studi": [6, 8, 11, 17, 18, 21], "studio": [1, 2, 12], "stuf": [15, 16], "stuff": [13, 16, 17, 18, 21, 22], "stumbl": [6, 8, 13, 15, 18], "stun": [1, 5, 6], "stupid": 16, "style": [5, 6, 8, 13, 14], "st\u00e9phane": 16, "sub": 16, "subclass": 4, "subconsci": 8, "subinterpret": 2, "subintrepret": 16, "subject": [0, 1, 5, 6, 8, 13, 16, 17, 18, 21, 22], "submiss": 2, "submit": [0, 2, 4, 6, 10, 11, 16, 18], "subsequ": 0, "subset": 6, "substanti": [1, 8], "subsystem": 16, "succe": 18, "success": [0, 1, 5, 6, 8, 12, 13, 14, 16, 18], "succint": 1, "suddenli": [16, 21], "sue": 8, "suffer": [2, 13, 17], "sugar": [1, 2], "suggest": [2, 5, 8, 13, 14, 16, 17], "suicid": [13, 17], "suit": [5, 15, 16], "suki": 6, "sum": 17, "summar": 6, "summari": [8, 11], "summer": 6, "summit": [0, 10, 15, 16], "sun": [2, 5, 10, 13, 15], "sunbath": 5, "sundai": [6, 8, 10, 12], "sunni": [2, 5, 10], "sunset": 5, "super": [0, 2, 6, 8, 10, 15, 16, 21], "superman": 13, "supermarket": 6, "supper": [5, 16], "support": [0, 1, 5, 6, 13, 14, 15, 16, 17, 18], "sure": [8, 13, 16, 18], "suresh": 16, "surf": 5, "surfac": 18, "surfboard": 5, "surfer": 5, "surpris": [10, 13, 15, 18], "surprisingli": [13, 16], "surround": [5, 6, 8, 13, 16, 17], "survei": [5, 11], "survivor": 17, "suspend": [5, 8, 17], "suspici": 17, "sustain": [1, 6, 8], "svelt": [7, 9], "sviatoslav": 16, "swag": [1, 15, 16], "swam": 5, "swan": [5, 15, 16], "sweet": [2, 5, 8, 13, 22], "sweigart": [0, 9, 16, 18, 22], "swfl": 0, "swift": 13, "swing": 16, "switch": [8, 16, 17], "sy": 8, "sychron": 16, "sydnei": 16, "sydorenko": 16, "sylor": 8, "symbol": [4, 16], "symlink": 16, "sympathi": 2, "sync": 5, "synonym": 8, "syntax": 11, "syrup": [6, 8], "system": [2, 5, 6, 8, 10, 11, 16, 21, 22], "t": [0, 1, 4, 5, 7, 9, 10, 11, 13, 15, 16, 17, 18, 21], "tabl": [1, 2, 5, 11, 12, 15, 21], "taco": [0, 5, 11], "taco_john": [4, 11], "tacojohn": [4, 11], "tacolici": 10, "tag": [0, 8, 21], "tail": 8, "tailor": 13, "tailwind": [6, 7, 9], "take": [0, 1, 4, 5, 6, 8, 10, 13, 15, 16, 17, 18, 21], "takeawai": [6, 12, 16], "taken": [0, 8, 10, 11, 13, 16, 18, 21], "talent": [1, 6, 8, 10], "talk": [0, 1, 4, 5, 6, 9, 10, 11, 15, 16, 18, 22], "tall": 8, "tammi": [10, 16], "tampa": 16, "tanganyika": [2, 10], "tangenti": 12, "tangibl": 17, "tania": [2, 16], "tank": [8, 13], "tanya": 22, "tanzania": 6, "tarantula": 6, "tarbal": 14, "target": [6, 8, 15], "tarragon": 6, "task": [0, 2, 6, 8, 16, 18], "tast": [1, 2, 8, 10, 13], "tasti": [1, 8], "taught": [6, 17, 18], "tax": 8, "taylor": [6, 8, 13], "tayor": 8, "tdd": 22, "tea": 10, "teach": [0, 1, 6, 14, 18], "teacher": [8, 12, 16, 18], "team": [1, 2, 7, 8, 9, 11, 13, 16, 17, 22], "teammat": [1, 2], "teamwork": [7, 9], "tear": 6, "tech": [1, 6, 8, 11, 15, 17, 21, 22], "technic": [0, 6, 13, 16], "techniqu": [5, 8, 16, 22], "technologi": [6, 7, 9, 16, 17], "technologist": [6, 10], "tediou": 16, "telephon": [4, 11], "televis": [13, 15], "tell": [4, 6, 10, 16, 17], "templat": [5, 6, 8, 16], "template_fil": 21, "temporari": 13, "tempt": 16, "tenanc": 9, "tenant": 6, "tend": [11, 17, 21], "tendril": 8, "tendulkar": 16, "tenni": 13, "tent": [2, 13], "tequila": 6, "teriyaki": 2, "term": [1, 6, 11, 16], "termin": [4, 13, 14, 15], "terrac": [6, 8, 13, 16], "terribl": 17, "territori": 15, "tesla": 13, "test": [0, 5, 7, 9, 11, 12, 16, 17, 18], "test_crash_course_with_pytest": 16, "testenv": 14, "texa": [2, 10], "text": [4, 6, 8, 11, 16, 17, 18], "textbook": 16, "than": [0, 1, 2, 4, 5, 6, 8, 13, 14, 15, 16, 18, 21], "thank": [0, 1, 2, 6, 8, 10, 12, 15, 16], "thei": [0, 2, 5, 6, 7, 8, 10, 11, 13, 15, 16, 17, 18, 22], "thelma": 13, "them": [2, 4, 5, 6, 8, 9, 10, 11, 14, 15, 16, 17, 18], "theme": [6, 14, 15], "themselv": [5, 6], "theoret": 18, "theori": [8, 13], "thi": [0, 1, 4, 5, 8, 10, 11, 13, 14, 15, 16, 17, 18, 21, 22], "thibaud": 9, "thing": [0, 2, 4, 6, 7, 8, 9, 12, 13, 14, 15, 16, 17, 18, 21], "think": [0, 2, 5, 6, 8, 15, 16, 17, 18, 21], "third": [2, 4, 6, 8, 13, 17], "thirdli": [4, 15], "thirdparti": 14, "thoma": 18, "thoroughli": 1, "those": [6, 14, 17, 18], "though": [0, 8, 11, 13, 15, 17, 18], "thought": [0, 4, 5, 6, 7, 8, 12, 13, 15, 16, 17, 21], "thoughtbot": 21, "thoughtwork": 8, "thousand": [1, 2, 16], "thread": [2, 5, 6], "threat": 8, "three": [1, 4, 5, 8, 15, 16, 17, 18], "thrill": [0, 5, 6, 8, 10, 15, 16, 17], "thriller": 13, "thrive": [5, 8, 13, 17], "throne": 13, "throttl": 17, "through": [0, 2, 5, 8, 10, 11, 13, 14, 15, 16, 17, 18, 22], "throughout": [1, 4, 5, 6, 8, 10, 15], "throw": 1, "throwback": 8, "thumb": [2, 16], "thunstrom": 17, "thursdai": [5, 12, 18], "ti": 16, "tich": 5, "tick": 21, "ticket": [5, 13, 15, 16, 17], "tide": 5, "tidi": 22, "tie": 15, "tier": 16, "tif": 1, "tijuana": 5, "til": 0, "tim": [2, 6, 8, 9, 10, 16], "time": [0, 1, 2, 4, 5, 6, 8, 10, 12, 13, 14, 15, 17, 18, 21, 22], "timefram": 18, "timeit": 8, "timeless": 17, "timothi": 0, "tini": 22, "tinker": 22, "tinydb": 6, "tip": [5, 6, 8, 16, 17, 18, 21], "tire": [13, 17], "titan": 6, "titl": [4, 17, 21, 22], "tkinter": 18, "tl": [8, 12, 13], "tn": 4, "toast": [6, 8], "tobacco": 6, "todai": [6, 8, 17, 21], "todo": 11, "togeth": [4, 5, 6, 7, 9, 14, 16, 17], "toi": [13, 16, 18], "told": [0, 5, 6, 8, 10, 13, 15, 16, 17, 18], "tom": 5, "tomato": 0, "tomorrow": 17, "ton": [5, 16], "tonic": 8, "tonight": 13, "tonkotsu": 2, "tonnarelli": 8, "too": [0, 2, 4, 6, 8, 10, 13, 14, 15, 16, 17, 18, 21, 22], "took": [0, 1, 2, 5, 6, 8, 10, 13, 15, 16, 17, 18, 21], "tool": [1, 4, 5, 6, 7, 8, 9, 14, 17, 18, 21, 22], "toolbox": [6, 7, 9], "toot": 6, "top": [0, 1, 2, 5, 6, 8, 12, 15, 16, 18, 22], "topic": [1, 5, 6, 8, 11, 16], "torchbox": 5, "tortilla": 0, "toston": 0, "tot": 8, "total": [2, 6, 8, 21], "tote": 8, "touch": [6, 13], "toum": 0, "tour": [1, 2, 5, 6, 10, 12, 15, 16, 17], "tourist": 13, "toward": [6, 13, 17, 18], "tower": [10, 15], "town": [0, 1, 8, 10, 13], "towner": 10, "trace": [16, 17], "track": [0, 5, 10, 12, 15, 18], "tracker": 16, "trade": [6, 8, 16], "trademark": 5, "tradeoff": [5, 7, 9], "tradit": [0, 2, 5, 6, 8, 17, 18, 21], "train": [6, 13, 18], "trainer": [2, 6, 16], "tram": 0, "tran": 17, "transact": [6, 8], "transform": [12, 16], "transit": 8, "translat": 16, "transpar": [8, 17], "transplant": 16, "transport": 13, "trap": 18, "trauma": 17, "travel": [2, 5, 6, 8, 10, 16, 17], "travers": 21, "tre": 16, "treasur": [8, 10], "treat": [1, 5, 8, 10, 16, 17], "treatment": 16, "tredinnick": 10, "tree": [4, 5, 16], "trei": [5, 10, 15, 16, 22], "trend": [2, 6, 22], "trestl": 8, "tri": [5, 8, 10, 13, 16], "trial": 4, "tribal": 6, "trick": 16, "trie": 16, "trigger": [0, 2, 8, 13], "triglycerid": 2, "triniti": 6, "trip": [0, 1, 8, 13, 17], "tripl": [6, 21], "triplett": [2, 6, 7, 8, 16], "trollei": 5, "troubl": [5, 15], "troubleshoot": 5, "troushoot": 8, "trout": 8, "troutman": 2, "truck": [0, 8], "true": [6, 8, 10, 13, 14, 17], "truli": [2, 8, 16], "trump": 6, "trust": [8, 16], "truste": 6, "truth": 6, "try": [5, 6, 8, 11, 13, 16, 21], "trythal": [2, 5, 8], "tuba": 8, "tuesdai": [2, 4, 12], "tuit": 10, "tune": [1, 9, 21], "tunnel": 8, "tupak": 13, "tupl": 16, "turkish": 13, "turn": [0, 2, 5, 6, 8, 10, 15, 16], "turtl": 16, "tutor": 8, "tutori": [5, 6, 7, 9, 11, 12, 16, 21], "tv": 5, "twain": 13, "tweet": [0, 2, 10, 11, 15, 16, 17, 18, 21], "twice": [1, 4, 13, 16, 17, 21], "twilio": 17, "twist": [5, 13, 16], "twitter": [0, 10, 15, 16, 17, 18, 21, 22], "two": [2, 4, 5, 6, 8, 11, 13, 15, 16, 17, 18, 22], "txt": 11, "type": [4, 6, 7, 9, 11, 13, 16, 17, 18], "typeddict": 16, "typel": 16, "typescript": 11, "typic": [10, 16], "tzatziki": 0, "u": [0, 4, 11, 13, 14, 17, 18, 21, 22], "ugandian": 6, "ui": [6, 8], "uk": 6, "ultim": [2, 21, 22], "umuzi": 8, "un": 4, "unaccept": 16, "unapologet": 17, "unawar": 6, "unbeknownst": 2, "unblock": 16, "uncl": [2, 22], "uncommon": 8, "unconsci": 6, "uncov": 5, "undecid": 21, "undefin": 16, "under": [0, 5, 6, 15, 21], "underdog": 6, "undergradu": 6, "underground": 8, "underli": 16, "underrepres": [5, 6, 15], "understand": [1, 2, 5, 8, 11, 16, 17, 18, 21, 22], "underwhelm": [8, 13], "undoubtedli": [1, 18, 21], "unearth": 6, "unexpect": [15, 18], "unexpectedli": 10, "unexplain": 13, "unfair": 16, "unfamiliar": 13, "unfold": 0, "unforgett": [8, 10], "unfortun": [0, 4, 5, 6, 10, 11, 15, 16], "uni": 8, "unicorn": 8, "uniform": 17, "unintend": 4, "uniqu": [0, 2, 4, 6, 7, 8, 9, 16, 21], "unit": [4, 6, 16, 17], "unittest": 6, "univers": [0, 1, 2, 5, 6, 12, 22], "unix": 8, "unlik": [4, 5, 16, 17, 21], "unlock": 18, "unnecessarili": 21, "unnitest": 6, "unpoli": 8, "unprepar": 6, "unsolicit": 11, "unspeak": 5, "unsplash": 18, "unsupport": 14, "unsweeten": 8, "until": [2, 4, 5, 6, 8, 10, 12], "untold": 16, "untrust": 16, "unwant": 16, "up": [0, 1, 2, 6, 8, 9, 10, 11, 13, 14, 15, 16, 17, 18, 21, 22], "upbeat": 15, "upcom": 8, "updat": [0, 5, 6, 9, 14, 21, 22], "upgrad": [8, 16], "upon": [6, 8, 13, 16], "upper": [0, 13], "upsid": 21, "upvot": 22, "url": [4, 6, 11], "urlid": 8, "urljoin": [4, 11], "us": [0, 2, 4, 5, 7, 9, 10, 11, 13, 15, 16, 18, 22], "usa": [4, 11], "usabl": 17, "usag": 8, "usd": 6, "user": [0, 1, 5, 6, 8, 14, 16, 17], "usergroup": 16, "usual": [4, 6, 10, 13, 16, 17], "utcfromtimestamp": 21, "utf": [11, 21], "util": 6, "uuid": 8, "uv": 9, "uvicorn": 5, "v3": 11, "vacat": 16, "vaccin": 2, "valcarcel": 15, "valentin": 1, "valentino": 13, "valid": [2, 4], "valkei": 8, "vallei": 5, "valu": [1, 6, 8, 16, 17, 18], "valuabl": 6, "valueerror": 21, "van": [0, 2, 6, 10, 13, 15, 16], "vanilla": [5, 6, 8], "vanish": 13, "variabl": [8, 16, 18, 21], "varieti": [1, 17], "variou": 13, "vast": 15, "vault": [8, 13], "vc": 22, "ve": [0, 1, 2, 4, 6, 8, 10, 11, 13, 14, 15, 16, 17, 18, 21, 22], "vector": 8, "veget": [0, 5], "vehicl": [8, 13], "velda": [8, 10, 16], "veloc": 8, "venezuelan": 2, "ventur": [6, 13], "venu": [1, 10], "verb": 8, "verbos": 8, "veri": [0, 1, 2, 5, 6, 8, 10, 13, 15, 16, 17, 18, 21], "verifi": [6, 11, 13, 16], "version": [0, 2, 8, 11, 16, 17, 18], "versu": [1, 8, 12, 16, 22], "vertic": 14, "veteran": 10, "via": [5, 14, 15, 16, 17, 18, 21], "viabil": 6, "vibe": [8, 16], "vibrant": 5, "vice": [8, 16], "vicki": 10, "victim": 17, "vida": 6, "video": [2, 6, 8, 13, 15, 16, 17], "viera": 16, "view": [0, 2, 4, 5, 13, 15, 16, 17], "viewset": 6, "vigo": 6, "viktorin": 16, "vincent": [6, 10, 13, 22], "vinta": 5, "vintag": 13, "violenc": 17, "virtual": [0, 5, 6], "visa": [5, 6], "visibl": 17, "visibli": 5, "vision": [5, 6, 8], "visit": [0, 1, 5, 6, 8, 10, 13, 15, 17], "visual": [8, 10, 13, 16, 17], "vogel": 2, "voic": [8, 15, 17, 22], "volga": 17, "volleybal": 5, "volunt": [5, 8, 10, 15, 16, 17, 18], "voss": 16, "vote": 16, "vow": 18, "vscode": 21, "vulner": 17, "w": [4, 21], "w504": 14, "wa": [0, 1, 2, 4, 5, 6, 8, 10, 11, 13, 14, 15, 16, 17, 18, 21, 22], "wage": [0, 6, 16], "wagner": 10, "wagtail": [7, 8, 9, 10, 16], "wai": [0, 2, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15, 16, 17, 18, 21], "wait": [2, 5, 6, 13, 15, 16], "waiter": [8, 13], "waitstaff": 13, "wakanda": 16, "walk": [0, 1, 2, 5, 6, 8, 10, 15, 16, 17], "walker": 16, "walkwai": [5, 13], "wallac": 15, "walmart": 6, "walnut": 6, "wander": [5, 8], "wang": 16, "want": [1, 2, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15, 16, 17, 18, 21, 22], "warehous": 16, "warhol": 18, "warm": [0, 5, 15], "warn": [5, 6, 8], "warner": [1, 12], "washington": [10, 16, 19], "wasm": [5, 7, 9], "wasn": [5, 13, 16, 17, 21], "watch": [0, 5, 8, 10, 13, 16, 17, 18], "watchfir": 16, "watchman": 8, "water": [2, 5, 13, 16], "wave": [0, 13], "wax": 5, "we": [1, 2, 4, 5, 6, 9, 10, 13, 14, 15, 16, 17, 18], "weak": [8, 16], "wear": [6, 8, 16], "weather": [5, 13, 15], "web": [1, 4, 7, 9, 11, 12, 16, 21, 22], "webpack": 11, "websit": [1, 5, 6, 7, 10, 11, 13, 15, 17, 18], "wednesdai": [2, 5, 12, 15, 18], "week": [0, 1, 5, 6, 8, 10, 13, 15, 16, 17, 18, 21], "weekend": [8, 13, 18], "weekli": 22, "weight": [2, 8], "welcom": [5, 6, 10, 11, 15, 17, 18], "well": [0, 1, 4, 5, 6, 8, 10, 11, 13, 17, 21], "went": [0, 1, 2, 4, 5, 6, 8, 10, 13, 15, 16, 17, 18], "were": [0, 1, 2, 5, 6, 8, 10, 13, 15, 16, 17, 18, 21], "weren": [6, 8, 13, 18], "weslei": 8, "west": [4, 5, 13], "wharton": [6, 12], "what": [0, 1, 2, 5, 7, 9, 10, 12, 14, 15, 16, 17], "wheel": [2, 13, 16], "when": [0, 2, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15, 16, 17, 18, 21], "where": [2, 4, 5, 6, 7, 8, 9, 10, 13, 15, 16, 17, 18], "wherev": 18, "whether": [4, 6, 21], "which": [0, 1, 2, 4, 5, 6, 7, 8, 9, 11, 13, 16, 17, 18, 21], "while": [0, 2, 4, 5, 6, 8, 10, 11, 13, 15, 16, 17, 18, 21, 22], "whip": [2, 6], "white": [0, 5, 6], "whitesel": [5, 6, 8, 10], "who": [1, 2, 4, 5, 6, 9, 10, 11, 13, 15, 16, 17, 18, 22], "whole": [5, 6, 16], "wholeheartedli": 18, "whom": [2, 5, 6, 13, 15], "whose": 16, "why": [5, 6, 8, 16, 21], "wi": 4, "wide": [1, 2, 6, 16, 22], "wider": [1, 6, 16], "widget": 6, "wife": 16, "wild": [1, 13], "wildflow": 13, "wildlif": 10, "wile": [5, 6, 8, 16], "wilhelmi": 16, "william": [6, 10, 16, 22], "willing": [10, 16], "willison": [6, 8, 10, 21, 22], "win": [1, 6], "wind": 2, "window": [8, 10], "wine": 6, "winner": 13, "winstel": [2, 8, 10], "winston": 13, "wip": 14, "wipe": 13, "wire": 13, "wirtel": 16, "wisconsin": 5, "wish": [2, 13], "wishlist": 8, "wisteria": 13, "within": [1, 2, 4, 6, 10, 14, 17, 21], "without": [0, 6, 8, 15, 16, 17, 18, 21], "wixsit": [10, 19], "wizard": [13, 22], "woman": [2, 6, 13, 17], "women": [1, 5, 6, 8, 9, 15, 16, 18], "won": [0, 5, 6, 13, 16], "wonder": [1, 2, 5, 6, 8, 10, 13, 15, 16, 17], "wooden": 6, "woodhul": 17, "wooyong": 13, "word": [2, 6, 16, 17, 21], "work": [0, 5, 6, 7, 8, 9, 11, 12, 13, 15, 17, 18, 21], "worker": [1, 2, 8, 13, 16], "workflow": [7, 9, 17], "workgroup": 9, "workplac": 17, "workshop": [1, 5, 8, 9], "workspac": 6, "world": [2, 5, 6, 8, 10, 13, 16, 17, 18, 21], "worn": 13, "worri": 17, "wors": 0, "worst": 6, "worth": [2, 8, 13, 16], "worthmor": 1, "wotm": 1, "would": [0, 2, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 16, 17, 18, 21, 22], "wouldn": 0, "wove": 15, "wow": [0, 5, 6, 8, 13], "write": [0, 1, 2, 5, 6, 10, 11, 16, 17, 18], "writer": [0, 8], "written": [2, 4, 6, 15, 16, 21], "wrong": [6, 8], "wrote": [0, 2, 4, 6, 8, 10, 15, 16, 17, 18, 21, 22], "www": [4, 11, 18], "wy": 4, "wyclef": 13, "x": [2, 4, 11, 22], "xenomorph": 13, "xpath": [4, 11], "xx": 0, "y": [13, 18, 21], "yai": 5, "yard": 5, "ye": 18, "year": [1, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 21, 22], "yearn": 17, "yell": 6, "yep": 8, "yet": [1, 2, 5, 6, 13, 16, 17, 18], "yield": [4, 11, 21], "yml": 14, "yngve": 16, "yogurt": [0, 2, 13], "york": [4, 10, 17], "yorker": 16, "you": [0, 1, 2, 4, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 18, 21, 22], "young": [6, 17], "your": [1, 2, 4, 7, 9, 10, 12, 14, 16, 18, 22], "yourself": [5, 6, 16], "youtub": [2, 6, 8, 11, 13], "yum": [4, 6, 8], "yummi": [0, 1, 5, 13, 16], "yupgup": [2, 8], "yuri": 16, "z": [4, 11], "zadka": [0, 16], "zambia": 6, "zanzibar": 6, "zawaduk": 16, "zen": 17, "zero": 16, "zijlstra": 16, "zimbabw": 8, "zine": [16, 22], "zone": 6, "zoom": [16, 18], "zope": 16, "zucchini": [5, 13], "\u0142ukasz": [16, 22], "\u03bcdjango": 6}, "titles": ["2020 Year in Review", "2023 Recap", "2024 Recap", "About Me", "Building a Taco John\u2019s Scraper", "DjangoCon US 2019 Recap", "DjangoCon US 2023 Recap", "DjangoCon US 2023 Topics Inspiration List", "DjangoCon US 2024 Recap", "DjangoCon US 2024 Topics Inspiration List", "Favorite Conference Snapshots", "Hacktoberfest PRs- 2020", "Welcome to Kati\u2019s Portfolio!", "Los Angeles 2023", "Pinax Release Tutorial", "PyCon US 2019 Recap", "PyCon US 2024 Recap", "PyGotham 2019 Recap", "Reflections on Stanford Code in Place", "Speaker, Board, and Organizer Photos", "The Most Important Python Content of 2024", "TIL- 100 Days of Code Version", "What I Am Paying Attention to in 2024"], "titleterms": {"": [2, 4, 6, 8, 12, 13, 15, 18], "000": 8, "1": [8, 18], "100": [0, 21], "10x": 8, "13": 16, "1986": 13, "2": 18, "2017": [10, 19], "2018": [10, 19], "2019": [5, 10, 15, 17, 19], "2020": [0, 10, 11], "2021": [10, 19], "2022": [10, 19], "2023": [1, 2, 6, 7, 10, 13, 19], "2024": [2, 8, 9, 10, 16, 20, 22], "21c": 8, "3": [16, 18], "4x": 8, "5": 8, "A": [6, 8, 17, 18], "Be": [8, 15], "For": 13, "If": 8, "In": [6, 13], "It": [13, 15], "Its": 8, "No": 16, "Not": 15, "The": [0, 2, 4, 5, 6, 8, 13, 20], "To": 8, "With": [8, 18], "about": [3, 12, 17, 18, 21], "academi": 13, "accept": [17, 18], "action": 17, "activ": [6, 8], "adam": 8, "advantage360": 2, "adventur": [6, 8], "advisor": 2, "africa": 6, "agil": 22, "ahead": 1, "ai": 6, "algorithm": 22, "all": 11, "allegheni": 16, "alloro": 13, "alpinej": 6, "am": 22, "american": 17, "an": 6, "andi": 16, "angel": [2, 13], "annual": 12, "anoth": [6, 8], "api": 22, "app": 6, "applic": 18, "appreci": 2, "approach": 6, "april": 2, "arcad": 8, "articl": 1, "asgi": 16, "ash": 16, "assign": 18, "async": [5, 16], "attent": 22, "auction": 16, "august": 2, "author": 22, "automot": 13, "back": [6, 13], "background": 14, "bakeri": 2, "bar": 8, "barri": 16, "basebal": 18, "beach": 13, "befor": 4, "begin": 4, "benchmark": [8, 16], "beyond": 8, "bidart": [6, 8], "black": 8, "blog": [5, 15, 17], "blue": 13, "board": [2, 6, 8, 19], "book": 22, "booth": 16, "boxcar": 8, "boyc": 8, "breakfast": 16, "brother": 13, "bruno": 13, "bu": 13, "budget": 8, "bui": 6, "build": [4, 6, 16], "burger": 13, "call": 17, "cameo": 8, "can": [6, 8], "car": 2, "carbon": 8, "care": 2, "carousel": 13, "cecil": 13, "celebr": [2, 13], "center": [13, 16], "centerfest": 8, "certif": [1, 22], "challeng": 4, "champion": 6, "chanc": 6, "chang": 0, "chapel": 6, "chase": 19, "chelei": 8, "chines": 2, "choos": 8, "chri": 8, "christma": 13, "christoph": 8, "cinnamon": 8, "circleci": 14, "citi": 13, "clean": 22, "close": [6, 17], "cloud": 2, "cocktail": [6, 8], "cocoa": 8, "code": [0, 1, 18, 19, 21, 22], "coffe": [6, 8], "coher": 6, "cola": 8, "collabor": 19, "comedi": 13, "commun": 6, "compani": 22, "compil": 16, "comput": 5, "conclus": 6, "condado": 16, "confer": [2, 6, 8, 10, 12, 16], "configur": 14, "connect": [1, 8], "connel": 8, "consid": 21, "consider": 4, "contact": 18, "content": [6, 8, 13, 16, 19, 20, 21], "contract": 17, "contrast": 21, "could": 8, "council": 16, "cours": 18, "coverag": 14, "cpython": [16, 22], "craft": 12, "cream": 16, "crepe": [2, 6, 8], "cultur": 8, "dai": [0, 5, 21], "daili": 1, "daisi": 13, "darna": 2, "data": 22, "databas": 22, "deb": 6, "debug": 8, "decemb": 2, "deck": 13, "deep": 5, "defna": [1, 6, 8], "demo": [6, 18], "descript": [5, 15, 17], "design": [2, 8], "dev": 8, "develop": [8, 15, 22], "devict": 19, "dfw": 2, "dictionari": 21, "dinner": [5, 6, 8, 16], "dip": 6, "director": 6, "discuss": 8, "dive": 5, "divers": 1, "django": [1, 5, 6, 8, 11, 14, 19, 22], "djangocon": [1, 2, 5, 6, 7, 8, 9, 10, 12, 19], "djangonaut": 6, "do": [6, 8, 14, 18, 22], "doe": 18, "dolbi": 13, "don": 6, "downtown": [13, 16], "dr": [0, 14], "drive": 13, "dsf": [6, 8], "duke": [6, 8], "duquesn": 16, "durham": 8, "eateri": 2, "eclips": 2, "effici": 8, "elli": 17, "emili": 16, "emiss": 8, "employe": 2, "end": [13, 15], "engin": 22, "english": 13, "environ": 14, "error": 8, "ethan": 16, "execut": 6, "expenditur": 16, "experi": 6, "explain": 16, "explan": 4, "expo": 16, "fame": 13, "famili": 2, "faster": 8, "favorit": [2, 10, 18], "featur": [2, 22], "februari": 2, "fellow": 6, "fellowship": 8, "few": 18, "fig": 16, "final": 18, "financi": 2, "find": 6, "finish": 18, "food": [1, 6, 8], "framework": [5, 6], "free": 16, "fri": 6, "fridai": [13, 15, 16, 17], "friend": 6, "friendli": 8, "frustrat": 8, "fun": [1, 2], "futur": [6, 8], "galindo": 16, "game": 2, "garden": [6, 8], "gem": 8, "gener": 22, "get": [8, 15, 19], "getti": 13, "gil": 16, "girl": 6, "github": [10, 19], "global": 2, "go": [13, 15], "got": 18, "govern": 17, "grammi": 13, "grandstaff": 6, "great": [6, 8, 15, 22], "green": 6, "greener": 8, "gregori": 16, "griffith": 13, "grit": 8, "group": 16, "gym": 2, "hackathon": 2, "hacktoberfest": [4, 11, 19], "had": [8, 13], "hall": [8, 13, 16], "hallwai": [6, 8, 16, 17], "hang": 6, "harihareswara": 16, "harvest": 1, "have": 18, "heinz": 16, "hidden": 8, "higher": 11, "highlight": 0, "histori": [8, 16], "hollywood": 13, "home": 13, "hotel": [6, 8, 13], "how": [4, 8, 22], "html": 6, "htmx": [6, 8], "hype": 6, "i": [4, 6, 8, 18, 21, 22], "ic": [13, 16], "idressa": 6, "imag": 18, "immut": 16, "implement": 21, "import": 20, "improv": 11, "inclin": 16, "includ": 14, "inclus": [1, 6, 18], "inner": 1, "innov": 2, "insid": 6, "inspir": [2, 7, 9, 12], "intro": [6, 8, 13, 16], "island": 17, "italia": 13, "italiano": 13, "ivat": 6, "jack": 8, "jacob": 8, "jai": 16, "januari": 2, "japanes": 2, "jit": 16, "john": 4, "join": 5, "journei": [6, 21], "jpmorgan": 19, "jpmorganchas": 2, "juggl": 16, "juli": 2, "jumpstart": 19, "june": 2, "justen": 8, "k": 16, "kansa": 13, "kaplan": 8, "karel": 18, "kati": 12, "kei": 22, "keynot": [8, 16, 17], "kick": 6, "kinesi": 2, "know": 14, "kojo": 6, "labor": 6, "languag": 17, "leadership": [8, 22], "leaner": 8, "learn": [1, 21, 22], "lectur": 18, "lemur": 2, "li": 8, "liberti": 17, "librari": 21, "life": 6, "lifestyl": 8, "lightbulb": 21, "lightn": 8, "lightweight": 6, "like": 6, "link": 8, "list": [2, 7, 9, 12, 21], "listdir": 21, "lo": [2, 13], "loaf": 6, "local": 14, "locat": 4, "look": 1, "loop": 10, "lorenzo": 8, "lower": [8, 11], "luci": 2, "lunar": 2, "lunch": 16, "luncheon": 16, "made": 8, "mai": [2, 8], "make": [4, 6, 21], "manag": [6, 22], "maravanyika": 8, "march": 2, "mario": 8, "market": 8, "matrix": 14, "matter": 8, "max": 8, "maximum": 8, "mcclaren": 2, "md": 11, "me": [3, 6, 18], "meal": 8, "measur": 16, "mediterranean": 2, "meet": [6, 8], "meetup": 19, "mel": 13, "member": 16, "mentor": 8, "miller": 16, "modern": 6, "moment": 21, "mondai": [5, 6, 8, 13, 16], "monica": 13, "moon": 1, "more": [6, 8, 15, 22], "morehous": 16, "moss": 8, "most": 20, "mother": 8, "motion": 13, "munoz": 8, "museum": [6, 8, 13, 16], "my": [2, 6, 12, 13, 18, 21], "natalia": [6, 8], "natur": 5, "navig": 6, "need": 5, "new": [1, 2, 6, 14, 22], "newslett": 1, "next": [8, 16, 18], "nicholson": 6, "niec": 2, "night": 13, "north": 13, "note": 17, "notic": 16, "novemb": 2, "o": [8, 21], "observ": 13, "observatori": 13, "octob": 2, "off": 6, "old": 6, "open": [6, 8, 16], "opinion": 18, "optim": 8, "organ": [6, 8, 19], "other": 8, "ourselv": 8, "out": [6, 18], "output": 14, "overcom": 16, "overview": 16, "own": 21, "p": [1, 6, 8, 16], "pablo": 16, "packag": 11, "page": 4, "pai": 22, "panel": [8, 19], "parallel": 16, "parizad": 6, "park": [2, 13], "parlour": [6, 8], "part": [2, 6], "parti": 2, "pattern": [4, 22], "peopl": 8, "perform": [8, 16, 21], "peter": 6, "petersen": 13, "photo": [16, 19], "pic": [2, 16], "pick": 13, "pictur": 13, "pier": 13, "pinax": [0, 14], "pizzeria": 6, "place": [0, 1, 11, 18], "plan": 14, "plano": [1, 2], "podcast": 22, "poni": 8, "pool": 8, "portfolio": 12, "post": [2, 5, 15, 17], "poster": 16, "postgresql": 8, "power": [8, 17], "pr": 11, "pre": [6, 8], "prefetch_rel": 8, "press": [6, 8], "prevent": 2, "product": 22, "profil": [8, 16], "program": [4, 18, 21], "project": [8, 18], "promenad": 13, "psf": [6, 16], "public": 0, "publish": 14, "pugdebug": 11, "purpos": 6, "pycascad": [0, 10], "pycon": [2, 10, 15, 16], "pygotham": [10, 17], "pyladi": 16, "pypi": 11, "pytexa": [2, 10], "python": [2, 5, 8, 14, 16, 17, 18, 20, 21, 22], "qualiti": 1, "queeni": 8, "react": 11, "readi": 15, "readm": 11, "recap": [0, 1, 2, 5, 6, 8, 12, 15, 16, 17, 19], "recept": 16, "refactor": 22, "reflect": 18, "regex": 4, "relat": 8, "releas": [0, 14, 22], "report": 14, "republiqu": 13, "requir": [14, 21], "resourc": 22, "rest": 6, "review": [0, 12, 19], "ristorant": 13, "riverfront": 16, "robot": 18, "rodeo": 13, "ron": 8, "rooftop": 8, "run": 14, "ryan": 8, "sai": 6, "salgado": 16, "santa": 13, "sarah": [6, 8], "saturdai": [13, 15, 16], "school": 0, "scienc": 6, "scrape": 4, "scraper": [4, 11], "screen": 2, "scrum": 22, "section": 18, "see": [5, 6, 8, 15], "select": 8, "select_rel": 8, "septemb": 2, "serendip": 13, "setup": 14, "shabu": 2, "sheena": 8, "shirt": [6, 8], "shrimp": 8, "sight": [5, 6, 8, 15, 16], "sightse": [8, 16], "sign": [13, 17], "simon": [6, 16], "simpl": [0, 18], "smith": 16, "snapshot": [2, 10], "social": [6, 8], "solut": 4, "some": 8, "son": 8, "sourc": [1, 6], "spa": 8, "space": 6, "speak": 0, "speaker": [6, 8, 19], "spectrum": 17, "sport": 2, "sprint": [5, 8, 15], "standard": [1, 21], "stanford": [0, 1, 18], "state": [5, 19], "statu": 17, "steer": 16, "step": [0, 4], "strang": 10, "strategi": 8, "stream": 6, "string": 21, "strong": 18, "structur": [21, 22], "studio": 13, "stuf": [6, 8], "subinterpret": 16, "success": 17, "sumana": 16, "summer": 2, "summit": 8, "sundai": [13, 15, 16], "sunset": 13, "swag": [6, 8], "swirl": 2, "sync": 16, "t": [2, 6, 8], "tabl": [6, 8, 13, 16, 19], "taco": [4, 13, 16], "tag": 14, "takeawai": 13, "talk": [2, 8, 12, 17, 19], "tanganyka": 2, "tangenti": 1, "tcl": 13, "tea": 16, "teach": 8, "teacher": 22, "tell": 8, "templat": 11, "tenanc": 6, "test": [6, 14, 22], "thank": [5, 17], "theater": 13, "theatr": 13, "theme": [2, 13], "thi": [2, 6], "thibaud": 8, "thing": 22, "thoma": 16, "thought": [2, 18], "thread": 16, "through": [4, 6, 21], "throughout": 2, "thursdai": [8, 13, 15, 16], "til": 21, "time": 16, "tl": [0, 14], "tomato": 6, "tool": 16, "toolbar": 8, "top": 13, "topic": [2, 7, 9, 12], "toro": 6, "tour": 13, "tox": 14, "track": [6, 8, 16, 17], "tragedi": 2, "transform": 22, "travel": [1, 12, 13], "trip": 2, "troubleshoot": 8, "tuesdai": [5, 6, 8, 13], "tutori": [14, 22], "u": [1, 2, 5, 6, 7, 8, 9, 10, 12, 15, 16, 19], "understand": 6, "univers": [10, 13, 16], "unlock": [8, 16], "unscript": 8, "until": 16, "up": [4, 5], "updat": 16, "us": [6, 8, 14, 17, 21], "v": [8, 16], "venic": 13, "venu": 8, "version": [14, 21], "versu": [13, 21], "via": 13, "video": 18, "view": 8, "visa": 8, "walk": [13, 21], "warhol": 16, "warner": 13, "warsaw": 16, "watch": 2, "we": 8, "web": [5, 6, 8], "webapp": 8, "webassembli": 5, "websit": [2, 4, 8], "wednesdai": [6, 8, 13, 16], "week": 2, "welcom": [8, 12], "well": 2, "wharton": 0, "what": [4, 6, 8, 13, 18, 21, 22], "which": 14, "who": 8, "why": 14, "wildlif": 2, "willison": 16, "wise": 8, "work": [1, 2, 4, 16, 22], "workshop": 6, "wouter": 16, "wrap": [4, 5], "write": 21, "wsgi": 16, "x": 8, "year": [0, 2], "yoshi": 2, "you": [5, 17], "your": [5, 6, 8, 17, 21], "yt": 11, "\u00e1lvaro": 8}}) \ No newline at end of file diff --git a/speaker-board-and-organizer-photos.html b/speaker-board-and-organizer-photos.html new file mode 100644 index 00000000..a505cd48 --- /dev/null +++ b/speaker-board-and-organizer-photos.html @@ -0,0 +1,247 @@ + + + + + + + + Speaker, Board, and Organizer Photos — Portfolio 0.1 documentation + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

Speaker, Board, and Organizer Photos

+
+

Table of Contents

+ +
+
+

Speaker Photos

+
+

JPMorgan Chase 2023- DjangoCon US Recap

+

December 6, 2023

+

+

+
+
+

DjangoCon US 2021

+

October 22, 2021

+

+My pre-recorded talk Get a Jumpstart on Collaboration and Code Review in GitHub playing simultaneously in English and Spanish

+

+My pre-recorded talk Get a Jumpstart on Collaboration and Code Review in GitHub playing simultaneously in English and Spanish

+
+
+

DjangoCon US 2018- State of Django Panel

+

October 17, 2018

+

+On stage; photo credit: Bartek Pawlik (https://bartpawlik.format.com/)

+

+Speaking; photo credit: Bartek Pawlik (https://bartpawlik.format.com/)

+

+Panel and crowd; photo credit: Bartek Pawlik (https://bartpawlik.format.com/)

+

+Panel and crowd; photo credit: Bartek Pawlik (https://bartpawlik.format.com/)

+
+
+

DjangoCon US 2017- Get a Jumpstart on Collaboration and Code Review in GitHub Talk

+

August 14, 2017

+

+On stage; photo credit: Adam Gregory (https://atomimages509.wixsite.com/atom)

+

+On stage

+

+Speaker photo; photo credit: Adam Gregory (https://atomimages509.wixsite.com/atom)

+
+
+

DevICT Hacktoberfest Meetup- Get a Jumpstart on Collaboration and Code Review in GitHub Talk

+

September 28, 2017

+

+Speaker photo

+
+
+
+

Board Photos

+
+

DjangoCon US 2023

+

October 18, Durham, North Carolina

+

+DEFNA Board group photo; photo credit: Bartek Pawlik (https://bartpawlik.format.com/)

+
+
+
+

Organizer Photos

+
+

DjangoCon US 2023

+

October 16-20, Durham, North Carolina

+

+Organizers group photo; photo credit: Bartek Pawlik (https://bartpawlik.format.com/)

+

+Organizers during closing remarks (I am hidden behind Dawn lol); photo credit: Bartek Pawlik (https://bartpawlik.format.com/)

+
+
+

DjangoCon US 2022

+

October 16-21, San Diego, California

+

+Organizers group photo; photo credit: Bartek Pawlik (https://bartpawlik.format.com/)

+

+Organizers during closing remarks; photo credit: Bartek Pawlik (https://bartpawlik.format.com/)

+
+
+

DjangoCon US 2019

+

September 22-27, San Diego, California

+

+Organizers group photo; photo credit: Bartek Pawlik (https://bartpawlik.format.com/)

+

+Organizers during closing remarks; photo credit: Bartek Pawlik (https://bartpawlik.format.com/)

+
+
+

DjangoCon US 2018

+

October 14-19, San Diego, California

+

+Organizers group photo; photo credit: Bartek Pawlik (https://bartpawlik.format.com/)

+

+Organizers during closing remarks; photo credit: Bartek Pawlik (https://bartpawlik.format.com/)

+

+Organizers during closing remarks; photo credit: Bartek Pawlik (https://bartpawlik.format.com/)

+
+
+

DjangoCon US 2017

+

August 13-18, Spokane, Washington

+

+Organizers during closing remarks; photo credit: Adam Gregory (https://atomimages509.wixsite.com/atom)

+
+
+
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/the-most-important-python-content-of-2024.html b/the-most-important-python-content-of-2024.html new file mode 100644 index 00000000..5a469fdf --- /dev/null +++ b/the-most-important-python-content-of-2024.html @@ -0,0 +1,281 @@ + + + + + + + + The Most Important Python Content of 2024 — Portfolio 0.1 documentation + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

The Most Important Python Content of 2024

+ +
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/til-100-days-of-code-version.html b/til-100-days-of-code-version.html new file mode 100644 index 00000000..1ea48f59 --- /dev/null +++ b/til-100-days-of-code-version.html @@ -0,0 +1,414 @@ + + + + + + + + TIL- 100 Days of Code Version — Portfolio 0.1 documentation + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

TIL- 100 Days of Code Version

+

In April, I was looking through my Twitter newsfeed and came across a tweet by Simon Willison that piqued my curiosity.

+

+

Caption: Simon’s tweet

+

I had the good fortune to get to know Simon when he was the moderator of a “State of Django” panel that I took part in at DjangoCon US 2018 and I’ve been following him on Twitter ever since. One of the original creators of the Django web development framework at the Lawrence Journal World, Simon can often be found discovering novel ways of doing things. So, when he comes across an “interesting” idea, I tend to take notice.

+

While looking at Hacker News, Simon had come across the idea of a self-rewriting README.md. The idea originated from a project called TIL (Today I Learned), created by Josh Branchaud that was inspired by a thoughtbot project of the same name.

+

Simon re-implemented the idea in Python and wrote about it in a blog post.

+

In a nutshell, Simon’s TIL repo contains a README.md and subject folders filled with TIL files. When Simon learns something new, he can open a corresponding subject folder, create a new markdown TIL file, and fill in what he has learned. When the new file is saved, a program runs and finds the change. In the README.md, each folder name is listed as a category with the names of the files contained in the folder listed below the category as TIL hyperlinks. The program rewrites the README.md, adding the new TIL file name under its category.

+

+

Caption: The beginning of Simon’s TIL README.md

+
+

Lightbulb Moment

+

There is so much to be learned from tech that for years now, I’ve been curating what I’ve learned in README.mds the old fashioned way, by hand, as a memory device. I’ve long known there was undoubtedly a more efficient way of doing it, but hadn’t come across a specific better way, and my way worked well enough for the time being.

+

Now that I knew about the self-writing README.md, it was clear that a similar implementation could be very helpful to me. I bookmarked the idea as something I would revisit.

+
+
+

TIL- 100 Days of Code Version

+

Around the time of Simon’s tweet, I was just beginning Stanford’s Code in Place course. When Code in Place ended, I wanted to continue building small, fun apps regularly. So, I started taking part in a popular initiative called 100 Days of Code.

+

100 Days of Code participants spend 1 hour a day, most days, working on code-related learning and are encouraged to fork the official 100 Days of Code repo to keep a record of their work, as well as tweet their progress from day to day, in order to stay accountable.

+

It’s a great initiative and I can definitely feel my coding muscles becoming stronger over time.

+

However, 100 Days of Code is largely self-guided, and at the beginning, I found myself having difficult settling into a routine. After a couple of weeks of feeling disorganized, I suddenly remembered the idea of a self-rewriting TIL. I had an ephiphany that I could create a TIL- 100 Days of Code version, to keep what I had worked on and learned from day to day organized.

+

I felt super excited at the thought of creating my own TIL implementation. What better sort of project could there be than to create a programmatic solution to my own problem?

+
+
+

My TIL Requirements

+

Requirements for my own TIL:

+

Basic Features

+
    +
  • TILs listed by category, with a name and hyperlink for each (this is a traditional TIL feature)

  • +
  • Total number of TILs and total by category (nice to have)

  • +
  • Ability to add/edit TILs in the browser (I want to be able to do a quick and easy update)

  • +
  • Powered by a GitHub Action (no need to run this locally)

  • +
+

Special 100 Days of Code Features

+
    +
  • TILs ordered by date, name, and hyperlink, most recently modified first (ordering by date will help keep me accountable)

  • +
  • Ability to open the most recently modified TIL and tweet a status update (I’ll no longer need to manually tweet my progress)

  • +
+
+
+

Implementations I Considered

+

The first thing I did was spend some time looking at different TIL implementations hosted on GitHub. My intention was not to adopt another person’s solution outright, but to get a general idea of what approaches people had taken, and perhaps, why. Ultimately, I wanted to take code apart and go through my own process of discovery and learning, so that I would fully understand how what I was using worked. I also wanted to create an implementation unique to my own needs, including features incorporated specifically for 100 Days of Code.

+

The upside of looking at different TIL implementations was that I immediately began to experiment and problem solve by creating my own versions. The downside was that I overlooked a potentially important performance issue. See the “What I Learned About Performance” section later in this blog post for more information about that.

+

I considered four major approaches implemented in Python:

+ +
+

Contrasting the Implementations

+

Simon’s TIL implementation uses Datasette, an SQL tool he created and develops as part of a John S. Knight Journalism Fellowship at Stanford. Although I have no doubt that Simon’s implementation is a stellar approach that leverages a very cool and useful tool (I plan to use it in the future in a project of my own!), I wanted to start from a blank slate and beginner mindset.

+

I felt his implementation was too opinionated for my current needs.

+

So, I moved on to Andrei Cioara’s TIL implementation and Raegon Kim’s TIL implementation.

+
+

os.walk() and Program Structure

+

Both implementations use os.walk() to traverse the directories and files, but the programs are structured very differently. For me, Andrei Cioara’s implementation was the simplest of the four to understand and Raegon Kim’s the most difficult.

+

In Andrei Cioara’s implementation, the bulk of the program exists within main() and executes from beginning to end, like a consecutive list of instructions. The program executes os.walk() once to create a simple list of categories and file links.

+
# Andrei Cioara's `os.walk()`
+
+def main():
+    # Other stuff
+
+    for root, dirs, files in os.walk("."):
+        dirs.sort()
+        if root == '.':
+            for dir in ('.git', '.github'):
+                try:
+                    dirs.remove(dir)
+                except ValueError:
+                    pass
+            continue
+            
+        # Other stuff    
+            
+        for file in files:
+        # Other stuff
+
+
+

Unlike the procedural approach taken by Andrei Cioara, Raegon Kim splits the program into functions. Encapsulated in a function, os.walk() is called twice, to create both “Recently Modified” and “Categories” sections. He also creates a “Categories” table of contents with entries that link to the categories in the README.md via relative path.

+
# Raegon Kim's `os.walk()`, encapsulated in `tils()`
+
+excludes = (root, "drafts", "archive")
+
+# Other stuff
+
+def tils(root):
+    for (path, dirs, files) in os.walk(root):
+        dirs[:] = [d for d in dirs if d not in excludes and not d.startswith(".")]
+        paths = [os.path.join(path, f) for f in files if f.endswith(".md")]
+        if path != root:
+            yield relative(root, path), paths
+
+
+

Raegon Kim’s entire program begins and ends in the same small block of code near the end of the file, when, the highest-order function readme() is called. A number of other functions, some nested within one another, are called from within readme(). These other functions create relative and absolute paths, titles, hyperlinks, TIL count, and a modified list that returns the most recent entries.

+
# Raegon Kim's `readme()` calls `tils()` and other functions
+
+def readme():
+    # Other stuff
+
+    # Recents
+    lines.append("## Recently Modified\n")
+    for date, filename in recent(flat(tils(root)), 15):
+        date = datetime.utcfromtimestamp(date).strftime("%Y-%m-%d")
+        l = link(root, filename)
+        lines.append(f"- *{date}* : {l}")
+
+    # Categories
+    lines.append("\n## Categories\n")
+    lines.append("Total `%s` TILs\n" % total(root))
+    for relative, paths in tils(root):
+        count = len(paths)
+        lines.append(f"- [{relative}](#{relative}) *({count})*")
+
+    # Links
+    for relative, paths in tils(root):
+        lines.append(f"\n### {relative}\n")
+        for path in paths:
+            l = link(root, path)
+            lines.append(f"- {l}")
+
+    # Other stuff
+
+
+
+
+

os.listdir(), TIL Dictionary, and Python Standard Library

+

I later came across KhanhIceTea’s TIL implementation, which is the approach I finally settled on. KhanhIceTea’s implementation uses os.listdir() to iterate through the directories and files, instead of os.walk().

+
# KhanhIceTea uses `os.listdir()` to create and sort a list of categories and iterate through their TIL files
+
+def convert_til_2_readme(source, template_file, dest):
+    excluded_folders = [".git", ".vscode"]
+    categories = [f for f in os.listdir(source) if os.path.isdir(f) and f not in excluded_folders]
+    categories.sort()
+    # Other stuff
+
+    for cat in categories:
+        # Other stuff
+        for file in os.listdir(os.path.join(source, cat)):
+
+
+

Each TIL file is split into pieces and passed into a parse_article() function and the front matter and header are parsed using the Python find() function, with a dictionary created that stores the date, category, tags, and title. Each dictionary is added to both a cat_articles and all_articles list, which are sorted by chronological and reverse date.

+
# `parse_article()` parses the file front matter and header and returns a dictionary containing the data
+
+def parse_article(content, category):
+    pos1 = content.find('- Date : ')
+    pos2 = content.find('- Tags : ', pos1)
+    pos3 = content.find("\n", pos2)
+    pos4 = content.find("##", pos3)
+    pos5 = content.find("\n", pos4)
+    post = {
+        "date": datetime.strptime(content[pos1+9:pos2].strip(), "%Y-%m-%d"),
+        "category": category,
+        "tags": [t[1:] for t in content[pos2+9:pos3].strip().split(' ')],
+        "title": content[pos4+3:pos5].strip(),
+    }
+
+    return post
+
+
+

While Andrei Cioara and Raegon Kim use Python Standard Library built-in functions to identify the variables used to create the README.md entries, KhanhIceTea’s implementation accesses that data from the TIL dictionaries using index and variables instead.

+
# Iterating through the `cat_articles` and `all_articles` lists and accessing the data by index and variable
+
+        # Other stuff
+        
+        for article in cat_articles:
+            count += 1
+            cat_content += "| {}. [{}]({}/{}) | {} |\n".format(
+                count, article['title'], article['category'], article['file_name'],
+                article['date'].strftime('%Y-%m-%d'))
+
+    # Other stuff
+    for article in all_articles[0:5]:
+        content += "| [{}]({}/{}) [{}] | {} |\n".format(
+            article['title'], article['category'],
+            article['file_name'], article['category'],
+            article['date'].strftime('%Y-%m-%d'))
+
+
+
+
+

Writing Content Using String Versus List

+

One other seemingly incidental difference between implementations that could affect performance is how content is written to the README.md.

+

Andrei Cioara creates an empty string called content and uses an addition assignment operator to append new strings to content, starting with a README.md header via a global HEADER variable assigned to a multiline, triple-double-quote string. At the end of the program, all of the content is written into the README.md at once. KhanhIceTea uses the same method.

+
# README.md header stored in a multiline, triple-double-quote string
+
+# Other stuff
+
+HEADER="""# TIL
+> Today I Learned
+A collection of software engineering tips that I learn every day.
+---
+"""
+
+
+
# New strings are appended to `content`, then all of the `content` is written into the README.md at once. 
+
+def main():
+    content = ""
+    content += HEADER
+
+    # Other stuff
+    
+        category = os.path.basename(root)
+
+        content += "### {}\n\n".format(category)
+
+        for file in files:
+            name = os.path.basename(file).split('.')[0]
+            name = " ".join(word.capitalize() for word in name.split('-'))
+            content += "- [{}]({})\n".format(name, os.path.join(category, file))
+        content += "\n"
+
+    with open("README.md", "w") as fd:
+        fd.write(content)
+
+
+

In Raegon Kim’s implementation, at the beginning of readme(), an empty list called lines is created. As the program progresses through readme(), and new lines are generated, the built-in list function append() is used to append the new lines to lines as strings. The lines list is returned by readme() and line by line, written into the README.md.

+
# Content is appended to `lines` as strings and `lines` is returned
+
+def readme():
+    lines = []
+    lines.append("# TIL\n")
+    lines.append("> Today I Learned\n")
+
+    # Recents
+    lines.append("## Recently Modified\n")
+    for date, filename in recent(flat(tils(root)), 15):
+        date = datetime.utcfromtimestamp(date).strftime("%Y-%m-%d")
+        l = link(root, filename)
+        lines.append(f"- *{date}* : {l}")
+
+    # Other examples
+
+    return lines    
+
+
+
# Content stored within `lines` is written into the README.md, line by line
+
+output = open(os.path.join(root, "README.md"), 'w', encoding='UTF-8')
+for line in readme():
+    output.write(line)
+    output.write('\n')
+output.close()
+
+
+
+
+
+
+

My Journey Through Implementations

+

I had heard positive things about os.walk() and immediately thought it would be a great approach for my TIL. So, I began by creating my own TIL implementation loosely based on Andrei Cioara’s approach.

+

However, I ran into difficulty when I attempted to add a section for most recently modified files, in addition to categories. I realized that os.walk() needed to “walk” the directories and files twice. Adding a second os.walk() without using a function seemed like overkill.

+

So, I began to study Raegon Kim’s implementation, to see how he had added a “Recently Modified” category using functions. Although I nearly completed a similar implementation, I wasn’t quite happy with the result. I felt it was overly complex.

+

At that point, I began looking through more examples on GitHub and came across KhanhIceTea’s implementation.

+

I immediately liked the way it looked, because of its fun use of markdown tables and emojis, plus it ticked the boxes of having both “Recently Modified” and “Category” sections.

+

So, I created my own TIL- 100 Days of Code Version.

+

+

Caption: My TIL- 100 Days of Code Version repo

+

+

Caption: An example file in my TIL- 100 Days of Code Version repo

+

I’m undecided about the use of front matter and the find() function to parse it. I feel it might be unnecessarily manual, but I also have confidence in it. One major advantage of KhanhIceTea’s approach of using a TIL dictionary is that I found it to be very straightforward to work with and was able to quickly add a status variable and implement auto-status tweet.

+

For more information about the changes I made to KhanhIceTea’s implementation, check out the “Changes I Made” section of the program_information.py file.

+
+
+

What I Learned About Performance

+

Although based on existing implementations, os.walk() seemed like the obvious choice at first, it can perform poorly. This was explained in PEP 0471, which introduced os.scandir(), added to the Python Standard Library in Python 3.5.

+
+

“This PEP proposes including a new directory iteration function, os.scandir(), in the standard library. This new function adds useful functionality and increases the speed of os.walk() by 2-20 times (depending on the platform and file system) by avoiding calls to os.stat() in most cases.

+

Python’s built-in os.walk() is significantly slower than it needs to be, because – in addition to calling os.listdir() on each directory – it executes the stat() system call or GetFileAttributes() on each file to determine whether the entry is a directory or not.”

+
+

Although my implementation uses os.listdir() directly, which is an improvement over os.walk(), according to the os.listdir() documentation, os.scandir() gives better performance than os.listdir() for many common use cases.

+

For a small, open-source app like mine, performance might not be as much of an issue as it would be for a large-scale system or one that runs the risk of maxing out on resource, such as an app in a private repo using up all of its GitHub Action minutes.

+

But, knowing what I know now, if I were to start over, I would probably use os.scandir(). Perhaps, I will create a new version using it.

+
+
+

Make Your Own

+

How would you create a TIL project and why? Is os.listdir() preferable to os.walk()? Which is the best method of storing and writing README.md content: string concatenation, list append(), or another method? Is front matter parsing an anti-pattern?

+

Let me know what you think on Twitter @KatiMichel, in a GitHub issue, or by email kthrnmichel@gmail.com.

+

Stay tuned for a TIL- 100 Days of Code Version tutorial for step-by-step instructions for setting up your own TIL.

+

Happy learning! :)

+
+
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/what-i-am-paying-attention-to-in-2024.html b/what-i-am-paying-attention-to-in-2024.html new file mode 100644 index 00000000..6bf3b910 --- /dev/null +++ b/what-i-am-paying-attention-to-in-2024.html @@ -0,0 +1,546 @@ + + + + + + + + What I Am Paying Attention to in 2024 — Portfolio 0.1 documentation + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ +
+

What I Am Paying Attention to in 2024

+

Disclaimer: the content of this post is a reflection of my career journey and not specific to my work at JPMorganChase.

+
+

Key

+ + + + + + + + + + + + + + + + + + + + +

Emoji

Status

completed

in progress

🛠

daily/weekly

on pause

+
+
+

Developer News

+

Projects and developers trending on GitHub. Can be filtered by Python.

+ +

The latest tech news that makes it through the Hacker News upvote process.

+ +

GitHub news and changelog

+ +
+
+

Python and Django Features and Release

+

Python release notes, discussion forum, enhancements proposals, release livestreams (recorded)

+ +

Django release notes, enhancements proposals, blog, roadmap

+ +
+
+

Python and Django Authorities

+

Django co-founder and prolific tinkerer and public speaker. Check out his work with Datasette and LLMs.

+ +

Current and former Django Fellows

+ +

Current CPython Developer-in-Residence

+ +

PSF Security Developer-in-Residence

+ +

Podcast by CPython Release Manager Pablo Galindo and CPython Developer-in-Residence Łukasz Langa

+ +

CPython Core Dev and Microsoft faster CPython team member

+ +

Author of a group of outstanding Django books and co-creator of Django News Newsletter

+ +

Author of my favorite Python book “Python Crash Course”

+ +

Highly-skilled, opinionated developers and release managers who maintain a number of packages important to the Python/Django community

+ +

Author of a great Django blog

+ +
+
+

Python Books

+

Outstanding new book in a series by Extreme Programming and TDD authority Kent Beck. Short and sweet. Explores tidyings, cumulative progress, and optionality.

+ +

Idiomatic Python deep dive to level up to professional, production quality Python quickly

+ +

Classic, advanced, comprehensive Python manual

+ +

Some gems in this more advanced book by the excellent Al Sweigart, author of the popular Automate the Boring Stuff with Python

+ +

More “battle-tested” advice from an experienced developer

+ +
+
+

Python Tutorials and Teachers

+

Outstanding Python tutorials

+ +

Outstanding Python tutorials, with an emphasis on testing

+ +

Curated Python content

+ +

Coding problems and tutorials by my friend Trey. He is an amazing teacher.

+ +
+
+

General Python and Django Learning Resources

+

Popular documentation framework

+ +

Python Patterns

+ +

General Python resources

+ +

The go-to intermediate to expert Django book

+ +

Great, new-ish Python newsletter

+ +

A fabulous Django newsletter published every Friday, with all the most important Django news

+ +
+
+

Data Structures and Algorithms

+

The must-read algorithms book

+ +

Coding challenges

+ +

Course by the high profile Primeagen of Netflix. Does it live up to its name?

+ +
+
+

APIs and Databases

+

A tool I use and want to read up on

+ +

I work in a database department and as such would like to better understand database capabilities. See also Simon Willison for SQLite experimentation.

+ +
+
+

Testing

+

Brian Okken’s must-read pytest book

+ +

Outstanding, free testing lessons, at one time overseen by my friend Andy “Automation Panda” Knight, testing expert.

+ +

Django test performance by the excellent Adam Johnson

+ +
+
+

Refactoring, Patterns, Clean Code

+

Martin Fowler is the patterns GOAT. I’d like to spend more time reading more of his work and applying it in real life. Refactoring 2nd Edition was updated in JavaScript. Patterns of Enterprise Application Architecture is said to be dated.

+ +

Uncle Bob’s controversial Clean Code. Not everyone likes him or his work, but it has clearly been influential.

+ +

Detailed list of coding considerations

+ +

Exactly what the title says

+ +
+
+

General Engineering Resources

+

Julie is an outstanding teacher. Check out her blog posts and ‘zines.

+ +

Several new-ish (or new-to-me) blogs that stand out

+ +

Perhaps this is dated, but I’d like to know more

+ +
+
+

How Companies Do Things

+

A curated list of engineering blogs including most, if not all, of the leading tech companies, and many others too

+ +

A classic blog about system architecture. Also happens to be “for sale.” See the December 11 post and respond if you are serious.

+ +

Information about how companies do testing and SRE

+ +

The go-to system design learning resource

+ +
+
+

How CPython Works

+

Although I do not intend to divide my time between Python and C programming languages, I’d like to better understand how CPython works.

+ +
+
+

Engineering and Management

+

A legendary book by a business GOAT Andrew Grove

+ +

An instant classic by Camille Fournier, also employed by JPMorgan Chase

+ +

I had the pleasure of eating lunch with Sarah Drasner at GitHub Universe 2019, then got to know her on Twitter over the years. She produces outstanding work, and I know this book will be no exception.

+ +

An intriguing subject from Tanya Reilly, the creator of the famous “Being Glue” talk.

+ +

Although the Pragmatic Engineer Newsletter has not been around long, it has attracted a large following. The newsletter author wrote this book. I am intrigued.

+ +
+
+

More Great Books

+

Highly recommended by many people I admire

+ +

A group of highly recommended books related to cumulative achievement and productivity

+ +

An instant classic by the excellent Morgan Housel

+ +
+
+

Transformational Leadership

+

A colleague made me aware of the concept of Transformational Leadership. I love this graphic that categorizes leadership versus management. I hope to incorporate more leadership into my work to empower my colleagues.

+ +
+
+

Agile and Scrum

+

If you work in an agile/scrum environment, it’s a good idea to revisit these evergreen resources from time-to-time.

+ +
+
+

Product

+

One of the most important voices in product management

+ +

Prolific author of a widely-read, product-focused blog. Recently published the excellent The Ultimate Guide to Developer Productivity.

+ +

A couple of resources that I’ve had bookmarked for a while to spend some time looking through.

+ +
+
+

Podcasts

+

Interviews many of the movers and shakers of our time

+ +

An incredible example of hustle. His podcast put him on the map and helped him launch a career in VC, no small feat. Outstanding guests.

+ +
+
+

Certifications

+

I will consider obtaining new certifications in 2024. AWS and CKAD are on my radar at the moment.

+ +
+
+ + +
+ +
+
+ +
+
+ + + + + + + \ No newline at end of file