anetto1502

anetto1502

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

Ответ на пост «Без рейтинга. Самообучение PHP или курсы»1

По PHP не подскажу. ЯП много и выбор в целом не однозначен. Но выбирать технологию следует с оглядкой на
1. популярность. Чем популярнее, тем больше мануалов, помощи везде и всё такое
2. сообщество. Мануалы нужны хорошего качества, иначе найденные решения будут учить плохому
3. применимость. У каждого инструмента своя область


по пункту 1 можно ориентироваться на рейтинги. Сами по себе рейтинги мало что говорят, но вот динамика подсказывает. Смотрим TIOBE. На скрине ниже выделены python, java и PHP.

Нисходящий тренд PHP должен вызывать настороженность. Стоит ли выбирать инструмент, у которого было 10% рынка, а теперь 1.5?

более того, по пункту 2 - сообщество у PHP большие проблемы. В плане там слишком много legacy, очень много плохих подходов, переход на PHP7 вызвал большой раскол и вообще всё не очень хорошо. Имеет смысл идти в PHP, только если у вас есть хороший ментор. Перенять крутой опыт в любой технологии полезно.


Про курсы. Материала куча всякого разного. Рекомендую ориентироваться на крутые книги, добавлять статьи + видеоматериалы по теме. Можно посмотреть на бесплатные или недорогие платные курсы. Курсы типа за 120к в целом имеют мало смысла.

Наверное, 80% успеха в изучении - это самостоятельная работа. Ещё 20% заложено в обратную связь, когда вам покажут на ошибки. Прикол в том, что на больших образовательных площадках обратную связь дают далеко не профессиональные разработчики. Посмотрите вакансии тех, кто проверяет домашку, например, по запросу "<площадка> наставник", речь про зп в районе 30-55к в месяц.

Материалы в платных курсах могут быть далеко не выдающиеся по уровню. Можно наткнуться на плохой платный курс и на хороший бесплатный, и наоборот.


Небольшая подборка бесплатного материала по Python для старта:

1. Классическим хорошим курсом из бесплатных считаются Поколения Python на stepik для начинающих и для продвинутых.

2. На ютубе есть годные лекции Тимофей Хирьянова из МФТИ.

3. Python: основы и применение на stepik

4. Не питоном единым, поэтому надо ещё и немного в базы. Можно посмотреть на Интерактивный тренажер по SQL

5. Освоить git, достаточно 4 глав из книги Pro Git


Можно пойти на codewars и leetcode для закрепления умения программировать. Когда сложилось базовое понимание происходящего, рекомендую переключаться на книги типа Лутца (двухтомник, нужно свежее 5 издание 2019-2020 годов) и идти по ней. Книга большая и достаточно сложная, но покрывает много важных деталей. Можно читать не всю, а главами или разделами по непонятным темам.


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


А дальше нужно писать как можно больше кода, периодически осматриваясь вокруг. Разработка - это не только язык, это ещё библиотеки, фреймворки, разные инструменты, тесты, проектирование архитектуры, командная разработка, получение задач через bug tracker, работа с ветками в git и вообще flow разработки, CI/CD и ещё много всякого разного.


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

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

Ответ на пост «Некоторые мужчины умеют быть убедительными !!!»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 и не только — python, bash, linux, тесты, командную разработку.

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

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

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

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

Вроде всё хорошо. Классическое открытие файла с помощью контекстного менеджера 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 вырезан для краткости.

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

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 будет списком экземпляров класса.

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

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. Но думаю, что в других областях ситуация схожая


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

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