351 members
2 photos
1 video
1 file
297 links
python, go, code quality, magic

1. Крутые библиотеки и инструменты.
2. Магия питона.
3. Интересные техники и паттерны проектирования.
4. Ревью, CI, тестирование и сопровождаемый код.

@orsinium

life4web.ru
Download Telegram
to view and join the conversation
Кончилось место на харде? Не беда! Просто сохрани часть документов в кэше DNS 😁
https://github.com/benjojo/dnsfs
Паттерны проектирования на питоне:
https://github.com/faif/python-patterns
Главное достоинство этого репозитория - более-менее pythonic-код. А то от большинства книг по структурам данных, алгоритмам и паттернам на питоне возникает ощущение, что автор 30 лет писал на си, а накануне написания книги открыл учебник по питону для чайников. Правда, тут тоже местами есть несущественные ошибки, но это лишь отличный повод внести свой вклад в развитие open source ;)
Ставшая уже классической лекция Ричарда Хэмминга о великих мыслях и важных делах:
https://habrahabr.ru/post/209100/

В моём персональном рейтинге Ричард Хэмминг бесспорно входит в топ-3 величайших людей 20 века, наравне с Джоном фон Нейманом и Аланом Тьюрингом. Поэтому несложно поверить, что он знает, о чём говорит.
Статья месяца на хабре:
https://habrahabr.ru/company/ruvds/blog/346442/
Спойлер: это всё только в теории, фантазии автора. Хотя, вероятно, на практике это везде и всюду, просто мы не замечаем.

Ну и раз такая тема, можно вспомнить ещё пару материалов о пакетных менеджерах.

О глупых зависимостях в npm пакетах:
https://habrahabr.ru/post/307822/

А вот тут уже реальный анализ безопасности всех npm пакетов:
https://habrahabr.ru/company/ruvds/blog/335602/

А вот тут автор пытается изменить ситуацию, добавив контроль за правами доступа пакетов:
https://habrahabr.ru/post/336334/

Некоторые говорят о необходимости модерируемого репозитория, по аналогии с Apple store, но, очевидно, это породит цензуру, которые многие не захотят принимать. Примеры уже были:
https://habrahabr.ru/post/299650/
ITGram
Статья месяца на хабре: https://habrahabr.ru/company/ruvds/blog/346442/ Спойлер: это всё только в теории, фантазии автора. Хотя, вероятно, на практике это везде и всюду, просто мы не замечаем. Ну и раз такая тема, можно вспомнить ещё пару материалов о пакетных…
Если кто-то не понял, вторая статья (про зависимости) тоже шуточная. В интернета вообще нельзя кому-то верить. Правда, фотку Гая Фиери (https://en.wikipedia.org/wiki/Guy_Fieri) в Babel реально добавили, но уже после публикации статьи:
https://github.com/babel/babel/commit/f36d07d30334f86412a9d2771880cb566a82a9b6
Вот такой вот чёрный пиар :)
Курсы по питону, которые я постоянно всем рекомендую:
https://www.youtube.com/playlist?list=PLwwk4BHih4fjnBhqvYFvPxP5quUXR1CMj

Материал охватывает довольно много тем, от самых основ и до чёрной магии, поэтому подойдёт как начинающим магам, так и уверенным мидлам. Я пересматривал несколько раз, на разных этапах миропонимания :)
Спите? :) Сегодня у нас увлекательное чтиво о фичах питона, о которых обычно не успевают сказать в курсах "питон за три дня":
https://stackoverflow.com/questions/101268/hidden-features-of-python

Сообщения там по умолчанию отсортированы по количеству голосов. Шутки шутками, а есть немного действительно нетривиальных вещей. Правда, начиная с середины второй страницы, находить их становится действительно сложно, да и повторы есть. В общем, первые две-три страницы must read.

Если кто-то хочет немного отдохнуть от английского, на хабре есть перевод части ответов:
https://habrahabr.ru/post/123821/
Яндекс привёз нам новый мир,
Яндекс привёз кокаин:
https://tech.yandex.ru/cocaine/

Cocaine - open source технология для построения своего облако. Там сбоку есть ссылки на интересные статьи с хабра по теме, рекомендую.

Признаться, я представлял облака исключительно как IaaS, и идея развернуть собственное облако для своих проектов для меня нова. Но звучит она чертовски вкусно за счёт идеи динамического выделения ресурсов. Позвольте наглядно: есть Интернет-магазин, в котором утром завозят товар, днём делают заказы, вечером проводят кассы, а ночью агрегируется статистика. И на каждом этапе работает отдельный компонент, которому нужно выделить побольше ресурсов. Или же есть много проектов, и не понятно, какой из них взлетит. Вот для этого и нужна динамическая расширяемость.

Важно отметить, что облака имеют смысл только при большом количестве серверов. Если же сервер один, ОС сама спокойно разрулит ресурсы между процессами.
Шпаргалка по навигации по строке ввода в терминале.

А днём постараюсь сделать материал по переводу Django-проекта на практике. Для меня это сейчас особо актуально)
Пару ссылок о том, как переводить приложения на Django.

