anetto1502

anetto1502

Канал про разработку на python и не только https://t.me/+0JMEYBjpMDJiYTMy
На Пикабу
Дата рождения: 29 августа
14К рейтинг 108 подписчиков 146 подписок 64 поста 25 в горячем
Награды:
За участие в Авторской неделе5 лет на Пикабу

Ответ на пост «Некоторые мужчины умеют быть убедительными !!!»2

Не мог пройти мимо узнаваемых интонаций :) Оказывается, в КВН была сценка по мотивам фильма из заголовка. С 4:00 сценка "парень спалился перед девушкой, но до последнего пытается выкрутиться из сложившегося положения". Очень смешно отыграно.

Ссылка с таймкодом.

Кстати, всё выступление очень достойное. Сценки:

1. Парочка, которая аж бесит

2. Человек-дождь (по мотивам супермена, которого в очках никто не узнаёт)

3. Парень спалился перед девушкой

4. Дамблдор подсуживает Гриффиндору. "За добрые дела и обворожительную улыбку Гарри Поттер получает 200 очков".


Пишу в телеграм-канал для python-разработчиков и не только. По пятницам у нас культурный код — фильмы, книги, комиксы, мемы. Сегодня вспоминали первые обзоры BadComedian

Показать полностью
86

Не копируйте примеры кода сразу в терминал

Некоторые ресурсы при копировании текста с сайта вставляют в буфер обмена ссылку на себя. Например, такое поведение будет при копировании первого абзаца со страницы КонсультантПлюс.


Как это технически работает?


В JS можно на событие copy навесить свой обработчик, который что-то модифицирует. Есть более современное Clipboard API.

Этот функционал позволяет осуществить атаку на целостность данных через манипуляцию с содержимым буфера обмена. Результат - страничка, где написано


echo "not evil"

Теперь скопируйте этот фрагмент и вставьте в терминал. Поздравляю, вас хакнули. В терминал вставился другой текст

echo "evil"

Не копируйте команды сразу в терминал. Лучше перепечатать (так ещё и запомнится лучше) или идти по пути сайт — блокнот — анализ глазками. Копировать без переноса строки тоже не поможет — наглый js может вставить в буффер символ переноса строки. В итоге безопасное

pip install -U pytest

Может сделать с вами что-то злобное. Не всегда об этом можно узнать. Команды в терминале, которые начинаются с пробела, в истории команд не сохраняются. Если вывод команды достаточно длинный (установка пакета для python является хорошим примером), то вы даже не увидите настоящую введенную команду.


А ещё так можно модифицировать ваш .bashrc, сделав любой alias.


В телеграм-канале разбираем разные нюансы из жизни разработчика на Python и не только — python, bash, linux, тесты, командную разработку.

Показать полностью
64

Ковыряем атаку forkbomb на bash в docker

Есть такой вид атаки на отказ в обслуживании (DoS, Denial of Service) — forkbomb. Запускается процесс, который бесконечно порождает сам себя, пожирая все ресурсы системы. Прав суперпользователя не требуется, любой пользователь может создавать процессы.


Cкрипт атаки выглядит так. Функция порождает две версии себя, связанные конвейером. Правая функция уходит в фоновый режим с помощью знака амперсанд &.

forkbomb()
{
forkbomb | forkbomb&
}

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

:(){ :|:& }; :

Такой набор символов эквивалентен скрипту выше. При этом он компактен, и его могут запихнуть вам в качестве шуточного ответа на вопрос. Спасибо ещё, что не патч Бармина.


В видео также рассматриваются линуксовые команды команды

1. lscpu

2. nproc

3. uptime

4. top

5. free

6. переменные $$ $PPID

7. настройка числа PID в /proc/sys/kernel/pid_max

8. ctrl-L для очистки терминала

9. разделение экрана в терминале terminator

10. буфер выделения и вставка по нажатию на колёсико мышки

11. pkill


И разбираются флаги такой docker команды

docker run --it --rm --cpus="0.5" --memory=4G --pids-limit=1000 --name=forkbomb ubuntu bash

Плюс применяются команды docker ps / stats / exec.


Хотите почувствовать себя капитаном тонущего корабля? Теперь ресурсы системы принадлежат не вам, а паразитному процессу forkbomb. Приятного просмотра!

Починить атакованную систему можно только перезагрузкой. Ну, если атакующий скрипт вам не дописали в .bashrc. Тогда только recovery mode в grub.


В телеграм-канале разбираем разные нюансы из жизни разработчика на Python и не только — python, bash, linux, тесты, командную разработку.

Показать полностью 1
47

Закон дырявых абстракций и GIL в python

