the further adventures of

Mike Pirnat

a leaf on the wind

Next Page »

Inside the PyOhio Program Process

It has been my privilege to serve as the Program Committee Chair for PyOhio 2018 and PyOhio 2019, and I'll probably do it again for 2020. I've had a lot of positive feedback about the program we've put together these past two years, and several folks suggested that it would be worth sharing a look at my process. It seemed like a good idea at the time, so here's a peek behind the scenes of our activities and all that goes into talk selection and scheduling for our conference.

Before I begin, I want to say a couple things about PyOhio that I'm really proud of. First, PyOhio is the longest continually-running regional Python conference! We just had our twelfth year and it just keeps getting better. Second, PyOhio is the only regional Python conference that's completely free to attend, thanks to our generous sponsors. Third, all of our organizers and speakers are volunteers, to whom I am extremely grateful. Last, but certainly not least, PyOhio is proud to be a welcoming and inclusive event, a platform for a diversity of voices, and a launching pad for new speakers. It's really an honor to be leading the curation of this very special event, and I'd love to have you--yes, YOU!--make my job even more difficult next year by burying me under great talk proposals.

My first order of business is making sure we have a committee. I like to have three of us in total so that we can have different perspectives and break ties if there's contention, while also not being impossible to schedule time together (being an adult is hard, y'all).

The Program Committee's activities are tightly bound to the calendar, so it will help to start with an understanding of our timeline. PyOhio is typically held on the last weekend of July, and we aim to give speakers as close as we can to two full months to prepare their talks. I've always found it helpful to back into a deadline, so that gives us roughly:

  • End of July: conference!
  • July 1: schedule announced
  • June 8: confirmed talk lineup announced
  • June 1: first round of acceptances delivered
  • May 15: CFP closed
  • Early to mid-March: CFP opened

Around the time the CFP opens, we start pushing communications around mentorship opportunities, both checking for folks who would like some guidance on getting a proposal put together as well as those willing to mentor newer speakers. As mentors and mentees sign up, I respond first with "thanks for signing up" emails, followed by emails to mentee/mentor pairs as I group them. That's all managed via Google docs: I have Google Forms set up for mentor and mentee intake, which both dump into Google Sheets spreadsheets. I use some conditional formatting to highlight mentors who mention PyOhio in their "past history" field, on the theory that if they've attended or spoken at PyOhio, they will be more familiar with the event and the vibe we try to establish, as well as folks who have mentored speakers in the past. I add fields to these to track the dates of all the points of contact such as acceptance and pairing, and I record the mentor/mentee pairings in each sheet as well. I also track whether a mentee has a talk accepted. We ask mentees to indicate the areas they are being mentored in, like submitting a talk proposal or preparing their talks, which I use to make the pair introduction email a little more meaningful. I should probably look into automating the email processes, but the traffic has been low enough that it's been okay to just keep the email templates in a Google Doc and do the copy/paste dance as needed.

It's then pretty quiet until we approach the close of the CFP; that's when the panic sets in as we see how few proposals have been submitted up to that point. Most of our proposals come in over the final week of the CFP, with about 50% of all proposals arriving in the last day. Folks do seem to enjoy procrastination! In 2018 we closed at midnight Eastern time; we changed this year use an "anywhere on earth" (or "AoE") cutoff and that proved to be really beneficial so I think we'll probably do that going forward.

Once the CFP closes, the rush to review talks is on. Our first phase relies on input from the community, soliciting volunteers via Twitter, email, and our Slack. We try to have a meaningful number of reviews on every talk within a week of the close of the CFP. During this phase we hide the speakers' names as well as any personally-identifiable data, and we deter speakers from rating their own talks by omitting them from lists of talks to be reviewed. (Yes, this last bit relies on the honor system to a degree; please don't be a jerk.) In 2018 we changed the default sort order of proposals to be reviewed so that the first ones surfaced are those with the fewest reviews; this has been a huge improvement in making sure all the proposals get the right amount of attention and helps to even out the volume of reviews for each one. Our current review process consists of rating a proposal ("++" for "strong proposal, and I will argue for it to be included", "+" for "okay proposal, but I won't argue for it", "0" for "abstain, don't show me again", "-" for "weak proposal, but I won't argue against it", and "--" for "problematic, and I will argue against its inclusion") and mandates a comment (which for me is often the hardest part of reviewing a proposal); all of this is conveniently part of the CFP site.

This period is also critical for speaker feedback, with reviewers messaging speakers through the CFP site to ask questions, request clarifications, or suggest improvements. Ideally we'd be doing this throughout the CFP process, but with the bulk of our proposals arriving in the last 24 hours, it isn't practical until we're into the post-CFP review phase.

During this phase, the three Program Committee folks review every proposal in this anonymized form, and we each make short lists of our "must have" talks as well as anything that we think is not going to be a good fit.

The second phase starts after we have a reasonable volume of reviews for all the talks and tutorials. We disable the community access to the review process and de-anonymize all the proposals. This is often where my heart breaks as I discover that three of my "must have" talk proposals are from the same speaker and I have to decide which of my darlings to throw overboard. Optimizing for diversity of voices means that we should only be taking one talk per speaker.

I build two more Google Sheets at this point, one to track talks and the other for tutorials. Into these sheets go dumps of the title, speaker, and voting data. I also add in the voting results specifically from the Program Committe members in separate columns. Columns are added for the "verdict" (whether we will accept a talk, reject it, or hold it for backup), community vote scoring, Program Committee scoring, whether the speaker had been part of the mentorship program, and any notes we want to add. I apply conditional formatting to highlight:

  • the entire row of a 45-minute proposal
  • the "new talk" field for talks that haven't been given elsewhere
  • the "first time" fields for primary or secondary speakers who haven't spoken before
  • the "diversity statement" field for speakers who self-reported being part of an underrepresented group
  • the "mentored" field
  • the "verdict" field

Each sheet also gets a separate tab for metadata that tracks, for each type of proposal (30-minute talk, 45-minute talk, tutorial):

  • the number of proposals
  • the number of slots available
  • the number and percentage of slots filled
  • the number and percentage of slots that still need to be filled
  • the number and percentage of proposals by first time speakers
  • the number and percentage of proposals by underrepresented speakers
  • the number and percentage of accepted proposals from first time speakers
  • the number and percentage of accepted proposals from underrepresented speakers

I use conditional formatting here as well to highlight certain things as various conditions are met; this helps me to know where things are good and where we have more work to do. Also I just love cell backgrounds lighting up magically as the process unfolds. ;-)