Перевод оф. документации про перевод:
https://djbook.ru/rel1.9/topics/i18n/translation.html

Гайд Read the Docs по переводу приложений:
http://docs.readthedocs.io/en/latest/i18n.html
То же, что оф. документация, но более кратко.

Подсветка в шаблонах переведенных строк:
https://github.com/machinalis/django-i18n-helper

Скрипт для поиска непереведенных строк в шаблонах:
https://github.com/rory/django-template-i18n-lint

Приложение для перевода полей моделей:
http://django-modeltranslation.readthedocs.io/en/latest/

И да, лучше об интернационализации задуматься сразу при старте проекта, а не откладывать на потом. Выделение переводимых текстов должно быть непрерывным процессом, проходящим через весь процесс разработки.
Немного чёрной магии питона:
https://github.com/satwikkansal/wtfpython

Если у вас в коде возникла подобная ситуация, либо вы хотите использовать что-то из этого как фичу - лучше выкиньте этот код и перепишите всё нормально, пока это не зашло слишком далеко.
Forwarded from DevBrain
Нашел в сети шедевральный awesome-список — awesome-scalability. Кладезь для тех, кто хочет погрузиться в тему масштабирования приложений и data engineering. Советую добавить к себе в watch-лист на гитхабе и поставить звезду, чтобы следить за обновлениями.

А ещё, Brandon Rhodes у себя в твиттере объявил о том, что каждую неделю он будет писать на сайте http://python-patterns.guide/ про новый дизайн-паттерн на Python. Уже есть 1 пост про Decorator Pattern.

Также в сети стали доступны доклады с прошедшего митапа San Francisco Python. Из всех стоит отметить основательную презентацию новой фичи в предстоящем релизе Python 3.7 — Data Classes от Raymond Hettinger. Смотрим.
Прекрасное выступление о том, как выучить что угодно за 20 часов:
https://ed.ted.com/on/Imq14bHp

Есть субтитры. Где-то на ютубе есть закадровый перевод от Верт Дайдера, но так теряются интонации оратора.
Доброе утро. Вчера поста не было. Я решил посвятить 20 часов своей жизни (это в тему предыдущего поста, да) на изучение Pathfinder Core Rulebook'а. Поэтому сегодня будет нормальный такой пост :) Речь пойдёт о контрактном программировании.

Статья о самой концепции:
https://habrahabr.ru/post/38612/

А теперь, как всегда, пару реализаций концепции в питоне.

1. PyContracts. Условия задаются в своём особом синтаксисе в виде строк. Довольно интересный подход. Позволяет писать условия кратко и ёмко, в виде этаких схем. Правда, как результат, IDE такое не подсветит, да и нормальные схемы (типа marshmallow и PySchemes) без боли не использовать.
https://andreacensi.github.io/contracts/

2. Pycontract. Автор этого модуля пошёл ещё дальше и реализовал модуль, который позволяет описывать контракты в docstring'ах, также в своём синтаксисе. Причём он подошёл серьезно и написал PEP с предложением включить это в стандартную библиотеку питона. Если бы это приняли, IDE умела бы это подсвечивать. Но нет.
PEP: https://www.python.org/dev/peps/pep-0316/
Модуль и примеры: http://www.wayforward.net/pycontract/

3. Ок, я перерыл около 30 модулей, пытающихся реализовать контрактное программирование в виде обычных декораторов, хавающих в качестве контрактов любые функции. Но они все недостаточно хороши. То в качестве исключения поднимают Exception, то не реализуют инвариант, то работают только с какими-то своими сложными интерфейсами валидаторов, без возможности задать обычное lambda-выражение... В общем, встречайте почти идеальный модуль. Возможно, первый, у которого внутренности сделаны в терминах ООП, а не жуткой функциональщины, в которой и автор, вероятно, уже не ориентируется.
https://github.com/orsinium/deal

Используйте, исследуйте, ставьте звёздочки :)
P.S. В планах осталось только update_wrapper подружить с тем, что я возвращаю не функцию, а метод. Это будет в версии 1.2.
Вчера состоялся релиз Python 3.7:
https://docs.python.org/3.7/whatsnew/3.7.html
Куча новых интересных фич, в том числе и некоторые штуки во future для версии 4.0.

Для тех, кто пропустил слишком много, вот список интересных фич третьего питона:
https://github.com/arogozhnikov/python3_with_pleasure
Тут не всё, конечно же, так что лучше смотреть в release notes по каждой версии.
Сегодня у нас что-то интересное. А именно, визуальный язык программирования:
http://www.luna-lang.org/

Создаём ноды, задаём для них параметры, соединяем их линиями. Ноды превращаются в блоки кода, линии - в вызовы. Внизу экрана пишется код, рядом с нодами отображается результат. Написано это на haskell в виде плагина для atom. Пока что это всё только в разработке, поэтому глючит и неимоверно жрёт ресурсы.

Рекомендую попробовать, хотя бы посмотреть встроенные примеры. Это формирует немного иной взгляд на код.
Любите JS? Можете не отвечать, я знаю, что да. Сегодня мы поговорим о промисах.