Давным давно Джоел Спольски рассказал о "законе дырявых абстракций" (оригинал от 2002 года). В современном мире, чтобы починить проблему, часто надо уметь работать на уровень ниже текущего уровня абстракции. Проблема может быть с compose, docker, конкретной библиотекой, python, операционной системой, сетью, железом... Чем больше абстракций вы знаете, тем больше вероятность, что вы сможете решить проблему следующего уровня.


Нельзя в один момент освоить десяток нужных инструментов и абстракций. Нужно плавно расширять используемый инструментарий. Освоили git? Ни строчки кода далее без него. Научились тестам? В каждом проекте их нужно писать с самого начала. Теперь Docker в копилке? Применяем, если это уместно. Чем больше опыта в разных технологиях, тем вы сильнее как специалист.


Расскажу о своём опыте. В статье как расширить технический кругозор я делился, что для ориентирования в технологиях я постоянно читал хабр (2010-2015 года, самый расцвет технического контента там). Пришёл ко мне коллега со следующим вопросом. Я, говорит, выгружаю строю граф друзей в социальной сети, для этого массово скриптом на python выгружаю оттуда списки всех друзей и складываю в mongodb. Запускаю выборку на N человек на 1 потоке — скрипт работает 60 секунд. Запускаю на 10 потоках — скрипт работает 70 секунд. Мне надо N увеличить и запуститься на сутки, но какого чёрта увеличение числа процессоров замедляет выполнение?  Где проблему искать?

Это питон тормозит?

В монге проблемы?

С компом что-то не так?

Социальная сеть меня банит?

Сеть тормозит?

Где вообще искать беду?


А я просто знал ответ. Прочитал накануне статью про GIL в python. На вики она выглядит так. Если кратко, то из-за потоковой небезопасности кода на Си, который внутри всех стандартных библиотек питона, интерпретатор физически работает на одном ядре, а многопоточность реализована с блокировками. Это не важно для IO-bound задач (когда код ждёт внешних данных), но критична для CPU-bound задач (когда реально надо все ядра использовать).

Для починки всего-то и надо, что заменить модуль многопоточности threading.Thread на многопроцессность multiprocessing.Process. Теперь работают 10 независимых процессов, которые делают своё черное дело. У них нет связи (общего адресного пространства), которое есть у потоков. Но в этой задаче связь и не нужна была, процессу выдавался пул адресов для анализа.

И теперь 60 секунд на 1 ядре превратилось в 10 секунд на 10 ядрах. Да, не в 10 раз ускорилось, но это вполне годное ускорение. А ещё можно посмотреть, как делают рядом и воспользоваться топовым инструментом.


В телеграм-канале разбираем разные нюансы из жизни разработчика на Python и не только — python, bash, linux, тесты, командную разработку.

Показать полностью
16

Как анализировать предметную область перед разработкой на примере видеоаналитики

Хочу поделиться с разработчиками своим опытом научного поиска. Изобретать велосипед хорошо только в учебных целях. Но весело :)


Любая работа по программированию начинается с анализа предметной области. Надёжнее всего использовать материалы из рецензируемых научных изданий (отечественные ВАК и РИНЦ, зарубежные WebOfScience и Scopus — напрямую из РФ недоступны). Наличие рецензирования обычно позволяет отбросить плохие статьи, что в целом повышает качество оставшихся статей. Могу порекомендовать для русского и английского поиска такие ресурсы


Киберленинка — open science платформа

ResearchGate — соц сеть для учёных (англ).

Google.Академия — сбор знаний отовсюду

ArXiv — сборник препринтов, то есть незавершённых исследований


Мне меньше нравятся, но тоже хороши:


eLibrary — собственно, сам РИНЦ

IEEE Xplore

Semantic Scholar

Springer


У большинства современных рецензируемых статей есть DOI. Отсутствие не страшно, но в современном мире удивительно.


В начале ищутся самые популярные статьи, потом следует подкрутить фильтры и взять самые свежие (не старше 5 лет, не старше 3 лет — зависит от области знаний). Большую часть усилий стоит сосредоточить на англоязычных источниках, там самый свежий и актуальный материал.


Если статья интересная, но отсутствует в открытом доступе, можно погуглить "название статьи filetype:pdf" в гугле. Нередко так можно найти PDF от автора, препринт или статьи, которые на искомую ссылаются.


Видео примеры по тегам можно искать по размеченным видео с ютуба.


Интересные рассмотренные статьи необходимо заносить в список с небольшой аннотацией. Такой список позволит в большей степени понимать и ориентироваться в предметной области. и синхронизировать усилия нескольких людей. Например,


1. <ссылка>. Работа на "хорошо". В работе есть данные по нейросети, которая с 80% точностью распознаёт человека в маске. Ссылка на программу есть, на датасет нет. Напрямую применить нельзя, но можно взять часть про нормализацию кадра

2. <ссылка>. Выглядела на "отлично", по факту бред. Литературы нет, написано на коленке


Примеры разобранных статей в области видеоаналитики:

1. Многокритериальная оценка качества фотографий. В статье рассматриваются различные критерии качества изображений, а также их количественная оценка. Из полезного: оценка резкости изображения, что может быть полезно для выделения одного наиболее информативного кадра в потоке на заданном промежутке времени. Есть математические операции по подсчету, а также примеры использования OpenCV для получения количественных оценок

2. Алгоритмы предобработки изображений в системе идентификации лиц в видеопотоке. В статье описывается алгоритмы предобработки изображений для их последующей обработки. Сюда входит

— Обесцвечивание

— Выравнивание гистограммы яркости изображения

— Выравнивание изображения относительно вертикальной оси симметрии лица (по возможности)

— Масштабирование

3. Video data quality improvement methods and tools development for mobile vision systems. В статье производится сравнение подходов однопоточной и многопоточной мобильной обработки видео, зависимость скорости обработки видео от его разрешения, а также приводятся примеры перехода из пространства RGB в YUV на OpenCV с целью оценки освещенности изображения

4. Age + Gender Estimation in Android with TensorFlow. Приложение под Android, определяющее пол и возраст человека на изображении. Прилагаются скриншоты результатов распознавания. Если с точностью определения пола все хорошо, то c определением возраста как-то не очень (числовые оценки не приводятся). Есть ссылки на датасет и блокноты в Colab, которые экспортируют модели TFLite (используется в приложении для Android). Из полезного можно вынести на мобилку модель для определения пола.


Очень важно изучить существующие открытые проекты на github. Например, если мы пытаемся по видеоряду определить возраст человека и всё делаем на питоне, то можно поискать age detection и выбрать ограничение на python. На текущий момент в поиске будет почти 600 проектов. Их берём и разбираем — есть ли документация, можно ли запустить, свежее ли, есть ли описание. Если что-то можно переиспользовать (с оглядкой на лицензию) — то переиспользуем.

Как анализировать предметную область перед разработкой на примере видеоаналитики Программирование, Разработка, Python, IT, Обучение, Telegram, Наука, Длиннопост

В телеграм-канале разбираем разные нюансы из жизни разработчика на Python и не только — python, bash, linux, тесты, командную разработку.

PS: спасибо Александре Элбакян за sci-hub

Показать полностью 1
40

Рефакторим простое на python

Давайте посмотрим на 10 строк кода.

Рефакторим простое на python Программирование, Разработка, Python, Обучение, Telegram, IT, Код, Длиннопост

Вроде всё хорошо. Классическое открытие файла с помощью контекстного менеджера with, классическая построчная обработка. Разбиваем строку, записываем в список словарей. Всё ли по канону? Неа:

1. Смотрим документацию: readlines возвращает список всех строк файла. Значит, для большого файла может быть беда. Современный питон позволяет итерироваться сразу по объекту file_. Просто пишем

for line in file_:

2. raw_line[0] и прочие индексы — это всегда ужас. Заменяем на

fio, login = line.split(";")

Вроде то же самое, но мы сразу понимаем, что было в строке. И тут же видим следующую проблему.

3. А что, если в строке нет двоеточия, или этих двоеточий больше одного? То есть нужна обработка ошибок на исключение ValueError, если справа split вернул не два значения. Добавляем try-except.

4. Частая проблема split — это лишние пробелы. Скорее всего, потребуется strip всем переменным после split.

Итого 4 ошибки на 10 строк кода.


Теперь посмотрим на переработанный код. Docstring вырезан для краткости.

Рефакторим простое на python Программирование, Разработка, Python, Обучение, Telegram, IT, Код, Длиннопост

Код теперь крут:

1. Есть аннотация типов. Понятно, что на входе строка, на выходе список.

2. С файлом всё работаем через контекстный менеджер, то есть закрыть не забудем — оно само

3. Не забыли про запрет использования file как ключевого слова, поэтому file_

4. При разбиении строки по точке с запятой используем именованные переменные

5. При ошибках — кастомные исключения. Не забудьте их документировать в docstring

6. Добавлены strip для убирания лишних пробелов по краям. Опционально

7. Выходная переменная называется logins

8. При добавлении элемента в список мы на последнем элементе добавили запятую, чтобы при расширении словаря не ловить ошибку.

В общем, каждая строка на своём месте. Или всё ещё нет?


Возьмём такой входной файл

Иванов Иван;anetto
Сидоров Петр;bnetto
Петров Артём;сnetto

Для него вывод итогового logins будет выглядеть так

[{'fio': 'Иванов Иван', 'login': 'anetto'}, {'fio': 'Сидоров Петр', 'login': 'bnetto'}, {'fio': 'Петров Артём', 'login': 'сnetto'}]