To generate a community vote score for each proposal, I started by giving each talk 3 points for each "++", 2 points for each "+", 1 point for a "-", and no points for a "--" or abstention. Since not all proposals received the same number of votes, however, I divide the summed score by the maximum theoretically possible score (3 x number of votes) so that we end up with a percentage. I apply the same point assignments for the commitee votes, but just use the basic sum since the committee members review every talk.

From here we start the sorting churn, first to separate the 45-minute and 30-minute talks, then to rank by the community and committee scores. The first sort lets us confirm how many slots we will plan to fill. For 2018 and 2019, we ended up with forty 30-minute slots, eight 45-minute slots, and four 2-hour tutorial slots. These numbers get plugged into those metadata sheets so that we can drive all the formatting and percentages.

I make a first pass through to record all of our "must have" and "must reject" results from our short lists. Anywhere that we have either more than one "must have" from the same speaker or a "must have" and a "must reject" in conflict, I mark the affected talks with a verdict of "discuss" (with its own magic highlighting for visibility!). Then I'll work with the committee, either on a Hangouts call if we can sync up or in Slack if we need to be asynchronous, to drive out discussion on everything else, redoing the sorting grind (now including verdict as the second column, so that all the accepted things are grouped together) as we make changes. Keeping this sorting going is annoying in Google Sheets because it isn't easy to reapply a complicated multi-column sort, but it's worth it to keep things grouped together since it limits the scope of the problem and really helps us focus. This part is mostly painless until we get down into the last few slots and have to make hard decisions. It's also important to decide between tutorial and talk proposals from the same speaker; this often depends on other proposals that might do a good job of supporting, leading into, or playing off of a particular talk or tutorial.

Besides the two scores, we're also looking carefully at proposals from first-time and underrepresented speakers, as PyOhio prides itself on expanding the diversity of voices that we're giving a platform to. We continue to focus here because, while we have been very pleased with the progress we have made so far, we have a long way to go before we can be satisfied.

We also look for any underappreciated gems lurking in the lower-scoring talks; there's often something weird, different, and wonderful hiding in there that's worth boosting up.

Hopefully, all of this second phase is completed in a few days, so that by the end of the second business week after the CFP has closed, we're able to get the thumbs-up from our conference chair and send out the first round of acceptance emails. Then my true agony begins: waiting for speakers to confirm that they will actually give the talks they proposed. As confirmations come in, I add a column to my sheets next to the "verdict" for the "outcome", marking whether the talk was "confirmed", "declined", or is "pending" based on things the speaker needs to check on. This year I also added a column to the spreadsheets to record the date that the acceptance went out so that I can easily flag things that have not had a response after a couple of days. For each response that comes in, I also send a reply email to ensure a good feedback loop with the speaker; I feel it's especially important to invite folks who had to decline the acceptance to submit again in the future.

As we have speakers decline, we dip back into our maybes for replacements, checking in on Slack to discuss options, and the process repeats until we've confirmed a full talk lineup. This loop takes a speaker's geographic origin into more consideration than the first pass, since someone who is local or from an adjacent state may not have the same travel challenges that might have prevented a more distant speaker from confirming an accepted talk. This is also a step where we shine a light on talks that might have gone underappreciated during the review process. (I should note here that we have been fortunate to have some really great talks amongst the "maybe" pile that have gone on to be very well received; these aren't "bad" talks by any stretch of the imagination, they just weren't quite in the first cut.) When the lineup is fully confirmed, I'm able to tend to the unfortunate duty of sending rejection notices. When that's complete, we can announced the lineup, hopefully by about a week after the first acceptances are sent.

Once the talk lineup is confirmed, it's time to make the actual schedule! I use a site called Padlet to help with this; it's a virtual sticky note board that's simple to use and can be operated collaboratively, so it's a great fit for us. It's really nice to explore the scheduling problem spatially and quickly swap things around. I start with making an empty schedule grid, with times down the left side, and rooms, with their seating capacities, across the top. Next I make cards for all of the talks and tutorials, grouped by size/duration. Each card gets the talk ID (so that I can quickly jump to the proposal details using a custom Alfred shortcut), an abbreviated title, the speaker name(s), the speaker's state or other geographical origin point, and optionally some single-character tokens to indicate whether the speaker is a first-timer or is underrepresented. I also color-code the card if I've made any promises to a speaker about scheduling (eg, if someone has requested a particular day or time based on travel needs) and also note that on the card.

Our current conference rooms vary signficantly in seating capacity, so gauging the prospective interest in each session is vital to getting talks in appropriately-sized rooms. To do this, I create a survey in Google Forms to allow the broader community to indicate their interest in each talk. This is basically two questions with "check all that apply" answers: one for 45-minute talks and one for 30-minute talks. I enable the random ordering for the response options in each question so that we can correct for any bias in the order they're presented in. This goes out at the same time that the talk lineup is announced, and we run the survey for about two weeks, by which point we've pretty much gotten all of the responses we're going to get. I add each talk's vote total to the card in Padlet so that I can use it as a factor in room assignment.

Once all the talk cards exist, and we've got the interest data, each member of the Program Committee makes a pass through them to group them thematically, so that we can understand where we have clusters of topics or things that we want to thread together to provide an extra level of meta-narrative for attendees.

We start with scheduling the tutorials first, since there are only four of them, and they're going into a single known room. I'd like to say we use a rigorous process here, but it mainly comes down to putting them into a sequence that doesn't feel too mentally overwhelming for us if we were to attend all four (respecting any promises noted above).

Talk scheduling is a bit more challenging. I start by placing anything where we had a commitment to a speaker in roughly the right time slot, knowing I can just scoot it into a different room as I get going. In a working area, I sort the cards into columns based on the number of survey votes they received and their topical grouping. This gives me a very approximate sense of which talk is headed to which room. Then it's off to races as I start dragging talks into place in my grid area to make the first draft of the full schedule!

There are many dimensions to consider here, and like it or not, the choices that are made reflect the values of the event and its organizers. Factors I consider include:

  • the surveyed interest in the talk
  • the speaker's geographic origin
  • the subject of the talk
  • the speaker's first-time and underrepresentation status
  • the audience level of the talk

I start with the highest-voted talks first, placing them into the two larger rooms, then the lowest-voted talks into our smallest room. Some exceptions are made where we feel strongly about the value of a talk that might have been overlooked during the survey process; often we can get a bigger audience for and underappreciated talk by simply programming it into a bigger room, signaling that it we feel it deserves to be there.

