Linux на современном десктопе

Выходные провел за обкаткой нового ПК под разными линуксами. ПК самый обычный: Intel 9600K, 16G ram, видео RTX 2070 и монитор 144Hz. Все завелось отлично, за исключением проблем с Nouveau (который вообще надо заблеклистить и исключить из поставки автоматически).

Список выводов которые я для себя сделал, перепробовав несколько вариантов:

  • Archlinux – я уже слишком стар для этого добра :(. Несколько лет назад с удовольствием ставил Arch и наслаждался отсутствием всего лишнего в своей сборке. Сейчас же хочется стабильной, надежной, поддерживаемой системы.
  • Fedora KDE – классная система и отлично подходит для дома. Серьезно, хоть какое-то ощущение “целостной, поддерживаемой системы”, заместо “набора странных временных решений”, пусть и пока на XServer, с этим смирился.
  • Wayland + Nvidia RTX – пока настроишь – пройдут все выходные. Проще временно отказаться от Wayland в пользу XServer (а точнее того, что другие уже сконфигурировали за тебя в дистрибутиве).
  • Nouveau + Nvidia RTX – это полная жесть, nouveau подтягивается автоматом даже в Live-режиме Арча и Федоры, и это ломает запуск системы (все виснет на запуске Journald). Чтобы запуститься хоть как-то приходится добавлять руками параметр nomodeset, блеклистить nouveau, и только потом настраивать систему.

Запускаем тесты параллельно и стабильно

Предположим, есть ситуация.

  • У вас есть проект с тестами, тесты идут долго и хочется их ускорить.
  • Вы распараллеливаете тесты на несколько рабочих процессов, они начинают работать быстрее, но периодически падают. А хуже того, единично запущенный упавший тест-кейс успешно проходит.

Что делать?

Continue reading

Выгружаем код из MacOS / Linux в DEV-облако

Часто не хочется запускать свой проект локально, т.к. батарейка садится, мак греет колени, жужжит и вообще тратит ресурсы. Куда удобнее запускать свой код в облаке.

Но как выгрузить свой код в облако?

Continue reading

Сравниваем структуры без учета порядка

Часто там нужно сравнивать одни части структур упорядоченно, а другие без учета порядке. Например, когда из API возвращается список с неупорядоченными значениями. Причем эти значения могут быть глубоко-глубоко внутри вложенного объекта.

class MyTestCase(unittest.TestCase):
    def test_one(self):
        data = make_request(...).json()
        self.assertEqual(data, {
            'root': {
                'sub': {
                    'items': ['a', 'b', 'c']
                }
            }
        })

Этот тест может падать, если на сервере структура items порождена, например, из set() или dict().values(). Что с этим делать? Предлагаю вот такое элегантное решение!

Continue reading

Пакетизируем PIP в RPM оперативно

Недавно в рамках задачи “сделать множество своих пакетов” с зависимостями проекта сделал вот такой вот скриптик.

Скриптик умеет упаковывать в RPM пакет указанный PIP пакет, корректно прописывать зависимости и добавлять префикс к имени.

Continue reading

Производительность собранного Питона

Сегодня пересобирал CPython 3.7 разными компиляторами под CentOS 7 в попытке приподнять его производительность.

Удивительно, но первая версия Python 3.7, собранная мной ранее со всеми оптимизациями, прогоняла наши тесты неприлично медленнее, чем Python 2.7 из поставки CentOS 7.

Python37, собранный мной с GCC 4.8.0 (CentOS bundled)
Параметры сборки: -march=x86_64 --enable-optimisations --with-lto
Ran 203 tests in 380.523s

Python27, входящий в стандартную поставку CentOS 7
Ran 203 tests in 288.164s

Вот что получилось из этого эксперимента.

Continue reading

Порядок элементов set-ов в Python

Проверьте себя, предположите, что выведет print?

list_1 = list(set([u'external_new', u'external', u'app_store']))
list_2 = list(set([u'app_store', u'external', u'external_new']))
print list_1 == list_2

А теперь проверьте себя еще раз

list_1 = list(set([u'external_new', u'external', u'app_store'] + range(100)))
list_2 = list(set([u'app_store', u'external', u'external_new'] + range(100)))
print list_1 == list_2

На самом деле, такое поведение очевидно, достаточно вспомнить, что внутри cPython set – хеш-таблица с открытой адресацией. Если количество элементов set-а приближается к количеству элементов внутреннего массива хеш-таблицы, вероятность коллизий повышается. В случае появления коллизий, преобразование set-а в список будет выдавать элементы коллизий в той последовательности, в которой эти элементы были добавлены в set.

Отладка на Python: способы и фишки

Отладка – один из важных этапов разработки ПО. Есть много определений этого термина: начиная от “процесса нахождения ошибок на этапе разработки и их устранения”, до “убеждения, что алгоритм исполнения программы соответствует ожиданиям”.

Процесс отладки неминуемо следует за кодированием. Крайне рекомендуется проходить отладчиком по всему коду хотя-бы один раз после кодирования, ведь даже в самом простом коде могут быть ошибки. А если код сложнее

def my_function():
    pass

то пройти по нему отладчиком даже необходимо и жизненно важно.

Continue reading

Trinder – Chrome клиент для Tinder

Наверное, многие видели приложение Tinder. Не секрет, что с ПК им пользоваться нельзя, а есть только мобильная версия.

В развлекательных целях сделал Chrome-extension Trinder для этих целей: Chrome Webstore и GitHub.

В процессе научился перехватывать SSL-трафик с Android-устройства чтобы выяснить интерфейс REST-api у Tinder. Знаю, что есть отладочные прокси, например Fiddler, но это мне показалось слишком частным случаем и хотелось уметь перехватывать именно SSL-траффик (в том числе и HTTPS).

Continue reading