zemlan.in

Заброшенное в карантин: Pepperoni

Слишком много времени, слишком мало терпения

Если убрать из жизни дорогу на работу/с работы, «пойти в кафе», и «поехать в центр, чтобы повидаться с друзьями», то остаётся много свободного времени. Полностью занимать его «поглощением контента» (будь то кино/сериалы, книги, подкасты, музыка…) кажется нездоровым, игр надолго не хватает, звонки «как жизнь? — по большому счёту, так же, как и последние пять месяцев1» быстро надоедают…

Так что мой выбор яда хобби — это делать то же самое, что на работе, но для себя. А так как для себя, то больше никому не надо чтобы я довёл дело до конца2

Например, никто не будет подталкивать добить до конца выступление для митапа, который должен был пройти в марте

Proxet on Twitter
Proxet on Twitter
Rails Reactor is happy to announce the upcoming Python Tonight.
SPEAKERS:
👨‍💻Vitaliy Radchenko - Intro to Apache Airflow
👨‍💻Anton Verinov - Cook with What You Have
👨‍💻Denys Serhiienko - Optimization. A little adventure.
Need to register https://t.co/NAEEzkW6wN

или дописать-таки кучу слов про code review

Half outlined and half ready-ish. This is gonna loooong…

или причесать вроде юзабельный (хоть и довольно бесполезный) side project для публики

Но всё это можно похоронить заморозить в бложек. Авось даже в сыром виде оно кому-то пригодится

Начну с выступления для Python митапа…

Pitch

Суть: сделать что-то полезное исключительно средствами стандартной библиотеки Python

Почему: легче разворачивать, распространять, меньше поддерживать (потому что меньше обновляемых частей)

Что делаем: мониторинг веб-страниц на обновление. Юзер вбивает ссылку и опциональный фильтр для данных, а скрипт периодически пингует страницу и уведомляет об изменениях

Структура выступления: преподнести процесс написания скрипта как процесс готовки еды, с модулями как ингредиентами. Наиболее подходящим “блюдом” показалась пицца

На что хватило?

Сил и времени перед отменой митапа хватило на написание outline’а и самого скрипта, который даже пригодился когда ждал замены батарейки в телефоне:

По outline’у, все импорты разделил на четыре группы:

# spices
import os
import time
import platform

# sause
import re
import difflib
import textwrap
import html.parser

# meat
import urllib.request

# dough
import logging
import argparse
if platform.system() == "Darwin":
    parser.add_argument(
        "--sound",
        "-s",
        dest="mac_sound",
        default="pop",
        # `ls /System/Library/Sounds/`
        choices=[
            "basso",
            "blow",
            "bottle",
            "frog",
            "funk",
            "glass",
            "hero",
            "morse",
            "ping",
            "pop",
            "purr",
            "sosumi",
            "submarine",
            "tink",
        ],
        type=str,
        help="sound to play (macOS only)",
    )
if mac_sound:
    os.system(
        f"afplay /System/Library/Sounds/{mac_sound.title()}.aiff 2> /dev/null"
    )
else:
    print("\a", end="", flush=True)

Кроме этих четырёх ингредиентов, хотел упомянуть что в стандартной библиотеке есть «кухонные приборы» — модули вроде doctest, которые упрощают разработку:

def query_html(html, query, regex):
    """
    >>> html = "<ul><li>A</li><li id='b'>B</li></ul><ol><li>C</li><li class='d'>D</li></ol>"
    >>> query_html(html, "li", None)
    'A'
    >>> query_html(html, "#b", None)
    'B'
    >>> query_html(html, "ol li", None)
    'C'
    >>> query_html(html, ".d", None)
    'D'
    >>> query_html(html, "ul li", "B|X")
    'B'
    >>> query_html(html, "ol li", "B|X")
    """
    if query:
        html_parser = HTMLParser(query, regex)
        html_parser.feed(html)
        return html_parser.match
    elif regex:
        match = re.search(regex, html)
        if match:
            return match.group(0)

    return None

После всего этого кода, в качестве outro, сказал бы о штуках, которых не хватает (вроде форматтера и хоть какой-то работы с изображениями), плюс отметил бы что

Конечно, в PyPI можно добыть ингредиенты покачественнее:

  • re -> regex
  • argparse -> click
  • urllib.request -> request
  • html.parser -> BeautifulSoup

Но и стандартного набора более чем достаточно для вкусного блюда

Исходники всего скрипта доступны на гитхабе и здесь

Спасибо, что дочитали до конца


  1. Уже пять месяцев?.. Чёёёёёрт… ↩︎

  2. Или не забросил начинания как, честно говоря, забросил готовку дома. Ну, то есть, готовлю чаще, чем в "Before Times", но намного меньше, чем в момент написания той заметки ↩︎

  3. или «мясо + сыр», или «протеин»… ↩︎