To accommodate our speakers' travel needs, the speaker's geographic origin plays a big role in choosing which block a talk goes into. We basically have four big sections: Saturday morning, Saturday afternoon, Sunday early afternoon, and Sunday late afternoon. That late Sunday afternoon block is typically all speakers from Ohio or the surrounding area for whom driving home wouldn't be super inconvenient. Speakers from places that have reasonable Sunday evening flight options can go into the Sunday early-afternoon block. Speakers with fewer flight options usually end up on Saturday, with anyone from the west coast going into Saturday afternoon to minimize their time zone pain.

The topic of the talk is important too; attendees interested in a particular subject will probably appreciate being able to attend more than one talk in that subject area; it doesn't make sense to have all the machine learning talks at the same time since someone could only attend one. So I try to layer those into the schedule vertically, sequencing them so we can try to wring some synergy from them; a good example here was arranging two talks about Pytest such that the more introductory one came first and the more in-depth one came second, and both of them preceeded a tutorial on automated web UI testing. (The speakers even picked up on this after the conference, which was utterly gratifying!) Talks on topics which we feel are important or should be emphasized (such as--but not limited to--testing, security, ethics, humane cultural practices) often get programmed into the bigger rooms. Talks on more niche subjects, personal projects, and curiousities often end up in one of the smaller rooms.

From a diversity standpoint, it's not enough to have a particular quantity of underrepresented or first-time speakers, they have to be visible too; that means scheduling them throughout the conference instead of loading them up at the same time slot(s). I approach scheduling with the goal of having at least one underrepresented speaker in every time slot. I similarly thread the first-time speakers vertically through the grid so that we always have a balance of first-time and veteran speakers.

We've chosen not to prompt speakers to identify the audience level of a talk, so I take a bit of a guess at slotting a beginner-appropriate talk into every time slot. This way the less-experienced attendees will always have at least one good option to explore throughout the entire conference. I've gotten positive feedback on this, so I think we're doing okay on this front.

Once I've got all the talks placed into the grid in Padlet, I export a png and share it with the committee. (I do this png step to give us an approximation of version history.) We go through a few rounds of review and adjustment, and I second guess myself a lot, but it stabilizes pretty quickly. Once the three of us feel good about it, I run it by the conference chair for approval, and after that I use the CFP site to assign every talk to a room and time.

The last thing we do as a committee is a new activity we added this year: we create a public Google Calendar for the conference events. The entire conference schedule is added to the calendar, and speakers are invited to their own talks. This way it's easy for anyone who likes to manage their conference-going using calendaring apps to pick talks they want to attend, and speakers can effortlessly know where and when they need to be to deliver their awesome talks. We got a lot of positive feedback about this this year, so we'll definitely keep doing it as long as I'm involved.

After that we sit back and wait to hear from speakers who have questions or need help with something. It's a lot of work, but it's all worth it when the conference happens and completely exceeds our expectations as it has these past two years. It's really gratifying when it all comes together and you can feel the energy from the speakers and attendees. I'm extremely thankful to my fellow committee members, the organizers, our speakers, and our attendees for the roles they play in creating this very special event.

Read and Post Comments

D&D 5E Essentials Kit Unboxing and Hot Takes

Hey, folks! One of the reasons I haven't been blogging much over the past few years is that I have gotten back into Dungeons & Dragons in a big and time-consuming way. D&D and I go way, way back (I still have my original pink box Basic Set including the dice!) and it's been so great to get back to having epic adventures with my friends. I am a big fan of Fifth Edition, and so it's with great excitement that I picked up the new D&D Essentials Kit. I did some unboxing photos and quick hot takes on it for the small D&D-themed Slack group I'm in, and one of my friends there convinced me that I should blog it all, so without further ado, let's take a look!

First off, the box art is just gorgeous:

D&D Essentials Kit 01 - Box

It's also notably heavier than the Starter Set that was released back in 2014. We'll find out why in a moment!

Notice also the "for 2-6 players" blurb; we'll come back to that too.

No D&D box set would be complete without dice!

D&D Essentials Kit 02 - Dice

"What's that die with the 12 on it, I've never used that one before."

-- Chris Miller

These are a radical departure from the blue pearlescent dice that shipped with the Starter Kit, practically their opposite by being both red and translucent. A close inspection revealed no air bubbles or obvious flaws, and my handful of test rolls with the d20s seemed pretty reasonable. Also this is the first time that I've seen a D&D box ship with more than one of each die; included here are a second d10 for percentile rolls, a second d20 for rolling with advantage/disadvantage, and 4d6, presumably to ease character creation (thought it's also half a fireball). This seems like a nice nod to products like the Dice of Rolling where the mix of dice is tuned to the most common dice rolling situations. It's not quite as good as the DoR, but I commend the move nonetheless.

After the dice, we have the brand-new adventure book, Dragon of Icespire Peak, 64 pages of squarebound awesomeness:

D&D Essentials Kit 03 - Dragon of Icespire Peak Front D&D Essentials Kit 04 - Dragon of Icespire Peak Back

I did a very quick skim of the adventure, and from what I saw I really like how it's structured. It's all small quests that you can do in a single session, in largely any order, plus some optional side things. The adventure breaks out "starting quests" and "follow-up quests", with leveling guidance that I really like. Until characters get to third level, they get a level for each starting quest. From third and above they get a level for completing two follow-up quests. And they get a level for the dragon--if they slay it!

Speaking of the dragon, it's roaming! Any time the party arrives at a location, the DM rolls to pick where the dragon is at that point... it might be at the same location that the party is visiting! It also has a specific lair, separate from any of the other quest locations. I really, really like this mechanic, as it adds an extra dimension of chance and danger as it may result in early and multiple encounters with the fearsome beast, which in turn will make its defeat all the more satisfying.

The individual quests are roughly two to four pages each, and are presented alphabetically by title rather than sequenced by level or plot threading. This seems like a reasonable decision to me; I think it may result in overall faster lookups by the DM.

There's new art throughout the adventure, and like all the 5E art, it's great. I will always have affection for the art in the Basic Set and in the 1E books, but we are well and truly spoiled by the production value on display in the 5E items.

As with Lost Mine of Phandelver, all the monster stat blocks that you need for the adventure are included here.

Beneath the adventure book are several perforated sheets of cards that serve various purposes; I appreciate that they're printed on some nice card stock. The first two we'll look at are the Initiative Cards and Quest Cards:

D&D Essentials Kit 05 - Initiative Cards D&D Essentials Kit 10 - Quest Cards