Этот словарь не является удобной конструкцией, ФИО доступно как logins["fio"]. Кроме того, мы демонстрируем наружу внутреннее представление, нарушая принцип инкапсуляции. Замена словаря на список, например, заставит переписать весь код, который использует эту структуру данных. Какой может быть выход?


Создадим класс Student и превратим словарь в экземпляр класса. Можно использовать namedtuple из collections, но мы пойдём своим путём - создадим класс с двумя полями (fio, login) и двумя методами (конструктор и repr для вывода). Теперь logins будет списком экземпляров класса.

Рефакторим простое на python Программирование, Разработка, Python, Обучение, Telegram, IT, Код, Длиннопост

Бонусов много:

1. Мы скрываем внутреннее устройство Student. Наружу мы отдаём только пару полей, откуда мы их берём никто снаружи не знает. Вместо logins["fio"] теперь используется logins.fio.

2. Можем к Student добавлять методы. Например, вывод фамилии с инициалами в стиле Иванов И.И. — теперь это в нашей власти. В примере в repr выводится ФИО:логин. Мы полностью можем кастомизировать вывод.

3. Можем добавить новые способы создания этого студента, например, данные брать из базы данных.

Пока методов нет, можно выключать диагностику pylint, а то нам будет ругаться "у класса слишком мало публичных методов". Не забываем включить её обратно после класса.


Теперь вывод выглядит так

[Иванов Иван:anetto, Сидоров Петр:bnetto, Петров Артём:сnetto]

В телеграм-канале разбираем разные нюансы из жизни разработчика на Python и не только — python, bash, linux, тесты, командную разработку. На ютуб-канале вы можете посмотреть часовой стрим по созданию небольшого проекта на gitlab.

PS: а как лучше вставлять фрагменты кода? В цитатах нет подсветки :(

Показать полностью 2
5

Как расширить технический кругозор

Современный разработчик* должен быть в курсе большого количества различных технологий и инструментов. Подобное знание не появляется из ниоткуда и не может быть освоено за выходные. Только процесс постоянного поиска информации и решения прикладных задач может приблизить к умению решать любую проблему за счёт представления места обитания потенциальных источников проблем.


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


Неплохим источником информации для постоянного потребления могут быть проверенные телеграм-каналы, подкасты (radio-T не дремлет), хабр, hackernews и другие площадки.


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


В году чуть больше 50 недель. За год реально прочитать 500 статей при еженедельном чтении десятка. Эти 500 статей и комментарием с обсуждением пополнят копилку решений и обсуждений. Обсуждая с коллегами очередную задачу, можно приобрести опыт обсуждения 500 других задач. И подойти к следующей задаче во всеоружии.


Помни: пока ты спишь, враг качается.


В телеграм-канале разбираем разные нюансы из жизни разработчика на Python и не только — python, bash, linux, тесты, командную разработку. В прошлом посте тут мы на часовом видео-стриме разбирали порядок создания небольшого python-проекта.


*Я могу говорить за python backend developer, современный data science и devops. Но думаю, что в других областях ситуация схожая


А какие крутые источники профессиональных знаний у вас?

Показать полностью
64

Учебный python-проект student на gitlab с тестами, часть 1

Периодически приходится объяснять одни и те же детали работы с python в gitlab. Решил записать видео-версию, чтобы покрыть часто возникающие вопросы.


Часовое видео включает в себя полноценную работу в консоли и редакторе vim.  Раскрыты следующие аспекты:

1. создание проекта в gitlab

2. консольную работу в git (git status / add / commit / diff / push), в том числе удобные alias для ускорения работы

3. pylint, в том числе выключение некоторых диагностик в тестах

4. создание небольшого проекта на python, в том числе

— база типа запуска hello world, if name == main, f-строк

— три варианта запуска скрипта

— чтение из CSV файла с разделителем "точка с запятой" ФИО и логины

— обработка исключений, в том числе re-raise

— google docstring

— requirements.txt и pip freeze

— проверка наличие логинов на gitlab.com

— разница mv и git mv

— правильная структура проекта

— постоянное использование tab, ctrl+R и прочих практик ускорения работы

— колёсико мышки для вставки буфера выделения

5. создание тестов к проекту с помощью pytest и фикстуры-файла


Код на gitlab. Мой bash конфиг.

В телеграм-канале разбираем разные нюансы из жизни разработчика на Python и не только — python, bash, linux, тесты, командную разработку. Есть разборы фрагментов кода, где в нескольких постах описывается превращение кода "как попало" в хороший. Есть обзоры тенденций (например, выдержки из stackoverflow survey или обзор тенденций систем контроля версий на рынке). Популярен пост как разработчику исследовать предметную область, чтобы не велосипедить и пользоваться топовыми научными достижениями.


На ютуб-канале вы ещё можете посмотреть видео про атаку forkbomb в docker или идеальный скрипт на bash.

Показать полностью 1
Отличная работа, все прочитано!