Отличный материал на русском:
https://learn.javascript.ru/promise

Спецификация:
https://promisesaplus.com/

Ну и, конечно же, виновник сего парада - промисы в питоне:
https://github.com/syrusakbary/promise

Если кратко о сути, это такой механизм написания асинхронного кода, который вызывает коллбэк, когда так или иначе заканчивает выполнение.

Пример того, как это всё работает (постарался делать строки покороче, чтобы было проще читать):


def ok_func(result):
print('ok', repr(result))

def fail_func(result):
print('fail', repr(result))

test = lambda resolve, reject: resolve('good')
p = Promise(test)
p.then(ok_func, fail_func)
# ok 'good'

test = lambda resolve, reject: reject('bad')
p = Promise(test)
p.then(ok_func, fail_func)
# fail AssertionError('A promise was rejected with a non-error: bad',)


Когда исполняется строчка Promise(test), функция уже асинхронно вызывается. Далее мы через .then указываем колбэки resolve и reject. Колбэк срабатывает сразу, как выполняется оба условия:
1. Функция, переданная в promise, вызвала нужный колбэк.
2. Для промиса с помощью .then был указан нужный колбэк.

Важно отметить, что даже после вызова колбэка код продолжает выполняться:

def test(resolve, reject):
resolve('good')
print('lol')

p = Promise(test)

Тут уже будет выведено "lol", несмотря на то, что колбэк ещё даже не указан. Так что во избежания черной магии лучше после вызова колбэка ставить return.
Мне нужно пару дней поправиться после сотрясения, поэтому постов в ближайшее время не будет. После этого обещаю кое-что масштабное. Ну а пока что вот вам идеальный репозиторий:
https://github.com/kelseyhightower/nocode
Надёжный, как швейцарские часы.

UPD: Смотрите, есть даже поддержка windows:
https://github.com/kelseyhightower/nocode/commit/80f38e0f103487fc37d853a98a580c67b4db7b55
Сегодня будет первый пост в новом формате:
1. Нормальные markdown-ссылки
2. Публикация постов в обед, а не когда все спят.

Ну и, как обещал, тема сегодня будет масштабная. Поговорим про функциональное программирование. А именно про функторы и монады.

1. Функторы, аппликативные функторы и монады в картинках
2. Зачем нужны все эти функторы и монады?

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

Ну ладно, я до сих пор не сказал ни слова про Haskell. На самом деле, все эти концепции наиболее ярко выражены именно там, т.к. лежат в основе философии самого языка. Но ему пост будет посвящен чуть позже. А пока, по традиции, реализация на Python: OSlash. Примечательна эта библиотека тем, что имеет в своей wiki несколько интересных статей:
1. Functors, Applicatives, And Monads In Pictures — форк оригинальной статьи, перевод которой в начале этого поста, но с примерами на OSlash.
2. Three Useful Monads — следующая статья из этой серии, также с примерами на OSlash.

Ну и, конечно же, важный дисклеймер: не надо применять это в питоне. Вот серьезно. OSlash — не более, чем учебный познавательный пример. О полезных функциональных библиотеках для Python я уже писал ранее, а также про это будет ещё два поста. А вот функторы и монады - не надо. В то же время очень рекомендую разобраться в этом всём, чтобы расширить сознание, сломать мозг и научиться смотреть на код немного по другому (с потаённым страхом, ага).

Берегите себя и свои программы)
Сегодня у нас в эфире довольно интересная статья про использование nmap из журнала xakep:
Прокачай свой nmap

Nmap — потрясающий сетевой инструмент, этакий швейцарский нож. Признаться, я и не слышал о каких-то альтернативах: почти все сетевые инструменты под капотом используют nmap. Разве что есть Zmap, но название таки намекает на источник вдохновения :)

Кому хочется больше информации — nmap reference guide в помощь, а также man nmap (одна из лучших man-страниц, которые я видел). Есть и на русском.
Те, кто смотрел моё выступление, заметили, что большую часть времени я говорил не о бутербродах, а о хорошем коде. Просто эта тема становится по-настоящему волнующей, когда приходится довольно много копаться в чужом коде. Так что вот пару простых правил (и инструментов), что делать, когда нужно из плохого кода сделать конфетку:

1. Сначала натравите на код yapf, чтобы всё было в соответствии с PEP-8 или другими стайлгайдами.
2. Создайте .editorconfig и прикрутите его к своей IDE, чтобы у всех код форматировался одинаково.
3. Прикрутите flake8 к своей IDE, ну или хотя бы запускайте его перед каждым коммитом. И исправляйте каждый warning! Без вариантов. В каких-то редких случаях, когда нужно вот именно так и никак иначе, помечайте строку тегом noQA.
4. Никогда не полагайтесь на yapf и прочие инструменты в плане форматирования вашего кода. Эти инструменты без души, им не понять как в каждом конкрентном случае будет наиболее удобочитаемо. Это всегда должно быть заботой разработчика.
5. Комментарии, докстринги, тесты. Это главное.

Да прибудет с тобой чистый код.