It looks like the purpose of the Initiative Cards is to hand these to players once the turn order has been established, thereby helping everyone remember what order they are supposed to act in. I'm not entirely sold on this concept, but it seems like it could be useful for helping new players to ease into the game.

The Quest Cards record the name of the quest, the purpose, the questgiver, and the reward. Again, I think the idea here is to hand these to the players when they accept a quest, and then they hang onto them until the quest is complete, so that they'll remember the important facts about what they've signed up for. While this is a bit "game-y", sort of like picking up Route Cards in Ticket to Ride, I think this is a great idea, especially for new and younger players. Heck, I think the campaigns I play in could benefit from something like this!

Next are the Condition Cards and Combat Cards:

D&D Essentials Kit 06 - Condition and Combat Cards

The Condition Cards feature art on one side and document the game mechanics of the condition on the other side. They're a nice quick reference for what it means to be Charmed or Grappled or whatever, and the DM can again hand one of these to a player when they're affected by a particular condition. I love this and can see it being a great way for players to remember what's in effect during gameplay. The only downside is that there's only one of each condition, so if multiple players get knocked Prone at the same time they'll have to share a card.

The Combat Cards are a quick reference to how a combat encounter works, at a high level, that I can again see as beneficial to new players. It's nice that three are included here.

Next we find the Sidekick Cards, which I adore:

D&D Essentials Kit 07 - Sidekick Cards Front D&D Essentials Kit 08 - Sidekick Cards Back

Remember how the box said you only need two players? Sidekicks are simplified NPCs that can join the party; they're meant to enable one-on-one play by bolstering a solo player without having to be as complicated as playing multiple characters, with a limited set of abilities so that they are helpful but don't overshadow the player character(s). The player(s) and DM can decide whether the player(s) or DM will control the sidekick. The front of the card shows a portrait of the sidekick (the art here is really charming, and there are some great names--my favorites are Ruby Hammerwhacker and Donnabella Fiasco!), while the back gives some highlights of their personality and indicates which of a handful of stat blocks to use for the sidekick. This is such a great idea and I can't wait to try it out in actual gameplay.

Finally there are several sheets of Magic Item Cards:

D&D Essentials Kit 09 - Magic Item Cards

Again, this is a great feature for newer players. When the player finds an item, just hand them the card, and it has everything they need to know about what it is and how it works. If they want to give it to another party member, they just hand the card over, with no tedious pencil scratching or erasing involved. The groups I've played in lately have embraced various forms of private electronic messaging (mainly Slack) for communicating this kind of info, but for younger players or uneven mixes of technology, this is perfect.

Once you separate all the cards, you'll want somewhere to keep them; the Essentials Kit thoughtfully includes a little box for you to store them in! Just fold it up and off you go:

D&D Essentials Kit 11 - Card Box

Another big win for the Essentials Kit is the large, player-friendly map that's included:

D&D Essentials Kit 12 - Map Folded D&D Essentials Kit 13 - Map Sword Coast

The Sword Coast area is depicted on one side, absent all spoilers so that quest locations can be properly discovered, with a map of the town of Phandalin on the reverse:

D&D Essentials Kit 14 - Map Phandalin

After the map comes the Rulebook, another 64-page squarebound tome:

D&D Essentials Kit 15 - Rulebook Front

The major addition here that wasn't included in the original Starter Set are rules for character creation! A core set of races and classes, with a couple of archetypes for each class, are included:

D&D Essentials Kit 16 - Rulebook Contents

Again, there's lovely new artwork throughout this book.

While monster stat blocks are in the adventure, the rulebook has all the equipment, magic items, and spell info.

Sidekick rules are short and sweet, amounting to two pages at the very end of the rulebook, including the handful of stat blocks and guidance on levelling them up if they stick around/live long enough.

Another addition to this set is a DM screen with brand-new art!

D&D Essentials Kit 17 - DM Screen Front

At a quick glance, the DM-side content appears to be the same as what's on the "Reincarnated" DM screen, though I think with a slightly different layout:

D&D Essentials Kit 18 - DM Screen Back

It's printed on a heavy card stock, but is kind of flimsy compared to the existing screens; mine appears to have been slightly bent at some point during the production/packing process. The player-side art is great though!

The box includes six blank character sheets printed on heavy paper stock which should hold up well to lots of pencil and eraser love:

D&D Essentials Kit 19 - Character Sheets

I really like the extra space for "additional features & traits" too.

Last but not least, there's an advert inviting us to buy more stuff! Don't throw this out though--on the back are unique coupon codes for D&D Beyond!!

D&D Essentials Kit 20 - Adverts & Offers

That's right, there's finally a physical/digital crossover, which fans have been begging for on the Beyond forums since their beta. Included with the Essentials Kit are:

  • a coupon code for a free digital version of the adventure, Dragon of Icespire Peak
  • a coupon code for 50% off the digital version of the Player's Handbook
  • a link to extra content to continue this adventure at higher levels

QR codes link to each of the appropriate destinations, which makes for nearly hassle-free redemption. I say "nearly" because the coupon codes are mixed-case, which makes them not quite as easy to key on a mobile device. And though the coupon codes are unique, the QR codes linking into the site are not; it would have been cool and convenient if the links in the QR codes had pre-filled the coupon codes into the site. Oh well, can't have everything.

That "extra content" link takes you to a landing page that is mostly about getting started playing D&D, with a big "coming soon" blurb on the actual extra content. That's also a mild disappointment, but I'm excited that there is more content coming, and if I were a new player, and not already invested in/hooked on Beyond, I'd be glad to have something addressing the "okay, now what" question and ushering me into the game. It's well executed, and the Beyond folks deserve credit for helping to bridge that gap.

It looks like there are three adventures on the way--one for a seventh-level party, one for ninth-level, and one for an eleventh-level party. It's not clear whether or not these will be exclusive to Beyond, but it seems like there's a good chance of it, given how this insert is all about experimenting to see if a physical-item buyer will convert into an online buyer. And while I have enjoyed the larger "blockbuster" hardbacks from 5E, I have a ton of nostalgia for smaller module-sized adventures from the 80s that could be played in one or two sessions, and I warmly welcome this return to form.

I can't overstate how exciting it is to have the physical and digital realms crossing over here, much the way Marvel has with their comics. This is HUGE, and makes me want to re-buy the PHB this way to demonstrate to them that the hybrid physical/digital model is viable. (Alas, I already own a Legendary Bundle on Beyond so I don't think I can.)

Also included on the back of the advert sheet is a nice section covering "where to go to join the community online" with links for D&D's official Twitter, Facebook, website, YouTube, Twitch, and the DMs Guild marketplace. This is also a huge change from my entrée to D&D, where for my first couple years I played pretty much entirely on my own, with no one in my peer group who was interested in it (or, frankly, capable of it; I only got my Basic Set because I wanted a copy of Dungeon! and my mom bought the wrong thing, and I was probably way, way too young for actual D&D; thanks, Mom, you're awesome!).

So, my final verdict/hot take is that everyone involved did a great job with this new version of the starter set. It really looks like a lot of fun, I can't wait to play the new adventure and try out sidekicks, and I'm hopeful that we'll see more physical/digital crossover in the months to come.

Onward to adventure!

Read and Post Comments

Rey & Kylo's Greatest Hits, Volume 2

One post wasn't enough to contain all of the Praetorian Guard fight mashups that I made over the weekend, so here's volume 2. As with part one, this post is chock-a-block full of spoilers for The Last Jedi-- you have been warned!

After getting a bit of sleep, I jumped back into mashup action on Sunday, opening with a selection inspired by my college friend and once-upon-a-time radio show buddy Genevieve Mathieson, currently celebrating her 20th year on-air. (Seriously, check out her show, it's awesome!) She opens every installment with this gem:

Here, I really like how the change-ups in the medley fit so nicely with the transitions between the "chapters" of the battle. I can't help but smile.

That got me thinking of my on-air days of yore, and a song that my friend Marie Vibbert introduced me to during the very first episode of my show, and which always delights me when it crops up (as it did in last year's Baby Driver).

There's a nice little guitar note just as Snoke is being cut in half, followed quickly by a great connection with Rey catching the saber. The first saber hits of the battle match up well enough, and then the party really gets started. This almost feels like something in between the "Thunderstruck" and "March of the Pigs" videos to me. Overall the "chapter" shifts do pretty well here too.

I had seen a few requests for Queen's "Princes of the Universe" by this point but without any videos, so I figured I might as well do one.

The lyrics here are kind of... interesting when juxtaposed with the visuals. Clearly they are both "fighting to survive, in a war with the darkest powers" as well as "fighting and free". But a major point of The Last Jedi is that Rey isn't from special lineage, and isn't part of some grand destiny, so the claims of being "born to be kings" and having "blood of kings" run somewhat counter to this premise. I ascribe all the lyrics here to Kylo Ren's perspective, like an internal narration. There's sort of a fun double meaning at play that I really like a lot--just as Freddie Mercury sings "no man can be my equal" we get a zoom-in on Rey, who, like Éowyn in Return of the King, is indeed no man.

Visually, things line up pretty well overall, with especially good chapter divisions, and the "blood" line landing right on the shredder gag.

I'm pretty disappointed that there are so few views of this one--just three at the time of writing, compared to over seven thousand of the Hamilton one, and I think they're all me making sure it uploaded okay.

I really like mid to late 90s industrial music, so Rammstein's "Du Hast" seemed like a pretty good idea.

Lyrically, there's already a double meaning at work: "du hast" functions as both "you hate" and part of a line that translates as "you asked me and I said nothing," lines which tap deeply into the context of the scene. Everyone is dealing with hatreds, and Rey and Kylo had just asked each other to abandon their old allegiances and turn. The lyrics go on to challenge whether they will be faithful until parted by death, answering with a resounding and repeated "no!" that to me encapsulates their turbulent, transient alliance.

Lots of visuals line up well here; I especially like the cuts between Rey and Kylo before the battle starts, and the way the crunchy guitars enter just as the melee begins. As a nice bonus, the sort of angelic backing vocals line up perfectly with moments when Rey is yelling.

"Du Hast" got me into playing with Rey and Kylo Ren's relationship, so what if maybe they were a couple on the verge of a breakup (which they kind of are)?

I imagine this as Kylo Ren trying to convince Rey to stay, offering up banal platitudes like "I guess I was wrong" while they do terrible battle with the forces of darkness and the world burns around them ("and we're falling apart"). I like weird juxtaposition a lot, is what I'm saying.

Visually there's a lot of good timing again here; this one continues to make me happy.

I had seen many suggestions for The Proclaimers, so I stayed with 90s rom-com edits with "I'm Gonna Be (500 Miles)":

It's overall just silly fun, with some good alignment in places; the "ta la ta" bits are especially well placed to me. I enjoy the juxtaposition of Kylo Ren pledging to "dream about the time when I'm with you" as he murders the hell out of a guard, as if this whole thing is like his idea of a really awesome date.

The delightfully inappropriate juxtaposition of The Proclaimers reminded me of the classic reimagining of The Shining as a romantic comedy, and so I quickly flashed onto Peter Gabriel's "Solsbury Hill" that was featured in the Shining video, wondering if it would work in this context too.

Overall I'd say it's pretty successful, with a lot of the action lining up decently. In particular, Kylo Ren's triple-hit guard kill at the 1:47 mark seems to really connect to the music well.

My favorite coincidence here is getting Peter Gabriel singing "which connections I should cut" with "cut" landing exactly as Snoke is sliced in half.

This one also has tragically few views, so give it a spin and see what you think.

Taking a quick detour from rom-com treatments, I remembered the Michael W. Smith instrumental "Ashton" that I'd been obsessed with in high school, a piece that always got me revved up and made me yearn for the perfect visuals to go with it. I'm reasonably sure that at one point I daydreamed extensively about how it really needed something like a lightsaber fight. Decades later, Rian Johnson has finally delivered. Thanks, Rian!

I wasn't done playing with the Rey/Kylo Ren relationship; inspired by the "Emo Kylo Ren" Twitter account, I started playing with some of my favorite songs by The Cure. I couldn't quite get "Just Like Heaven" to work, and "Lovesong" didn't feel right, but then I got a little more into Ren's head and "Why Can't I Be You" seemed perfect: tapping into a mix of obsession and jealousy that seemed absolutely authentic for Kylo Ren. Secretly--and totally obviously to the audience--he wishes he could be as powerful and amazing as the lovely nobody whose sudden appearance in his life has shaken him to the core.

There's an urgency to the music that pairs really nicely with the scene, I think, and lots of good bits of action that connect well.

At the time of writing, this one is also under-appreciated on views, which is a shame, because I think it explores some interesting territory.

I was on a little bit of a roll with the 80s music/obsessive romance thing, so Depeche Mode seemed like a good next step. I chose a reworked version of "Enjoy the Silence" for the slightly industrial edge to it; I think it pairs better with the battle scene than the original version would.

Things that make me happy here include but are not limited to the lightsaber landing in Rey's hand as we get "here, in my arms", the start of the melee, Rey skewering a guard as the lyrics get to "pain", the guard getting shredded on "harm", "in my arms" as the guard grapples Kylo Ren, and the two syllables of "wanted" as Rey takes down her final opponent.

Moreover, I think this works so well because Rey and Kylo's entire negotiation and agreement before the battle takes place wordlessly. "Words are very unnecessary, they can only do harm."

Still in the 80s, I took things for a silly turn, casting the fight as the ending chase sequence from Ferris Bueller's Day Off. Pretty much no one knows the actual title of the song that plays as Ferris dashes through people's back yards as he tries to beat his parents home, so this has a pitifully small number of views so far.

I had started on this next one during the Saturday night binge, but wasn't quite getting it working due to an audio edit dilemma, so I thought I was just going to scrap it. Fortunately, my daughter came along the next day and encouraged me to finish it, so with her help we got it to a reasonable place.

This is the only video so far where I've messed with the audio at all, making a splice from the opening of the song into a spot near the end so that the transition into the start of the battle would be right.

From a timing standpoint, I love the "D-I-Y" matching up with the first saber strikes. Stay to the end for another fun shredder gag.

This has long been one of my favorite KMFDM songs, and I come back to it often when I need a dose of challenge-smashing self confidence. To me personally, "do or die" is metaphorical--the death of soul or spirit if I let myself succumb to whatever is eating at me--but here in the Star Wars universe it is quite literal. As a bonus, I think Yoda would agree: "do or do not; there is no try."

Finally we come to where I stopped for now, having to get back to life with my family and a return to the work week.

I've really fallen hard for this track over the past year or so, and I get chills from having it paired with this fight scene.

I'll let it speak for itself.

I have some ideas for others, so I might do a few more soon, though the meme seems to have died down over the past day. I've stopped getting new attention on the Hamilton video, which seems like a sign that this might be over for now.

The whole process was a lot of fun, though, scratching a creative and performative itch that has been nagging me off and on since the demise of, so I'm grateful to have been able to enjoy the ride while it lasted.

Read and Post Comments

Rey & Kylo's Greatest Hits

Disclaimer: This self-indulgent post mainly serves as a way to collect a bunch of silliness into a single place for convenience, while also offering a platform for extra context--a sort of "director's commentary" if you will. It also contains MAJOR HELLA SPOILERS OF DOOM for The Last Jedi. Proceed with caution!

It started so innocently.

While skimming Twitter on Saturday, I ran across the start of the thread that quickly came to dominate my waking--and should-be-sleeping--hours:

I saw that people had started making their own in response and I couldn't resist. I had to get in on the fun. I skimmed through to see what had already been done, cast about for a few ideas, and then made this:

Fun fact: I almost started working with "Yorktown" instead, but suddenly I realized that after this battle, there are no witnesses to what occurred in Snoke's chamber. Literally NO ONE ELSE WAS IN THE ROOM WHERE IT HAPPENED!

My first attempts at this mashup had stronger timing for the opening beats as Rey catches the lightsaber, but adjusting things to gee the "click/boom" payoff was worth the sacrifice.

After rendering that out and getting it tweeted, I was flush with excitement and ready to make one that would channel how pumped I was feeling. I was also starting to feel some time pressure since I had social plans to get to. Enter "Thunderstruck":

I was really happy with how the timing worked out here. Besides getting the "thun-der" synced with the opening lightsaber strikes, it also timed perfectly with the cut to the wide shot of Snoke and the twitch of Kylo Ren's fingers that summons the blade, the red light on Kylo's face as he ignites his own saber, and the cut to the wide shot as Rey and Kylo pivot into battle. I also like how the "ahhs" in the opening match up to Rey shots. In general there are some good places where beats line up with saber strikes and sparks, which make me really happy.

Lyrically, I like how "what could I do?" lines up with Rey being caught by the guard just before she skewers him, and the "yeah" as Kylo Ren makes a guard-kabob of his own. I do wish that "tore me apart" was a little closer to the guard being shredded, but one can't have everything, especially when the "you've been... thunderstruck!" connects so perfectly to Rey's saber drop.

I came back from visiting friends and was both sad and happy that no one had made my next idea, which feels like it should have been more obvious: "Battle Without Honor or Humanity," AKA "that song from Kill Bill."

There's some more good timing here: Snoke getting chopped, the cut from Kylo to Rey, and especially the opening saber strikes, as it turns out there's a third hit where Kylo's saber connects with the ground, giving a satisfying payoff to the "bam-BAM-bam!" Lots and lots of the melee hits line up on strong beats; there are some particularly fun moments with Kylo just before and as he's grappled that are really delicious, and we get a pretty decent effect for Rey's saber drop.

I was still feeling the Kill Bill vibe, so my next pick was "Don't Let Me Be Misunderstood":

I love this song for a sword battle, but I also love how it plays with the who's-going-to-turn psychology of the scene. It's probably funnier to consider the lyrics as being Kylo Ren's point of view, and I adore how his face lights up red just as the lyrics get us "seem to be bad."

Once more we get good beats on saber strikes and Kylo being grappled, and a good sync with the guard being shredded, but my particular favorite bit is how the music goes with Rey being reeled in by the guard. I also like the "oh, Lord" as Kylo scans the room, the brass riff during Kylo's pirouette around the 1:44 mark, and the strings as Rey throws her saber to Kylo.

Next I wanted to connect with the raw energy and chaos of the opening of the melee, and nothing says that to me quite like "March of the Pigs" off of The Downward Spiral:

I enjoy the synth kicking in just as Rey rises into the frame, and it meshes nicely with the cuts back and forth between Rey and Kylo before the battle, but what makes this for me is the "step right up!" as the guards approach and the guitar kicking in on those first saber hits, and the chaos of the start of the fight.

I love Styx's "Come Sail Away" without a trace of irony, so I had to do it at some point:

I chose this mainly to get the electric guitars to drop in as the melee starts, but there are plenty of good saber hits, Rey's skewer-and-toss with is nicely accompanied, and I like how the gag with the shredder works here. Lyrically, I love Rey and Kylo Ren coming together to "try, best that we can, to carry on!" though Yoda might admonish them about whether or not there is a "try."

Fun fact: "Come Sail Away" was released in 1977, just like Star Wars! Since I had just steeped in the above nostalgia, and since Star Wars is about heroism, it seemed fitting to pick up another classic tune from 1977, David Bowie's "Heroes":

I read the lyrics here as Kylo Ren talking to Rey about their doomed relationship. "You will be queen" as Rey rises up, "nothing will drive them away" as the guards close in... "We can be heroes," opines Kylo Ren, but alas, "just for one day." Nothing can keep them together.

Around the time that I posted "Heroes", I saw that someone had done "Gangnam Style", which popped me out of the nostalgia and straight into internet meme territory, and I simply had to do "The Fox":

Sadly the video clip isn't long enough to accommodate the full first verse, but that's made up for by "frog goes croak" as Kylo cuts Snoke in half (because "ha ha, double meanings LOL"). Also Snoke's torso hits the deck right on "toot," which makes me giggle. I mainly timed this around getting "fox say" to match the first saber strikes, and I'm very amused by how each of the fox noise segments line up with different parts of the fight. The shredder gag makes a decent showing ("your fur is red, so beautiful"). I do wish that the last "what does the fox say" had lined up better with Rey's saber drop move--ideally I'd have "fox" on the knee swing and "say" on the headshot.

It's gotten way too late, so I'll have to follow this up with a second installment to cover the rest. Until then... May the Force be with you!

Read and Post Comments

PyCon 2018 & 2019 Dates


Since I've been asked a few times about the dates for the upcoming PyCons in my lovely city of Cleveland, Ohio, and there is surprisingly little about it in Google results, and I wouldn't mind an SEO bump, here is the scoop, along with photographic proof from the closing keynote of PyCon 2017:

As usual the first two days should be tutorials, followed by three days of conference proper, and finally four days of sprints.

I hope to see you there!

Read and Post Comments

Daypack Shootout: North Face Borealis vs. Osprey Quasar

Once upon a time in 2016, I was getting ready for my first trip to the United Kingdom, and I found myself in need of a proper daypack. It would need to not be awful to carry through airports, manage a laptop, a small camera, and limited supplies like a water bottle and small snacks, stow a light jacket, hold some modest souvenirs that the kiddo would inevitably insist on, and stand up to the springtime rains. Bonus points would be awarded for not looking horrible or presenting me as a theft target. I spent a week or so agonizing over online research and eventually narrowed the field to two final and very similar contenders: Borealis by The North Face and Quasar by Osprey. I ordered both from Amazon and spent an evening doing an in-depth comparison, the results of which, dear reader, are at long last yours to behold.

Buckle up--there's going to be a lot of pictures.


So that's the Quasar on the left and the Borealis on the right. Both bags are 28 liters and are remarkably similar to one another.

Both bags feature a bungee cord for external storage of things you might want easy access to. The Quasar's matches the rest of the bag, for a more subtle look, while the Borealis offers a splash of color (and in fact comes in a nearly ridiculous number of available colors).

IMG_4753.jpg IMG_4769.jpg

Both bags were easily capable of corralling a light jacket that I jammed in not very neatly for a quick test, giving me confidence that they could support my layering needs. I really didn't want to wear a wet rain jacket indoors, so this external, easily accessible storage was a huge win for me.

IMG_4754.jpg IMG_4771.jpg

Both bags terminate this cord with a little plastic hook that you can attach to this webbing to keep things nice and neat. The Quasar's hook is a little larger and seemed both more robust and easier to work with. I also preferred the mechanism on the Quasar that's used to adjust the tightness of the web.

IMG_4755.jpg IMG_4770.jpg

Both bags fit a modest water bottle with ease in the stretchy side pockets. But we have a major point of differentiation here: the Borealis has only one compression strap per side, while the Quasar has two. On the Borealis, the compression strap and its hardware interfere with the top of my bottle, while on the Quasar the bottom strap goes over the outside of the pocket (meaning you can over-tighten it and make the pocket difficult), and the top compression strap is far out of the way. Points here (for me at least) go again to the Quasar.

IMG_4756.jpg IMG_4777.jpg

The side pockets are also a great place for an umbrella--another late March London necessity. This also gives us another look at the placement of those compression straps.

IMG_4757.jpg IMG_4776.jpg

The Borealis has a little molle strap sewn into three segments that you can use to hook stuff onto the bag. The Quasar has two mount points featuring a sort of rubber tube. I kind of liked the molle material better, and it was easier to clip things on there, but I can also see the value in how Osprey has arranged things on the Quasar.

IMG_4758.jpg IMG_4772.jpg

Both bags have an adjustable waist strap that you can use to shift some of the bag's weight onto your core and hips. (Also great for feeling self-conscious about the proportions of your belly.) These straps need to be fairly snug for you to really enjoy any of their benefits; to make this easier, there are nice little loops on either end that. While these are functionally equivalent, I thought the loops on the Borealis were finished a little better, and the waist strap on the Borealis was a little wider/thicker, and so slightly more comfortable when worn and also slightly nicer to adjust.

IMG_4768.jpg IMG_4782.jpg

The Borealis and the Quasar both feature sternum straps that can be raised and lowered as well as tightened. They're basically identical, and both have whistles built into the clips. You may not think that's all that novel, but I hadn't shopped for backpacks since the 90s, so I commend bag makers for this very cool safety addition. Good job, y'all!

IMG_4760.jpg IMG_4781.jpg

There are some additional mount points on the shoulder straps of each bag. I found the little molle straps on the Quasar easier to work with.

IMG_4761.jpg IMG_4783.jpg

Both bags feature a small pocket near the top that's suitable for sunglasses and small electronics. The pocket on the Borealis is lined with super-duper soft material to prevent scratching up your specs, while the material on the Quasar is adequate but not quite so luxurious a home for its contents. These pockets are essentially identical in terms of size, so if pampering your stuff is a goal, the Borealis gets the points here, but I'd be willing to bet that this pocket on the Quasar does a little better in wet conditions.

IMG_4759.jpg IMG_4773.jpg

Each bag has two major compartments, accessible from a panel-style zipper that goes up and around like an upside-down U. The outermost of these compartments features each maker's take on some organization features, while the innermost is home to the bulk of the bag's storage.

Looking at the Borealis first, we have a nice variety of pockets in various pratical sizes, some padded and some mesh, with one zippered. The zippered pocket includes a little strap and clip to attach your keys; I appreciated being able to conceal keys in this pocket. The narrower of the two padded pockets is just right for a mobile phone, and the wider is a lovely home for a tablet (like my old, old iPad 2). There are also a couple more molle strap mount points to let you customize things a bit. Down at the bottom are spots for pens and pencils and mesh pockets just about right for a little pocket notebook.

IMG_4763.jpg IMG_4765.jpg IMG_4764.jpg

The Quasar, by contrast, is a little more barebones. Yes, there are some pen and pencil slots; yes, there are a couple of miscellaneous pockets; yes, there are a couple of stretchy mesh pockets; yes, there is a clip for your keys. But the clip doesn't hide away with the elgance of the Borealis, and nothing feels quite as well thought out as on the Borealis. I like that the color here makes it easier to find things, but the Borealis seems better organized in practically every other regard. That said, the Quasar does one thing here far, far better than the Borealis--access. Remember those compression straps? On the Borealis, the compression straps interfere with the zippers of both compartments. By contrast, the Quasar's straps only impede access to the main compartment, making access to this organized compartment far easier than on the Borealis.

IMG_4775.jpg IMG_4774.jpg

Finally, we come to the cavernous main compartments. Both bags have plenty of room here for you to load them up however you see fit. Here, though, the Borealis is the more spartan of the pair, with just a single, fairly plain laptop pocket with no additional padding. Even then, this slot was a disappointment, barely capable of holding my 13" Macbook Air clad in a neoprene sleeve. The Quasar shines here, including not only a padded laptop sleeve, but a second slim pocket for papers or a notebook, and a zippered mesh pocket that's great for power cords and video dongles. It was a breeze to insert or remove my Air, neoprene sleeve and all, and that mesh pocket is just the right size for my 7-inch Grid-It organizer. The Quasar wins here, and it wins by a lot.

IMG_4766.jpg IMG_4778.jpg IMG_4779.jpg

I don't have photos of the next bit, but I zipped both bags shut and sprayed them with water from a spray bottle, with particular emphasis on soaking the zippers themselves. Both bags admitted a little water, but the Quasar's zippers fared noticeably better than those on the Borealis. I was planning to get a rain cover regardless of which bag I selected (and I'm glad I did, because I needed it on a soaker of a night in London!) so this wasn't a big deal, but was definitely a point in the Quasar's favor.

At this point I was still vacillating between the two bags, mainly because of how both bags were great at one compartment but not at both. The deciding factor turned out to be something I can't capture in pictures: the carry. The feel of the bag, properly fitted and holding a typical load, on my body. The Borealis has much thicker padding for your back, but both that padding and the straps felt much stiffer than the Quasar. I'm sure that the Borealis would improve with time, or that I'd get used to it, but I was a little over a week out from flying to the UK, so that was time I didn't have. By contrast, the Quasar felt broken in from the moment I put it on. The straps were just right, and the padding didn't press into my back in weird ways like the Borealis did. So the Borealis went back to the warehouse and the Quasar went with me to England and Wales, where it performed marvelously.

I was so pleased with the Quasar that I've since picked up similar Osprey bags for my wife and daughter: the Questa for Liz, better fitted to feminine anatomy, and the Pogo for the kiddo, because the other child bags lacked the waist strap. The Pogo in particular has been nothing short of a miracle for the kid; the sternum and waist straps mean that she can carry her bag through the airport without complaint. As a parent, this is huge.

Ultimately, though, both of these bags are great choices, and I am not at all surprised by how many of each bag I've seen at tech conferences in the past year. It's a lot like the photographer's dilemma of choosing Canon or Nikon--it's hard to go wrong with either one, but you should try them out and decide for yourself.

Good luck, and happy daypacking!

Read and Post Comments

I Should Maybe Blog Sometime

Is this thing still on?

Gosh, I should maybe blog sometime. I actually do have a couple things that I've been meaning to write about, and it's a little embarrassing that I've barely posted a handful of updates over the past four years. FOUR YEARS!

So... Stay tuned, I guess, and we'll see how poorly this post ages.

Read and Post Comments

Text Me Maybe: Smarter Real-World Integrations with Python

Gosh, it's been a year since I last posted! Let me try to make it up to you...

I took some existing talks on the road last year (to CodeMash, PyCon, and OSCON!) but I've once again put together something new for PyOhio.

So my family likes to know when I'm on the way home from work, but I'm lousy at remembering to text or call before I leave. Some basic "out of the box" geofencing solutions are available, but none of them are smart enough to understand situations like going to lunch where sending a "coming home" message wouldn't be appropriate. Luckily, we can assemble our own solution pretty quickly and cheaply with Python at the core, and we don't even have to run our own servers to do it!

In this talk I showed how I created a cloud-hosted, location-triggered SMS notification service with some decision-making smarts by combining IFTTT (If This Then That), AWS Lambda, Twilio, and just the right amount of Python.

The talk seemed to go really well, and I have been flattered and humbled by the volume of positive feedback I got about it. I hope it will inspire you to go have some fun making your smart things a little smarter.

Here are the slides:

Unfortunately there's no video due to a variety of AV issues, so you'll either need to use your imagination or convince the PyCon program committee to accept it for 2017. ;-)

And who knows, maybe I'll start posting more often (hahahaahhahaahahahahahahaha *wipes away tears* whoooo wow, who am I kidding?).

Read and Post Comments

Using Python to Get Out the Vote

After taking a year off from PyOhio due to a scheduling snafu (off-by-one errors apparently aren't just for software), I was delighted to be back this year, and with a fresh talk to boot.

This spring, I helped my wife with the data munging aspect of a school levy get-out-the-vote campaign. We mashed up school directory data with Ohio voter registration records to produce targeted contact lists for phone calls, mailings, and door-to-door visits, reducing redundant contacts and eliminating wasted contacts.

The technology involved is pretty straightforward, involving a little bit of Python and some pretty basic SQLAlchemy and Alembic (in fact, it was my first serious dive into both SQLAlchemy and Alembic).

The talk seemed to go pretty well, and I had some great conversations about it afterwards. Hopefully it will be inspiring or at least of some value to folks looking to do some useful things with Python.

Here are the slides:

And you can watch the video too.

Read and Post Comments

PyCon 2016 Dates

I blanked on the dates for PyCon 2016 the other day, and Google was strangely silent on the subject, so here, for your reference (and my SEO benefit), are the dates for PyCon 2016:

  • Tutorials: May 28–29, 2016
  • Conference: May 30–June 1, 2016
  • Sprints: Starting June 2, 2016

This means the tutorials will be over a weekend, and the conference will be during the week instead of the other way around, and it'll be a holiday weekend. I'm looking forward to finding out what this does to the dynamic of the conference.

Hopefully I'll see you there--if I can remember the dates, that is.

Read and Post Comments

Next Page »