Горячее
Лучшее
Свежее
Подписки
Сообщества
Блоги
Эксперты
Войти
Забыли пароль?
или продолжите с
Создать аккаунт
Я хочу получать рассылки с лучшими постами за неделю
или
Восстановление пароля
Восстановление пароля
Получить код в Telegram
Войти с Яндекс ID Войти через VK ID
Создавая аккаунт, я соглашаюсь с правилами Пикабу и даю согласие на обработку персональных данных.
ПромокодыРаботаКурсыРекламаИгрыПополнение Steam
Пикабу Игры +1000 бесплатных онлайн игр Испытайте захватывающие сражения Второй мировой войны: быстрые бои, огромный арсенал, настройка, танки и стратегия на разнообразных картах!

Warfare 1942 - онлайн шутер

Мультиплеер, Шутер, Мидкорные

Играть

Топ прошлой недели

  • AlexKud AlexKud 38 постов
  • Animalrescueed Animalrescueed 36 постов
  • Oskanov Oskanov 7 постов
Посмотреть весь топ

Лучшие посты недели

Рассылка Пикабу: отправляем самые рейтинговые материалы за 7 дней 🔥

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

Спасибо, что подписались!
Пожалуйста, проверьте почту 😊

Помощь Кодекс Пикабу Команда Пикабу Моб. приложение
Правила соцсети О рекомендациях О компании
Промокоды Биг Гик Промокоды Lamoda Промокоды МВидео Промокоды Яндекс Директ Промокоды Отелло Промокоды Aroma Butik Промокоды Яндекс Путешествия Постила Футбол сегодня
0 просмотренных постов скрыто
119
jek187
7 лет назад

Телеграм-бот для скачивания фото с Инстаграма⁠⁠

Всем привет!

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


А такой возможности сие чудное приложение ну никак не дает (даже через web).


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

Телеграм-бот для скачивания фото с Инстаграма Telegram, Instagram, Python, Длиннопост

Основное требование, которое выставлялось, это ОПЕРАТИВНОСТЬ (смешные картинки конечно ценные, но тратить больше минуты на её выуживание из цепких лап инстаграмма не хотелось).


Ну и решение нашлось - бот в телеграме!


Далее шло курение документации этих ваших телеграмов и инстаграмов и реализация.

В итоге из этого всего родился anax_bot.


Путь в 1000 миль начинается с одного шага копирования ссылки понравившейся картинки в инстаграме:

Телеграм-бот для скачивания фото с Инстаграма Telegram, Instagram, Python, Длиннопост

Ищем в поиске телеграма anax_bot:

Телеграм-бот для скачивания фото с Инстаграма Telegram, Instagram, Python, Длиннопост

Скармливаем ему ссылку

Телеграм-бот для скачивания фото с Инстаграма Telegram, Instagram, Python, Длиннопост

И через очень короткое время получаем в ответе эту же картинку:

Телеграм-бот для скачивания фото с Инстаграма Telegram, Instagram, Python, Длиннопост

Которую, о чудо, можно скачать!

Телеграм-бот для скачивания фото с Инстаграма Telegram, Instagram, Python, Длиннопост

Надеюсь, этот бот поможет кому-нибудь :)


Исходники тут, если кому интересно, что там под капотом (а под капотом там банальные http-реквесты, ничего интересного ¯\_(ツ)_/¯).

Показать полностью 6
[моё] Telegram Instagram Python Длиннопост
46
113
A.Kristina
A.Kristina
1 год назад
Интересные покупки
Серия DIY Электроника

Топ 20 наборов для разработок в области искусственного интеллекта, нейронных сетей и машинного обучения⁠⁠

1) NVIDIA Jetson Nano

Топ 20 наборов для разработок в области искусственного интеллекта, нейронных сетей и машинного обучения Разработка, Инновации, AliExpress, Искусственный интеллект, Программирование, Робототехника, Нейронные сети, Робот, Хобби, Машинное обучение, Образование, Наука, Развитие, Электроника, Изобретения, Технологии, Компьютер, Гаджеты, Обучение, Python, Видео, Без звука, Длиннопост

Jetson Nano — набор инструментов для начала изучения ИИ и робототехники на практике. Это компактный и мощный компьютер, который позволяет параллельно запускать несколько нейронных сетей в приложениях для классификации изображений, распознавания объектов, сегментации и обработки речи. Это идеальное решение для создания прототипа нового продукта на базе ИИ. Стоит такой набор примерно 25 000 рублей. ссылка на источник.

2) Модуль распознавания объектов

Топ 20 наборов для разработок в области искусственного интеллекта, нейронных сетей и машинного обучения Разработка, Инновации, AliExpress, Искусственный интеллект, Программирование, Робототехника, Нейронные сети, Робот, Хобби, Машинное обучение, Образование, Наука, Развитие, Электроника, Изобретения, Технологии, Компьютер, Гаджеты, Обучение, Python, Видео, Без звука, Длиннопост

Механизированный модуль B01, способен распознавать объекты, жесты, захватывать движения и анимацию лица, подсчитать и выделить количество машин на дороге и многое другое. Стоит такой около 30 000 руб. ссылка

3) Комплект NVIDIA Jetson Orin NX 16 ГБ

Топ 20 наборов для разработок в области искусственного интеллекта, нейронных сетей и машинного обучения Разработка, Инновации, AliExpress, Искусственный интеллект, Программирование, Робототехника, Нейронные сети, Робот, Хобби, Машинное обучение, Образование, Наука, Развитие, Электроника, Изобретения, Технологии, Компьютер, Гаджеты, Обучение, Python, Видео, Без звука, Длиннопост

Самый совершенный компьютер с ИИ для небольших автономных машин малой мощности. Стоит такой набор около 110 000 руб. ссылка

4) Роботизированная машина

Топ 20 наборов для разработок в области искусственного интеллекта, нейронных сетей и машинного обучения Разработка, Инновации, AliExpress, Искусственный интеллект, Программирование, Робототехника, Нейронные сети, Робот, Хобби, Машинное обучение, Образование, Наука, Развитие, Электроника, Изобретения, Технологии, Компьютер, Гаджеты, Обучение, Python, Видео, Без звука, Длиннопост

Робот Pi-4b Mecanum с множествами функций. Стоит такой около 38 000 руб. ссылка

5) Бионическая собака-робот

Топ 20 наборов для разработок в области искусственного интеллекта, нейронных сетей и машинного обучения Разработка, Инновации, AliExpress, Искусственный интеллект, Программирование, Робототехника, Нейронные сети, Робот, Хобби, Машинное обучение, Образование, Наука, Развитие, Электроника, Изобретения, Технологии, Компьютер, Гаджеты, Обучение, Python, Видео, Без звука, Длиннопост

Набор для сборки собаки-робота с искусственным интеллектом. Стоит такая около 65 000 руб. ссылка

6) Вездеход

Топ 20 наборов для разработок в области искусственного интеллекта, нейронных сетей и машинного обучения Разработка, Инновации, AliExpress, Искусственный интеллект, Программирование, Робототехника, Нейронные сети, Робот, Хобби, Машинное обучение, Образование, Наука, Развитие, Электроника, Изобретения, Технологии, Компьютер, Гаджеты, Обучение, Python, Видео, Без звука, Длиннопост

Гусеничный робот-вездеход с ИИ, стоит такой около 50 000 руб. ссылка

7) Лидар

Топ 20 наборов для разработок в области искусственного интеллекта, нейронных сетей и машинного обучения Разработка, Инновации, AliExpress, Искусственный интеллект, Программирование, Робототехника, Нейронные сети, Робот, Хобби, Машинное обучение, Образование, Наука, Развитие, Электроника, Изобретения, Технологии, Компьютер, Гаджеты, Обучение, Python, Видео, Без звука, Длиннопост

Сканер-дальномер Slamtec RPLIDAR S3M1 - может выполнить сканирование пространства на все 360 градусов вокруг себя в пределах 40 метров. Стоит такой около 39 000 руб. ссылка на источник

8) Манипулятор

Топ 20 наборов для разработок в области искусственного интеллекта, нейронных сетей и машинного обучения Разработка, Инновации, AliExpress, Искусственный интеллект, Программирование, Робототехника, Нейронные сети, Робот, Хобби, Машинное обучение, Образование, Наука, Развитие, Электроника, Изобретения, Технологии, Компьютер, Гаджеты, Обучение, Python, Видео, Без звука, Длиннопост

Роботизированная рука-сортировщик с ИИ. Стоит такая около 40 000 руб. ссылка

9) Балансирующий робот

Топ 20 наборов для разработок в области искусственного интеллекта, нейронных сетей и машинного обучения Разработка, Инновации, AliExpress, Искусственный интеллект, Программирование, Робототехника, Нейронные сети, Робот, Хобби, Машинное обучение, Образование, Наука, Развитие, Электроника, Изобретения, Технологии, Компьютер, Гаджеты, Обучение, Python, Видео, Без звука, Длиннопост

Интеллектуальный автомобиль, который может передвигаться вертикально на 2х колесах. Стоит такой около 31 000 руб. ссылка

10) Камера CM4 AI

Топ 20 наборов для разработок в области искусственного интеллекта, нейронных сетей и машинного обучения Разработка, Инновации, AliExpress, Искусственный интеллект, Программирование, Робототехника, Нейронные сети, Робот, Хобби, Машинное обучение, Образование, Наука, Развитие, Электроника, Изобретения, Технологии, Компьютер, Гаджеты, Обучение, Python, Видео, Без звука, Длиннопост

AI-камера на базе Raspberry Pi CM4 со степенью защиты IP67, оснащена объективом и светодиодной подсветкой, которая использует вычислительный модуль Raspberry Pi 4 для запуска приложений компьютерного зрения с использованием OpenCV, Pythong и Qt. Стоит такая где-то 28 000 руб. ссылка на источник

11) Датчики геофона

Топ 20 наборов для разработок в области искусственного интеллекта, нейронных сетей и машинного обучения Разработка, Инновации, AliExpress, Искусственный интеллект, Программирование, Робототехника, Нейронные сети, Робот, Хобби, Машинное обучение, Образование, Наука, Развитие, Электроника, Изобретения, Технологии, Компьютер, Гаджеты, Обучение, Python, Видео, Без звука, Длиннопост

Набор для сборки самого передового сейсмографа с тремя ортогонально расположенными датчиками геофона, для миллисекундной точности и качества данных при регистрации сейсмической активности всех величин, как вертикальных, так и боковых. Стоит такой набор около 155 000 руб . ссылка

12) Лидар Tele-15

Топ 20 наборов для разработок в области искусственного интеллекта, нейронных сетей и машинного обучения Разработка, Инновации, AliExpress, Искусственный интеллект, Программирование, Робототехника, Нейронные сети, Робот, Хобби, Машинное обучение, Образование, Наука, Развитие, Электроника, Изобретения, Технологии, Компьютер, Гаджеты, Обучение, Python, Видео, Без звука, Длиннопост

Новый лазерный дальномер создан с целью обнаружения препятствий на больших расстояниях. Данная система позволит четче «видеть» препятствия и уклоняться от них, даже при движении на больших скоростях. Стоит такая система около 161 000 руб. ссылка

13) STEMlab 125-14

Топ 20 наборов для разработок в области искусственного интеллекта, нейронных сетей и машинного обучения Разработка, Инновации, AliExpress, Искусственный интеллект, Программирование, Робототехника, Нейронные сети, Робот, Хобби, Машинное обучение, Образование, Наука, Развитие, Электроника, Изобретения, Технологии, Компьютер, Гаджеты, Обучение, Python, Видео, Без звука, Длиннопост

Имеет два 14-битных входа со скоростью 125 Мбит/с и два 14-битных выхода, Xilinx Zynq 7010 FPGA и предлагает удаленный доступ с пользовательским интерфейсом онлайн-приложения, доступным через Ethernet или Wi-Fi. Может использоваться в качестве осциллографа и генератора сигналов, анализатора спектра, логического анализатора, измерителя LCR*, потокового, SDR или векторного анализатора цепей. Стоит такой около 149 000 руб. ссылка

14) Автопилот CUAV X7 + Pro

Топ 20 наборов для разработок в области искусственного интеллекта, нейронных сетей и машинного обучения Разработка, Инновации, AliExpress, Искусственный интеллект, Программирование, Робототехника, Нейронные сети, Робот, Хобби, Машинное обучение, Образование, Наука, Развитие, Электроника, Изобретения, Технологии, Компьютер, Гаджеты, Обучение, Python, Видео, Без звука, Длиннопост

Полётный контроллер использует высокопроизводительный процессор серии STM32H7. В нем интегрированы высокоточные промышленные датчики и сенсоры сверхнизких температур. Контроллер имеет лучшую производительность, более быстрый процессор и больший размер памяти. Стоит такой около 144 000 руб. ссылка

15) Грузовой робот

Топ 20 наборов для разработок в области искусственного интеллекта, нейронных сетей и машинного обучения Разработка, Инновации, AliExpress, Искусственный интеллект, Программирование, Робототехника, Нейронные сети, Робот, Хобби, Машинное обучение, Образование, Наука, Развитие, Электроника, Изобретения, Технологии, Компьютер, Гаджеты, Обучение, Python, Видео, Без звука, Длиннопост

Умный робот способный перевозить грузы до 2 кг. Стоит такой около 142 000 руб. ссылка

16) Sipeed Lichee Cluster

Топ 20 наборов для разработок в области искусственного интеллекта, нейронных сетей и машинного обучения Разработка, Инновации, AliExpress, Искусственный интеллект, Программирование, Робототехника, Нейронные сети, Робот, Хобби, Машинное обучение, Образование, Наука, Развитие, Электроника, Изобретения, Технологии, Компьютер, Гаджеты, Обучение, Python, Видео, Без звука, Длиннопост

Кластерный компьютер допускает установку семи вычислительных модулей Lichee Module 4 Model A (LM4A). Они наделены чипом Xuantie C910 (RV64GCV) с четырьмя ядрами RISC-V, нейропроцессорным блоком (NPU) производительностью до 4 TOPS, энергоэффективным ядром Xuantie E902, графическим узлом Imagination 3D (50 Гфлопс) и DSP Xuantie C906. Стоит такой 140 000 руб. ссылка на источник

17) Рука с ИИ

Топ 20 наборов для разработок в области искусственного интеллекта, нейронных сетей и машинного обучения Разработка, Инновации, AliExpress, Искусственный интеллект, Программирование, Робототехника, Нейронные сети, Робот, Хобби, Машинное обучение, Образование, Наука, Развитие, Электроника, Изобретения, Технологии, Компьютер, Гаджеты, Обучение, Python, Видео, Без звука, Длиннопост

Робот-платформа UltraArm с ИИ может писать, рисовать и выполнять лазерную гравировку. Стоит такой около 110 000 руб. ссылка

18) Ultimate Discovery 2

Топ 20 наборов для разработок в области искусственного интеллекта, нейронных сетей и машинного обучения Разработка, Инновации, AliExpress, Искусственный интеллект, Программирование, Робототехника, Нейронные сети, Робот, Хобби, Машинное обучение, Образование, Наука, Развитие, Электроника, Изобретения, Технологии, Компьютер, Гаджеты, Обучение, Python, Видео, Без звука, Длиннопост

Набор для тестирования и отлаживания широкого спектра схем. Стоит такой около 107 000 руб. ссылка

19) Модуль позиционирования

Топ 20 наборов для разработок в области искусственного интеллекта, нейронных сетей и машинного обучения Разработка, Инновации, AliExpress, Искусственный интеллект, Программирование, Робототехника, Нейронные сети, Робот, Хобби, Машинное обучение, Образование, Наука, Развитие, Электроника, Изобретения, Технологии, Компьютер, Гаджеты, Обучение, Python, Видео, Без звука, Длиннопост

C-RTK 9Ps — это модуль высокоточного позиционирования от компании CUAV, предназначенный для определения местоположения в пространстве. Точность статического позиционирования RTK — до 1 см, а измеренная динамическая точность — около 6 см. стоит такой около 118 000 руб. ссылка

20) Набор Raspberry Pi 4B 4GB RAM

Топ 20 наборов для разработок в области искусственного интеллекта, нейронных сетей и машинного обучения Разработка, Инновации, AliExpress, Искусственный интеллект, Программирование, Робототехника, Нейронные сети, Робот, Хобби, Машинное обучение, Образование, Наука, Развитие, Электроника, Изобретения, Технологии, Компьютер, Гаджеты, Обучение, Python, Видео, Без звука, Длиннопост

Мини-компьютер для создания различных устройств: для проектирования системы «умного дома» и роботов, планшетных ПК или других продуктов DIY. Также может быть использован как обычный настольный или мобильный ПК. Стоит такой около 9700 руб. ссылка на источник.

Показать полностью 19 2
Разработка Инновации AliExpress Искусственный интеллект Программирование Робототехника Нейронные сети Робот Хобби Машинное обучение Образование Наука Развитие Электроника Изобретения Технологии Компьютер Гаджеты Обучение Python Видео Без звука Длиннопост
12
110
YtYt.Pikabu
YtYt.Pikabu
3 года назад
Программирование на python

Требуется програблогер / блограмист. Зарплата 100к⁠⁠

Ждали разбор заданий к прошлому посту, да?) Скоро будет, уже работаю над ним. Но отвлекитесь ненадолго от чистого кода, фишек Python и всего этого. Тут кое-что поинтереснее подъехало, пофундаментальнее.


Видели же рекламу курсов по программированию в духе "Делать ничего не нужно, всё очень легко и быстро, только купи курс за 100 тысяч"? Так вот, хочу дать полностью противоположное объявление. Ищу несколько человек, которые хотят научиться программированию. Обучу под ключ, бесплатно. Пахать придётся будь здоров, и будет очень сложно. А если доживёте до конца - заплачу 100 тысяч.
Требуется програблогер / блограмист. Зарплата 100к Программирование, Python, IT, Обучение, Длиннопост

Зачем мне это нужно? Затем, что у меня есть онлайн-платформа, на которой можно учиться программированию на практике, без вебинаров и видеолекций. И я хочу наглядно показать всем, как шаг за шагом происходит становление программиста, и чем отличается просмотр вебинаров/видеороликов от реального обучения программированию. Для этого нужно несколько человек, которые будут учиться и попутно вести видеодневник на YouTube или другом ресурсе.


Как это будет выглядеть:


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

- при этом несколько раз в неделю снимаете короткие ролики, в которых рассказываете о том, чему научились и с какими сложностями столкнулись;

- когда все участники либо доходят до конца, либо отваливаются в процессе, то проводим голосование среди зрителей. Тот участник, который дошёл до конца и при этом получил приз зрительских симпатий, становится обладателем приятной премии в 100 000 рублей.

Программа обучения

Python, SQL, Flask, Django, базовые знания DevOps. Паттерны проектирования, навыки написания чистого кода, инструменты (Git, Linux, Docker, pytest и прочее). Всё, что необходимо джуну для трудоустройства.


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

Критерии отбора

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


1. "Хочу попробовать попрограммировать, вдруг получится"

Сразу мимо, без вариантов. У вас должна быть чёткая цель "я стану программистом", и должны быть подтверждения того, что вы двигаетесь к ней самостоятельно прямо сейчас.


В прошлый раз часто слышал истории вроде "ну я пробовал год назад, немного поучил язык, но что-то не сложилось и вот забросил, а сейчас решил опять попробовать". Без обид, ребята, но ваш уровень мотивации сейчас буквально нулевой. Вероятность того, что вы пройдёте обучение до конца - такая же. Хотите прийти на платное обучение - приходите, выжмем из вас максимум, потому что затраченные деньги будут мотивировать не бросать. Но на бесплатное обучение с такой установкой точно не возьму, потому что отвалитесь в течение максимум 3 месяцев, и просто займёте чужое место и потратите время.


Участвуете в разборах кода на Пикабу, есть недавно пройденные курсы на Stepik, есть репозиторий со своими пет-проектами - вот это супер, это уже заявка на успех. А если есть только честное слово и обещание, что "обязательно буду учиться и стараться" - извините, в третий раз не поверю, дважды уже обжёгся) Многие из "обещателей" в итоге даже не начали учиться, просто перестали выходить на связь, зато чужое место занять успели. А из тех, кто всё-таки начал, никто не прошёл даже 20% курса, все отвалились по разным причинам. В итоге сейчас из бесплатного набора остались только те, кто ещё до него начинал учиться самостоятельно.


2. "Не знаю, потяну ли я нужный темп, но надо начать, а там видно будет"

Уже и так всё видно :) Пожалуйста, если вы не готовы пахать и уделять программированию практически всё свободное время - не занимайте чужое место. Я не шучу и не преувеличиваю: будет сложно, нужно будет минимум год просто жить программированием. Если у вас уже сейчас есть сомнения, что такой темп вам подойдёт, то через пару месяцев гарантированно окажется, что "ну всё-таки не получилось, форс-мажор, другие дела, не моё".


3. Готовность засветить лицо перед камерой

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


Шикарная камера не нужна, достаточно более-менее нормальной вебки или телефона. Монтажом заниматься тоже не нужно, при необходимости сделаю это за свой счёт. От вас - только исходное видео.


Важно: если регулярных роликов от участника не будет, то не будет и смысла учить его бесплатно, а потом ещё и доплачивать. Я делаю всё это не потому, что хочу просто так раздарить кучу денег, а потому, что видеодневники помогут:


- показать людям, что на самом деле значит "обучиться программированию";

- хорошенько дать под зад инфоцыганам, которые загадили информационный фон по теме программирования;

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


Я участвую!

Если вы хотите принять участие, то пожалуйста, оставьте комментарий в следующем формате:

- возраст;

- образование;

- профессия;

- как давно изучаете программирование, как именно изучаете и какой конкретно язык;

- итоговая цель, ради которой учитесь.


Комментарии, чей формат будет отличаться от указанного, рассматривать не буду. Это чётко показывает, что даже простые вводные данные изучаются невнимательно, и лично для меня это яркий красный флажок с надписью "NO!".


Честно говоря, немного страшно пускаться в такую авантюру, потому что раньше ничего подобного не делал. Но надеюсь, что всё получится, и в итоге мы с вами сделаем реально интересный и качественный контент, за которым будут следить, как за телешоу :)

Показать полностью 1
Программирование Python IT Обучение Длиннопост
325
105
DELETED
4 года назад
Программирование на python

Встроенные типы данных (их назначение, методы и стандартное поведение) - Строки (часть 1)⁠⁠

Один из самых недооценённых начинающими питонистами встроенных типов данных - строки. Как недавно признался один из студентов: "Когда я встречаю строки - сразу иду гуглить". И это странно, ведь работа с текстом неизбежна.


Откуда текст может возникать? Откуда угодно. Текст может генерироваться при помощи вашего кода налету, приходить извне через input() или откуда-то из интернета. Кроме этого, вы можете (и будете) писать его самостоятельно. Во всех этих случаях вам нужно уметь его обрабатывать либо для дальнейшего использования в коде, либо для вывода на экран, либо для каких-то иных целей.


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


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

s = 'text' # одинарные апострофы
s = "text" # одинарные двойные кавычки
s = '''text''' # тройные апострофы
s = """text""" # тройные двойные кавычки

Строкой является любой символ (или последовательность символов), заключённый в литералы строк, в т.ч. пробелы, цифры, знаки препинания.

# Это всё строки
s = '' # пустая строка (без символов между литералами) - тоже строка
s = " " # это строка из одного пробела
s = 'мама мыла раму'
s = "1234" # это не число, это строка
s = " Привет, мир! "

Обратите внимание на последний пример. Он начинается и заканчивается пробелами. Эти пробелы так и будут выводиться на экран и сами собой никуда не денутся. Это важно, потому что пробел также является символом строки и элементом последовательности. В данном случае при принте первого и/или последнего элемента мы не увидим ничего на экране. Но тем не менее, эти пробелы там будут, потому что они включены в строку и являются её элементами, хоть и не имеют визуального отображения. Что с этим делать и как быть, мы обязательно поговорим во второй части.


В чём разница одинарных и тройных литералов? Стандартно для объявления строк в коде мы используем одинарные кавычки или апострофы. И чаще всего такие строки являются короткими.


Тройные вариации используются в основном для написания документационных аннотаций к модулям, классам и функциям. Иначе это называется docstring или докстринг, и о них мы поговорим, когда дойдём до функций. А пока что нужно иметь в виду, что такой тип объявления строки технически доступен в рамках кода как такового для создания длинных строк.

Что значит короткая и длинная строка? Для ответа на этот вопрос вспомним PEP8: длина строки кода не должна превышать 80 символов. Пока строка текста не превышает этот предел - она считается короткой. Как только текст требует переноса - строка становится длинной.


Экранирование

По умолчанию пайтон в принтах выводит строки, обёрнутые в одинарные апострофы, как бы они ни были заданы пользователем.

>>> s = "text" # одинарные двойные кавычки
>>> s
'text' # в выводе - одинарные апострофы

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


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

>>> "A.Dumas - D'Artagnan et les trois mousquetaires"
"A.Dumas - D'Artagnan et les trois mousquetaires"
>>> 'Ледокол "Ленин"'
'Ледокол "Ленин"'

Т.е. питон самостоятельно меняет вид обрамляющих литералов в зависимости от того, что находится внутри строки. А что если внутри строки должны быть и кавычки, и апострофы одновременно? Тут можно пойти двумя путями:

1. использовать тройные кавычки или апострофы (при чём без разницы, что вы из них выберете),

>>> """O'Reilly published D.Beazley's book "Python Cookbook" in 2013"""
'O\'Reilly published D.Beazley\'s book "Python Cookbook" in 2013'

2. использовать экранирование специальным символом обратного слэша - \.

>>> 'O\'Reilly published D.Beazley\'s "Python Cookbook" in 2013'
'O\'Reilly published D.Beazley\'s "Python Cookbook" in 2013'
>>> "O'Reilly published D.Beazley's \"Python Cookbook\" in 2013"
'O\'Reilly published D.Beazley\'s "Python Cookbook" in 2013'

Как вы видите, в экранировании нуждаются символы, совпадающие с литералами - главное не запутаться, особенно, если текста много.


В экранировании также нуждаются специальные символы, при использовании которых в поведении строк происходят те или иные изменения. За полным списком таких символов и за примерами использования я вас пошлю вот сюда. Здесь же я опишу только те, которые чаще всего используются на деле (некоторые примеры я позаимствовал оттуда же).


Однако, прежде чем продолжить, хочу сделать ремарку для тех, кто родился в эпоху мобильных телефонов: некоторая терминология в статье, куда я вас отправил, относится к эре печатных машинок. Если вы не знаете, что такое звонок, каретка и как её переводить - "Ok, Google! Устройство печатной машинки".


Итак,

\ - если после символа \ сразу нажать Enter, то это переведёт каретку на новую строку:

>>> s = 'Это будет очень\
... , очень-очень\
... , ну прям оооооочень\
... длинная строка'
>>>
>>> s
'Это будет очень, очень-очень, ну прям оооооочень длинная строка'

\\ - экранирование символа обратного слеша (полезно при работе с файловой системой винды):

>>> s = 'D:\\мои документы\\книги\\Лутц.pdf'
>>> s
'D:\\мои документы\\книги\\Лутц.pdf'

\n - перевод каретки (новая строка):

>>> s = "Мама мыла раму\nМила раму мыла"
>>> print(s) # только функция print понимает, что делать со спецсимволами
Мама мыла раму
Мила раму мыла
>>> s # в этом случае просто выводится содержимое переменной
'Мама мыла раму\nМила раму мыла'

\t - горизонтальный отступ слева от начала строки (горизонтальная табуляция (да, есть и вертикальная)):

>>> s = '0\t1\t\t2\t\t\t3'
>>> print(s)
0 1 2 3
>>> '0 1 2 3'
'0\t1\t\t2\t\t\t3'

Achtung! Achtung! Приятные новости: в длинных строках всё это не нужно! =)

>>> s = """Эта очень длинная строка
... сама переносится, сама табулируется
... сама экранируется \."""
>>> print(s)
Эта очень длинная строка
сама переносится, сама табулируется
сама экранируется \.
>>> s
'Эта очень длинная строка\nсама переносится, сама\tтабулируется\nсама экранируется \\.'
>>> s = """Но если вдруг вам будет очень нужно прописать здесь что-то вроде '\n', то вам нужно воспользоваться экранированием, чтобы \\n не выполнялся"""
>>> print(s)
Но если вдруг вам будет очень нужно прописать здесь что-то вроде '
', то вам нужно воспользоваться экранированием, чтобы \n не выполнялся

Функция print

Тут надо бы вспомнить про функцию print. Как я уже говорил, это функция всеядная и может переварить много чего. Помимо того, что она всеядная, она ещё и достаточно хитрая. Напишите в консоли вот такую команду :

>>> help(print)

Кстати говоря, никогда не стесняйтесь использовать этот официальный help питона: передавая в него название любого встроенного объекта вы получите очень классную справку. Про print питон вам немедленно расскажет следующее:

Help on built-in function print in module builtins:
print(...)
print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False)
Prints the values to a stream, or to sys.stdout by default.
Optional keyword arguments:
file: a file-like object (stream); defaults to the current sys.stdout.
sep: string inserted between values, default a space.
end: string appended after the last value, default a newline.
flush: whether to forcibly flush the stream.

Лаконично, просто и понятно. Вот её сигнатура:

def print(self, *args, sep=' ', end='\n', file=None):

Она говорит нам о том, что:

*args - функция всеядная, т.е. ожидает любых аргументов в любом количестве,

sep=' ' - при выводе нескольких аргументов для их отделения друг от друга по умолчанию используется пробел,

end='\n' - любой вывод по умолчанию заканчивается переводом каретки на новую строку,

file=None - по умолчанию вывод производится на экран (если в этот параметр передать имя конкретного файла, то информация запишется (будет выведена) в такой файл).


Собственно, что это вдруг я её вспомнил? Посмотрите ещё раз внимательно. В числе её параметров присутствуют такие вещи как sep=' ' и end='\n'. Оба этих параметра принимают любые строковые символы, в том числе экранируемые. Зачем это нужно знать? Затем, чтобы иметь возможность оформлять вывод по своему желанию.

>>> a = "Мама"
>>> b = "мыла"
>>> c = "раму"
>>> print(a, b, c) # стандартный принт трёх переменных
Мама мыла раму
>>> print(a, b, c, sep='\t') # делаем разделителем табуляцию
Мама мыла раму
>>> print(a, b, c, sep='\t', end='\n\n') # добавляем лишнюю пустую строку по окончанию вывода
Мама мыла раму
>>> print(a, b, c, sep='42')
Мама42мыла42раму
>>> print(a, b, c, sep='42', end='THE END')
Мама42мыла42рамуTHE END

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

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


Префиксы

Кроме самих кавычек и апострофов в питоне существуют так называемые префиксы, которые определяют подвид строки. Их немного, я перечислю все, но остановлюсь только на тех, с которыми вы столкнётесь раньше всего и будете в последствии сталкиваться регулярно. Такими префиксами являются (в скобках указаны альтернативные виды написания:

u (U) - строка символов юникода (если вы не используете Python2, то можете смело о нём забыть),
r (R) - сырая строка;
b (B) - строка байтов;
f (F) - форматированная строка,
fr (rf, fR, rF, Rf, Fr, FR, RF) - сырая форматированная строка
br (rb, rB, bR, Br, Rb, BR, RB) - сырая байтовая строка.

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


Префиксы указываются до литералов без пробелов, например:

>>> s = r'\a\n'
>>> s
'\\a\\n'

Сырые строки

Сырые строки - это строки, в которых действие экранируемых символов подавляется. Проще говоря - в этих строках всё выходит на принт в первозданном виде.

Повторю пример:

>>> s = '\a\nМама' # обычная строка
>>> print(s)
# в этом месте сработал символ переноса строки "\n"
Мама
>>> s = r'\a\nМама' # сырая строка
>>> print(s)
\\a\\nМама

Сырые строки можно использовать как минимум в трёх случаях:

- в регулярных выражениях,

- для хранения файловых путей Windows, поскольку в них содержатся обратные слэши;

- для хранения сложных математических формул в разметке LATEX.


Байтовые строки

Байтовыми строками являются строки, отражающие двоичную структуру любых данных, в том числе текста, картинок, музыки, видео и т.д. При работе с текстом такие строки возникают при кодировании строки методом encode():

>>> s = 'Mama'.encode()
>>> print(s)
b'Mama'
>>> s = "Мама"
>>> s = s.encode()
>>> print(s)
b'\xd0\x9c\xd0\xb0\xd0\xbc\xd0\xb0'

Если к вам вдруг прилетела байтовая строка, то чаще всего её можно привести в человеческий вид при помощи обратного метода decode():

>>> s = b'\xd0\x9c\xd0\xb0\xd0\xbc\xd0\xb0'
>>> s = s.decode()
>>> print(s)
Мама

Форматированные строки

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

Представьте себе ситуацию, когда содержимое строки должно формироваться динамически. Например, вы пришли в магазин, набрали телегу продуктов, пришли на кассу, а кассир вместо того, чтобы быстро всё посчитать и потребовать с вас нужную сумму, занимается тем, что записывает каждый товар и его стоимость в отдельные строки, потом всё это как-то суммирует и пишет руками новую строку с общей стоимостью. Ну бред же, правда?

Логично предположить, что для таких целей есть некий шаблон, который выводит на печать заранее посчитанную общую стоимость покупок. В шаблоне есть заготовленная стандартная фраза "Общая стоимость покупок - ". А что дальше? Кассир же не будет каждый раз писать туда новую сумму для каждого нового покупателя. Значения должны автоматически в неё подставляться - для этого и существуют форматированные строки.

В версии Python 3.6. наконец появилась замечательная альтернатива старому методу форматирования строк str.format() - префикс f (или в обиходе - f-строки), который делает эту процедуру приятной и лёгкой до невозможности. Но вы должны это увидеть и оценить.

Итак, до версии 3.6 нужно было делать примерно так:

# представим, что общая сумма как-то посчиталась раньше и содержится в переменной total_sum
>>> total_sum = 1000
>>> final_sum_template = 'Общая стоимость покупок - {} руб.'
>>> s = final_sum_template.format(total_sum)
>>> print(s)
Общая стоимость покупок - 1000 руб.

То есть, под значение из total_sum в шаблоне заготовлено отдельное место в виде {}. Для вставки в это место требуемого значения нужно вызвать метод .format(), куда передать переменную или непосредственно само значение - и только тогда строка будет полностью сформирована. В данном примере это выглядит не так жутко. Но представьте ситуацию, когда у вас есть куча значений, которые должны лечь в одну строку. Чтобы не потеряться, в шаблоне нужно было делать именованные аргументы, чтобы потом их можно было вызывать в .format() и передавать туда значения. Например:

>>> name = "Вася"
>>> surname = "Пупкин"
>>> age = 18
>>> template = 'Это {a}. Его фамилия {b}. Вчера ему исполнилось {c} лет.'
>>> s = template.format(a=name, b=surname, c=age)
>>> print(s)
Это Вася. Его фамилия Пупкин. Вчера ему исполнилось 18 лет.

И всё это длинно, долго, муторно... А вот всё то же самое, только в f-строке:

>>> name = "Вася"
>>> surname = "Пупкин"
>>> age = 18
>>> s = f'Это {name}. Его фамилия {surname}. Вчера ему исполнилось {age} лет.'
>>> print(s)
Это Вася. Его фамилия Пупкин. Вчера ему исполнилось 18 лет.

Как минимум, у нас минус одна строка кода - это уже классно. Нет, конечно же, можно метод .format() сразу вызывать у template, но тогда мы рискуем получить очень длинную строку кода. Вдруг предложение в шаблоне уже занимает 80 символов (кстати, в "старом" шаблоне их уже 70)? Но дело даже не в этом. Я надеюсь, вы смогли оценить то, насколько процесс формирования текста упростился в этом месте. По сути это уже готовое предложение без лишней головной боли. Здесь уже нет никаких именованных заготовок, ожидающих передачу аргументов. Здесь заготовки, в которых уже стоят нужные аргументы. Кроме того, f-строки работают заметно быстрее старого метода.


Если вам мало и я вас не убедил, то почитайте вот эту статью. Если же я вас убедил, то у вас мог возникнуть вопрос: "зачем тогда вот это вот всё про устаревший метод?" Дело в том, что его пока ещё не вывели из использования. Кроме того, некоторые библиотеки, особенно те, которые написаны задолго до версии Python 3.6. и до сих пор находятся в строю, упорно не переписываются под использование f-строк. При работе с ними возникает прямая необходимость прибегать к старому методу. Поэтому для интересующихся - ссылка на старый добрый str.format()


To be continued...


-----

Всё это, конечно же, дублируется в отдельном канале в телеге. По всем вопросам обращайтесь через Telegram.


Да, и тег моё - потому что всё написано моими руками, а не тупо понакопировано с других сайтов.


P.S. Большое спасибо всем моим подписчикам за поддержку и активность! Без вас я, возможно, не решился бы продолжать.


Ссылки на предыдущие посты:

1. Предлагаю помощь в освоении Питона

2. ПЕРВОЕ ЗНАКОМСТВО С PYTHON

3. Встроенные типы данных (их назначение, методы и стандартное поведение) - Введение

4. Встроенные типы данных (их назначение, методы и стандартное поведение) - Числа

Показать полностью
[моё] Python Программирование IT Длиннопост Текст Изучение Языки программирования
6
105
DELETED
2 года назад

Отзыв про Цифровые профессии 2022 на Госуслугах⁠⁠

Делюсь опытом, как я прошла на IT-курсы со 2-ой заявки и скидкой по безработице.

Отзыв про Цифровые профессии 2022 на Госуслугах IT, Программирование, Python, Госуслуги, Курсы, Длиннопост, Образование, Бесплатное обучение, Онлайн-курсы, Обучение, Дистанционное обучение

На Госуслугах в глаза бросается реклама Цифровых профессий - для разных категорий граждан есть разные скидки, вплоть до 100%, если человек официально безработный (и стоит на учете в центре занятости; причем желательно месяц или больше).


Если не сдашь экзамены - компенсируешь всю скидку, так что лениться нельзя* (в комментариях всплыла неточность: зависит от конкретной учебной организации, в моем случае компесация как раз предусмотрена).

После заключения договора и начала учебы, как мне ответили, можно уже не быть безработным и трудоустроиться, скидка не исчезнет: главное не завалить учебу.


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


Горячая линия и почта Университета 2035 отвечают скриптами. Еще есть отзывы, что после одобрения заявки "недостаточно мотивированных" срезают на онлайн-интервью или после заваленного тестирования. Еще ругают гикбрэйнс, нетологию и всех остальных продаванов курсов. Поэтому я выбрала курс от университета, который по сложности заявлен как подходящий для новичка в программировании.


• На учете по безработице с середины июля 2022 года.

• 1-ая заявка в середине августа; примерно за 25 дней приходит отказ в начале сентября, что я не безработная (справку из Центра занятости не засчитали). Приходит пдф-ка со всеми датами, в которой указан номер заявки и ФИО сотрудника в подписи документа.

Отзыв про Цифровые профессии 2022 на Госуслугах IT, Программирование, Python, Госуслуги, Курсы, Длиннопост, Образование, Бесплатное обучение, Онлайн-курсы, Обучение, Дистанционное обучение

• Вечером подала 2-ую заявку заново и сразу написала жалобы про 1-ую заявку на 4 сайтах, авторизовавшись через Госуслуги: Минцифры, Роспотребнадзор, Администрация Президента и ФАС (спасибо этому посту в дзене).


• Примерно так:«Мне отказано в услуге Цифровые профессии на сайте Госуслуг. Номер моей заявки №******,  дата подачи --/--/--. Состояю на учете в центре занятости уже более 50 дней с --/--/--даты,  прилагаю скан справки об учете в Центре занятости. Заявка была подана в --/--/--,  т.е. это следующий календарный месяц за постановкой на учет и после более 30 дней с момента учета. Прошу провести проверку и при необходимости принять меры из-за возможно недобросовестной работы сотрудника Университета стратегической инициативы 2035 , который написал об отказе --/--/-- в документе №*****,  pdf отказа с подписью сотрудника прилагаю. Также повторно прилагаю диплом о высшем образовании.»


• На следующий день заявка оказалась одобрена. Через 2 дня первыми ответили Минцифры на Госуслугах, а письмо от Роспотребнадзора шло ± месяц.

• Дальше 3 дня жду логин и пароль от Лидер-ID.

• Дальше 10 календарных дней переписка с организаторами из ВУЗа: отправила им сканы и потом оригиналы договора/согласия на обучение + онлайн-тестирование.

Отзыв про Цифровые профессии 2022 на Госуслугах IT, Программирование, Python, Госуслуги, Курсы, Длиннопост, Образование, Бесплатное обучение, Онлайн-курсы, Обучение, Дистанционное обучение

• Входное тестирование на моем курсе было с 3 попытками из 15 вопросов. Как старый учебник по информатике: ЭВМ + кусочки экселя и статистики, аналогичные тесты можно найти в интернете. Похожие вопросы из гугла/яндекса: "функция периферийных устройств - это...", "логические функции табличых процессоров используются для..." и т.д.


• В итоге все отлично. Сайт ВУЗа не глючит, записи легко смотреть или скачивать. Поток курса не первый, это не пробный полет. Лектор круто разбирается в теме и при этом любому новичку может все донести. Мне лично гораздо понятнее учиться азам с живым человеком, чем начинать самостоятельно в одиночку :)

Отзыв про Цифровые профессии 2022 на Госуслугах IT, Программирование, Python, Госуслуги, Курсы, Длиннопост, Образование, Бесплатное обучение, Онлайн-курсы, Обучение, Дистанционное обучение

P.S. 

Есть еще совсем другая программа Демография на сайте Трудвсем со своими условиями, разными сферами и уровнями образования. Для разных регионов РФ разные списки программ, лучше смотреть все регионы в фильтрах. А еще поиск по словам плохо работает.

Но там мне 2 разных ВУЗа перезванивали и просили меня удалить заявки, т.к. квота заканчивается/не набирается, а сами не хотели/не могли отклонить. Я спорить не стала - спасибо, что быстро отказывали. Зато моя подруга с детьми-дошкольниками смогла пройти переподготовку бесплатно.

Показать полностью 3
[моё] IT Программирование Python Госуслуги Курсы Длиннопост Образование Бесплатное обучение Онлайн-курсы Обучение Дистанционное обучение
32
103
NeoSilence
NeoSilence
3 года назад
Программирование на python

Женщина-программист? Продолжаю обучение⁠⁠

Всем доброго времени уток!


В прошлом посте Женщина-программист? я рассказала о желании сменить белую рубашку типичного офисного работника на удобные шмотки программиста.


Напомню вводные: женщина, 35 лет. Всю жизнь работаю с людьми, прилично знаю 1с,

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


В этом посте хочу дать больше конкретики, что изучаю, на что оно вообще похоже и какие

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

Женщина-программист? Продолжаю обучение IT, Python, Программирование, Обучение, Длиннопост

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

Женщина-программист? Продолжаю обучение IT, Python, Программирование, Обучение, Длиннопост

- у меня в голове монотонным голосом бубнится как "Пока переменная k меньше либо равно 311, делай это: если остаток от деления k на два равен 0, то печатай это и прибавь к k единицу..." и т.п. Это как чтение со словарем - медленно, вдумчиво. В будущем, надеюсь, буду читать бегло.


С исключениями тоже не всегда было понятно. Исключения, по простому - это защита от дурака. Например, вы просите пользователя указать свой год рождения в формате "4 арабские цифры". А он, негодяй, пишет вам все что угодно - и прописью, и римскими цифрами, или вообще ставит пробел. В общем, все не то! На этот случай, чтобы программа не ушла в крутое пике, нужно прописать исключения - все варианты, которые юзер может ввести от глупости или от скуки. Было сложно понять, когда эти исключения надо "ловить" в цикле, а когда - в основном теле программы. Все эти нюансы очень влияют на гибкость, понятность и в целом на чистоту кода.


Чистота кода - это в том числе про это:

Женщина-программист? Продолжаю обучение IT, Python, Программирование, Обучение, Длиннопост

Честно, я поначалу бесилась, когда наш проверяющий придирался к таким мелочам как лишний пробел в строке или имя переменной. Скрипела зубами - мы же не уроке английского! И это при том, что у меня инглиш на среднем уровне есть. Общее правило - имена переменных должны быть "говорящими". То есть a и b - это плохо. А name и surname - хорошо. Плюс учитываем контекст. Конечно, если вы пишете код для себя или в стол, можно забить. Но нас учат сразу писать чисто, с прицелом на будущих заказчиков или коллег.

Ну, чтобы вот так было:

Женщина-программист? Продолжаю обучение IT, Python, Программирование, Обучение, Длиннопост

Еще училась наводить порядок не только в коде, но и в голове. Честно, я не знаю, как тру-программисты пишут, но я стала понимать важность предподготовки. То есть - перед тем как выполнять большую практику, ты должен сделать 3 вещи:

- общий анализ задачи (мы хотим в итоге стул или стол?)

- общий план (для стула пойдет береза или лучше взять дуб? какая высота, ширина?)

- детальный план, он же алгоритм (чертим проект стула со всеми нюансами, вплоть до оттенка

краски)


Вот тут я тоже сделала открытие. Всегда думала, что люблю работать с документами, писать сопроводительные записки и проч. Но алгоритм - это не сочинение) Пришлось перестраивать мышление от "Да по ходу разберемся, главное начать" до "Так, у нас стоит такая-то задача, ее нужно разбить на несколько подзадач, применить вот этот метод..." Можно использовать блок-схемы, но мне удобнее текстовый формат.


Блок-схемы  - для перфекционистов, можно все выверить по линеечке и даже по CMYK! 

Красивое...

Женщина-программист? Продолжаю обучение IT, Python, Программирование, Обучение, Длиннопост

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


Особняком тут еще стоит рекурсия - да-да, вот эти шутки из серии:

Женщина-программист? Продолжаю обучение IT, Python, Программирование, Обучение, Длиннопост

Я честно говоря не поняла, к чему можно привлечь рекурсию в плане решения практических задач, но тема просто крышесносная :) Посмотрите хотя бы пример с факториалом. Рекомендую!


Еще расскажу про забавное совпадение. Писала большой код, суть программы такая - задаем команду, параметры и получаем на выходе рисунок из символов. Рисунков на выбор несколько, один из них ромб. Я долго пыхтела над уравнением для ромба, как сделать его симметричным, правильным и т.д. И тут на Пикабу случайно вижу это:

Женщина-программист? Продолжаю обучение IT, Python, Программирование, Обучение, Длиннопост

Для моего кода это решение не годилось, но это же мой любимый феномен Баадера — Майнхоф в действии. Приятная мелочь.


В теме с функциями изучала некоторые методы для строк. Очень интересное наблюдение, что все эти методы типа .lower, .replace, .strip не изменяют исходную строку, а вызывают ее копию с изменениями. Очень идет в разрез например с работой в Word. Там жмякнул - "Найти и заменить", и все, документ уже изменился фактически. А здесь создаются параллельные миры со своими жизнями. Как в известном фильме:

Женщина-программист? Продолжаю обучение IT, Python, Программирование, Обучение, Длиннопост

Кто не видел - очень советую фильм "Осторожно, двери закрываются", 1998 г.


В прошлом посте я отдельно поднимала тему мотивации. Как ее решаю? Да никак, просто занимаюсь по графику, и все. Фиксирую свои успехи, это хорошо подстегивает. А бывает, что наоборот не могу вникнуть в тему, или конкретная задача не поддается. Открываешь решение - мамочки, да как до этого можно было додуматься... Чувствуешь себя тупицей, потом перечитываешь материал, гуглишь, через пару дней возвращаешься к этому же месту - вроде понятнее стало, хотя бы местами, хорошо. Еще через пару дней пробуешь решить снова, и теперь получается.


И как ни странно, в последние недели программирование для меня стало хорошей

отдушиной. Потому что без конца листать новостную ленту уже сил нет.


Расскажете о вашем опыте программирования, новички и матёрые?


Про себя буду держать в курсе. Всем удачи и веры в себя!

Показать полностью 8
[моё] IT Python Программирование Обучение Длиннопост
64
102
zolotorevich
zolotorevich
2 года назад

Дневник разработки «Pirate Parrot». Часть I: Дизайн и комбайн⁠⁠

Дневник разработки «Pirate Parrot». Часть I: Дизайн и комбайн Python, Программирование, Дизайн, Логотип, Компьютерные игры, Видео, YouTube, Длиннопост

лл: делаем сайт, который находит новые игры на торрентах и постит их описание в Телегу. Рисуем лого, интерфейс и пишем код на Пайтоне.

* * *

Приглашаю окунуться в магический мир разработки программного обеспечения, полный приключений, неизвестности, страданий и сожалений о своих решениях. Мы с вами пройдём путь от идеи «Телеграм-канал с описанием новых игр на торрент-трекерах» до сайта, который их находит и публикует.

Процесс сильно упрощён для простоты понимания, однако, вам всё же потребуются знания школьной программы: что такое переменная, массив, функция, операторы IF и FOR. Ещё нужно знать, что сайты состоят из HTML и работают особо-шумных компьютерах под названием «серверы». Остальное объясню на пальцах.

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

Хватит разговоров, пора мешки ворочать. Открываем творение Дурова и пишем пост об одной игре, чтобы знать к какому результату стремиться. Чем чётче цель, тем проще к ней двигаться:

Дневник разработки «Pirate Parrot». Часть I: Дизайн и комбайн Python, Программирование, Дизайн, Логотип, Компьютерные игры, Видео, YouTube, Длиннопост

Чтобы делать такие посты нам потребуются:

• Трейлер игры
• Три скриншота
• Жанры
• Описание
• Минимальные системные требования
• Рейтинг на Метакритике

Собирать всё это будет программа, которая работает на сервере и управляется через веб-сайт, он же «панель управления». Нам предстоит её научить:

• Загружать список игр с Рутрекера.
• Сохранять в базу данных название, описание и жанры игры.
• Скачивать скриншоты.
• Искать и скачивать трейлеры с YouTube.
• Искать и сохранять рейтинг на Metacritic.
• Показывать описание, трейлеры и скриншоты в панели управления.
• Отправлять это всё в Телеграм.

Звучит не сложно. Начнём с названия, логотипа и интерфейса.

Дневник разработки «Pirate Parrot». Часть I: Дизайн и комбайн Python, Программирование, Дизайн, Логотип, Компьютерные игры, Видео, YouTube, Длиннопост

Рабочее название проекта: «Pirate Parrot». Как-то сразу в голову пришло. Звучит настолько попсово, что даже не стал проверять занять ли домены — наверняка заняты — и существуют ли похожие проекты с таким названием — наверняка существуют.

За пару дней раздумий ничего толкового не придумал. Каково же было удивление, что домен «pirateparrot.ru» свободен. Ладно, берём его для сайта-заглушки и ещё один, не скажу какой, для панели управления.

Корабль назвали и ему нужен логотип, а точнее флаг. Пиратский флаг с черепом. Но не простой, а цифровой. Мой любимый торрент-клиент «Transmission» показывает доступность файлов у сидеров в виде цветных блоков. Отличная метафора для проекта: череп из блоков доступности торрента.

Дневник разработки «Pirate Parrot». Часть I: Дизайн и комбайн Python, Программирование, Дизайн, Логотип, Компьютерные игры, Видео, YouTube, Длиннопост

Находим референс в Гугле, сдуваем пыль с графического планшета и рисуем как умеем. Мозайку Фотошоп сделаем сам, нам останется только перенести её в вектор. Да, царапины на клюве плохо видны, но этот и ещё парочку косяков поправим позже. Сейчас главное выпустить «Версию 1.0» как можно быстрее, а не идеально.

Поговаривают, что нейросети заменят дизайнеров и программистов. Ну чтож, робот, удиви меня! Нарисуй этот логотип лучше:

Дневник разработки «Pirate Parrot». Часть I: Дизайн и комбайн Python, Программирование, Дизайн, Логотип, Компьютерные игры, Видео, YouTube, Длиннопост

Н-да… Код, пожалуй, сам напишу.

Займёмся интерфейсом. В интересах времени опущу промежуточные варианты. Не думайте, будто всё получилось с первой попытки:

Дневник разработки «Pirate Parrot». Часть I: Дизайн и комбайн Python, Программирование, Дизайн, Логотип, Компьютерные игры, Видео, YouTube, Длиннопост

• Точка перед пунктом меню — индикатор новых торрентов. Сейчас мы сделаем только игры, а остальные оставим на будущее.

• ARW — переключатель «Await, Rejected, Weekly» или «Ожидают публикации, Отклонённые, Дайджест за неделю».

• Status — главная страница со статистикой и управлением программой.

• Если навести курсор на скриншот, то он появится вместо видео.

• «Original text» показывает текст описания торрента вместо видео и скриншотов.

• Удалять видео и скриншоты нельзя, да это и не нужно.

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

• Кнопка без подписи. И так понятно, что она делает.

• Логотип — это индикатор конца списка.

Как же приятно работать, когда не нужно ни с кем нянчиться. Будь тут «эффективный менеджер», сейчас бы выслушивал про «негативный образ смерти в логотипе, кнопки без подписей никто не делает, логотип должен быть как можно выше на странице» и сотни других претензий. Получилась бы постная ерунда с улыбающимся попугайчиком в пиратской шляпе и интерфейс с кучей никому не нужных текстовых подсказок.

Ладно, достаточно желчи, займёмся кодом. На самом деле нам предстоит написать две программы:

1. Комбайн — по расписанию заходит на трекер, проверяет нет ли там чего нового и сохраняет информацию об играх в базу данных.

2. Панель управления — сайт, который читает ту же базу данных, позволяет нам редактировать инфу об игре и отправляет её в Телеграм.

— Зачем две, когда это может сделать одна?
— Горизонтальное масштабирование.

Когда программа обрастает новыми функциями, к примеру загрузкой свежих фильмов, ей нужно больше вычислительных мощностей. Если программа одна, то единственный способ дать ей их — это увеличить число процессоров и ОЗУ сервера, что называется «вертикальное масштабирование». Но память и процессоры не получится наращивать до бесконечности, а арендовать два сервера выйдет дешевле, чем один с аналогичной мощностью — это и называется «горизонтальное масштабирование».

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

Комбайну и панели управления всё равно, что они работают на разных серверах. Мы даже сможем запустить несколько Комбайнов и одну панель управления. Главное — единая база данных. Кстати, самое время её создать:

Дневник разработки «Pirate Parrot». Часть I: Дизайн и комбайн Python, Программирование, Дизайн, Логотип, Компьютерные игры, Видео, YouTube, Длиннопост

• url — ссылка на игру на трекере. Показывать её в Телеге не будем, а то канал забанят. @freedomist уже добаловался со своим ботом :-D

• rawTitle — название игры на трекере. Понадобится для поиска новых игр.

• rawText — весь текст описания игры с трекера.

• title, description, genre — эти поля будем отправлять в Телеграм.

• sysCPU, sysGPU, sysRAM — минимальные системные требования.

• ratingCritics и ratingUsers — рейтинг с Метакритика.

• screenshotsFilename — имена файлов всех скриншотов игры.

• selectedScreenshots — скриншоты, которые мы выбрали для публикации в Телеграм-канале.

• videoURL и videoFilename — трейлер с YouTube.

• status — статус торрента: «ожидает публикации / await», «отклонён / reject», «опубликован / published».

• date — дата добавления.

Прелюдии закончились, открываем редактор кода:

Дневник разработки «Pirate Parrot». Часть I: Дизайн и комбайн Python, Программирование, Дизайн, Логотип, Компьютерные игры, Видео, YouTube, Длиннопост

Если не программировали на Пайтоне, то ничего страшного — тоже недавно с ним познакомился :-) Вот что тут происходит:

На первой строчке мы импортируем файл «classTorrents». Грубо говоря, вместо неё будет код из этого файла, со всеми переменными и функциями, с которыми мы можем работать.

Помимо файлов, в Пайтоне можно импортировать целые программы — «модули», которые написаны другими программистами. Скажем, нам нужно записать что-то в базу данных под управлением MySQL. Мы могли бы написать код, который откроет подключение к этой СУБД, подготовит запрос, отправит и оповестит об успехе или ошибке. Но зачем тратить время? Находим в интернете модуль «mysql», устанавливаем, импортируем, передаём ему данные и логин/пароль об базы. Остальное он сделаем сам. Аналогично поступим со скачиваем видео с YouTube, получением HTML страниц и отправкой сообщений в Телеграм — всё это будут делать модули, бесплатно доступные в сети и написанные кем-то поумней нас с вами :-)

На четвёртой строчке кода мы создали объект класса «RuTrackerGames» из файла «classTorrents». Если не знакомы с «Объектно-ориентированным программированием / ООП», то представьте, что вы инженер и собираете новую модель самолёта. Как-то утром вы подходите к токарю и говорите:

— Иван Николаевич, а сделайте-ка мне десяток титановых болтов, пожалуйста.

Не сложно догадаться, на какие три буквы вас пошлёт мастер. И будет прав. Без чертежа болты никто делать не станет. Классы в ООП — это чертежи, а объекты — это болты. Без чертежа нельзя сделать болт, а с чертежом можно наклепать хоть вагон болтов. Но чертежом нельзя прикрепить крылья к фюзеляжу самолёта, так же и классы не выполняют код, пока не создашь объект.

Классы определяют свойства и методы объектов. Например, свойства болта: цвет, материал, размер и вес. Методы — то, что можно сделать с объектом — закрутить, раскрутить, потерять, сдать в металлолом или положить на чьё-то мнение. Методы в Пайтоне, так же как и функции, начинаются со слова «def»: «def propit_bolt():».

Классы могут наследовать методы и свойства других классов. Скажем, потребовались болты «№45» с левой резьбой. Вы делаете чертёж только резьбы, подписываете «для остальной части болта см. чертёж „Болт №45“» и Иван Николаевич приступает к работе.

Теперь у нас достаточно знаний, чтобы написать класс RuTrackerGames:

Дневник разработки «Pirate Parrot». Часть I: Дизайн и комбайн Python, Программирование, Дизайн, Логотип, Компьютерные игры, Видео, YouTube, Длиннопост

Наследование нам потребуется в будущем. Чтобы собрать игры с трекера «Demonoid», нужно создать класс «DemonoidGames» и написать два метода: получить список новых игр и описание каждой. Запись в базу и пропуск уже добавленных сделают родительские классы «Torrents» и «GamesTorrents». Придёт черёд собирать фильмы — новый класс «MovieTorrents», который наследует логику класса «Torrents». И так далее.

Если вы ещё не переключились на видео с котиками, чтобы дать психике отдохнуть, то напишем пару интересных функций. Скачиваем видео с YouTube:

Дневник разработки «Pirate Parrot». Часть I: Дизайн и комбайн Python, Программирование, Дизайн, Логотип, Компьютерные игры, Видео, YouTube, Длиннопост

Соберётесь использовать модуль «yt_dlp» в своём проекте — делайте его классом, а не функцией, т.к. единственный способ получить имя файла после загрузки, это вызвать функцию «filename_hook», в которую модуль передаст имя. Но чтобы вытащить его оттуда, придётся сделать костыль — объявить глобальную переменную «filename» на строках 22 и 24. Это скользкая дорожка. Всё начинается с безобидных глобальных переменных, и вот ты уже не замечаешь, как лепишь GOTO для выхода из условного оператора.

В следующей версии программы обязательно перепишем эту функцию в класс. А пока добавим Телеграм бота, который будет отчитываться о работе Комбайна и оповещать, если что-то пошло не так:

Дневник разработки «Pirate Parrot». Часть I: Дизайн и комбайн Python, Программирование, Дизайн, Логотип, Компьютерные игры, Видео, YouTube, Длиннопост
Дневник разработки «Pirate Parrot». Часть I: Дизайн и комбайн Python, Программирование, Дизайн, Логотип, Компьютерные игры, Видео, YouTube, Длиннопост

Все файлы программы:

• env — папка с модулями.

• app.py — файл запуска программы.

• classTorrents.py — классы Торрентов.

• classWebImage.py — классы для загрузки картинок с сайтов Fastpic, Imageban и др.

• config.py — настройки программы.

• gamesGenres.py — приводит названия жанров игр к единому формату. Например, меняет «First Person Shooter» на «Шутер от первого лица», а «Ролевая игра» на «РПГ». В коде класса «RuTrackerGames» вызов этой функции убран для простоты понимания.

• reportMaster.py — Телеграм-бот для сообщений об ошибках.

• requirements.txt — список подключённых модулей.

• support.py — мелкие функции, вроде скачивания видео, поиска по тексту и удаления мусора из него.

Настало время запустить Комбайн. Открываем терминал и «Поехали!»:

Проверим что он записал в базу данных:

Дневник разработки «Pirate Parrot». Часть I: Дизайн и комбайн Python, Программирование, Дизайн, Логотип, Компьютерные игры, Видео, YouTube, Длиннопост

Супер! Осталось сделать панель управления и оформить Телеграм-канал. Этим займёмся в следующей части ;-)

А пока зацените результат: https://t.me/flint_games

Показать полностью 12 1
[моё] Python Программирование Дизайн Логотип Компьютерные игры Видео YouTube Длиннопост
13
101
Timeweb.Cloud
Timeweb.Cloud
1 год назад
TECHNO BROTHER
Серия Старое железо

Эмуляция сотового телефона… на сотовом телефоне⁠⁠

Эмуляция сотового телефона… на сотовом телефоне Python, Timeweb, Мобильные телефоны, IT, Электроника, Эмулятор, Видео, YouTube, Длиннопост

Многие помнят линейку телефонов Siemens 65-75 серии, которые были в ходу около 20 лет назад. Мы попробуем провести необычный эксперимент на их основе, для чего напишем небольшую управляющую библиотеку на C, а также изменим код одной из встроенных в ОС Linux утилит. Подробнее в статье.

❯ 1. Аппаратная часть


В серии телефонов «Siemens 75» существовали такие модели, как C75, ME75, CX75 и прочие. Они различались между собой дизайном корпуса и некоторым другим функционалом. Но их основные элементы были, во многом, схожи. Например, дисплей разрешением 132x176. Для работы с данным проектом в коробке с различным электронным мусором были обнаружены останки подобного телефона. Состояние изделия за 20 с лишним лет очень плохое, надписи стёрлись, но я предполагаю, что это был экземпляр телефона C75 – BenQ, позднего выпуска. Родной процессор телефона давно уже умер — какое-то время назад удавалось оживить его, прогрев плату паяльным феном, но теперь осталась лишь безжизненная плата и оболочка. Поэтому я решил перехватить информацию на уровне дисплея.

Нас интересует, в первую очередь, этот самый дисплей. Поэтому, для начала, разберём устройство:

Эмуляция сотового телефона… на сотовом телефоне Python, Timeweb, Мобильные телефоны, IT, Электроника, Эмулятор, Видео, YouTube, Длиннопост

Поскольку любая наука стоит «на плечах гигантов», я не буду повторять материал о видах дисплеев в данном телефоне. Ознакомиться с ним вы можете самостоятельно, это описал ещё в 2013 году Кизим Игорь, в своей статье.

У меня уже был некоторый опыт работы с данным дисплеем. Используя библиотеку, взятую из статьи Игоря, я подключал данный дисплей к микроконтроллеру ATmega8. Однако, это было более 5 лет назад, поэтому, для начала, я решил проверить, а работает ли вообще данный дисплей. Для чего собрал схему Игоря. Её ключевые особенности: установлен стабилитрон по питанию дисплея (5V -> 2.9V), установлены резисторы для понижения уровней логики (5V -> 3.3V). Однако, нам необходимо ещё одно напряжение – 12V, для питания диодной ленты подсветки. Поскольку я не хотел городить дополнительный инвертор, я расковырял подсветку и заменил диоды на те, которые могут работать напрямую от 5V, подсоединив их не последовательно, а параллельно. Таким образом я избавился от лишнего провода питания, хотя и качество подсветки несколько пострадало.

Теперь я имел 2 провода питания (+5V, GND), и 5 сигнальных проводов с уровнем логики 3.3V.

Однако, контроллера ATmega8 под рукой не оказалось, но был китайский клон Arduino Uno на ATmega328. Я попытался поискать библиотеку Arduino под этот дисплей, и нашёл такую. Но она была заточена под ESP8266. Хотя идею замены SPI в функции Send_to_lcd с программного на аппаратный я намотал на ус:

Эмуляция сотового телефона… на сотовом телефоне Python, Timeweb, Мобильные телефоны, IT, Электроника, Эмулятор, Видео, YouTube, Длиннопост


В итоге я взял оригинальную библиотеку Игоря (Igoryosha), и портировал её под Uno, просто заменив в текстовом редакторе функции присваивания (напр. LCD_CLK=0) на ардуиновские digitalWrite(LCD_CLK, LOW). Библиотека запустилась без особых проблем.

Так как в ней используется программная имитация SPI, выводы GPIO можно назначить произвольно (кроме тех, что заняты RX TX). Библиотеку под Arduino Uno для данного дисплея в итоге я оставил у себя на github, в ветке main.

Результат запуска программы и скорость работы такого SPI можно увидеть наглядно на видео:


Теперь можно подсобрать телефон для удобства работы. Я вытащил динамик, чтобы вывести провода через отверстие.

Эмуляция сотового телефона… на сотовом телефоне Python, Timeweb, Мобильные телефоны, IT, Электроника, Эмулятор, Видео, YouTube, Длиннопост

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

❯ 2. Подключаем Orange Pi GPIO


Как можно было увидеть в предыдущем фрагменте, скорость отрисовки картинки просто черепашья. Оно и неудивительно: контроллер работает всего лишь на 16 МГц, ещё и использует программный SPI для вывода картинки. Ситуацию нужно исправлять, взяв более мощный и производительный контроллер. Тут я натыкаюсь на статью хабровчанина Hoshi.

В ней он данный дисплей подключает к Raspberry Pi, и использует его как «монитор». Поскольку мы стоим на плечах гигантов, было решено проследовать его примеру, и не изобретать ещё какие-либо методики. Но Raspberry Pi у меня не оказалось, нашёлся только Orange Pi PC.

Поэтому запустить код Hoshi без переделки у меня бы не вышло: в своей статье он оперирует GPIO через библиотеки чипсета bcm2835. Так как данного чипсета на моей плате нет, и библиотеку подключить не выйдет. Я начал поиски способа, как подключить GPIO на моём чипсете h3. Выяснилось, что для этого нужна библиотека wiringPi (на текущий момент уже не поддерживается официальными авторами). Однако, просто установить её через apt-get оказалось мало: устанавливался оригинал под Raspberry. Спустя некоторое время была найдена модификация этой библиотеки от zhaolei. Я собрал её через build (ветка h3), и именно она оказалась рабочей для моей платы. После выполнения build библиотека установилась в систему, и стало возможным вызвать её из требуемого места (например, проверить пины с помощью sudo gpio readall).

Назначение выводов GPIO для «апельсина» назначается через define по аналогии с Arduino:

Эмуляция сотового телефона… на сотовом телефоне Python, Timeweb, Мобильные телефоны, IT, Электроника, Эмулятор, Видео, YouTube, Длиннопост

Также следует отметить следующий момент: в схеме Igoryosha для AVR использовался логический уровень +5В, а на Orange Pi разъем GPIO сразу оперирует уровнями +3.3В. Поэтому резисторные делители я убрал. В итоге получилась следующая конструкция:

Эмуляция сотового телефона… на сотовом телефоне Python, Timeweb, Мобильные телефоны, IT, Электроника, Эмулятор, Видео, YouTube, Длиннопост

Однако, у меня сходу не получалось завести аппаратный SPI. Поэтому для повторной проверки работоспособности дисплея я взял, опять же, библиотеку Игоря из-под AVR, портировав её теперь и под wiringPi. К счастью, особых замен не понадобилось, только поменять в коде LOW и HIGH на 0 и 1 соответственно. Даже функции delay в wiringPi аналогичны ардуиновским. Также на данном этапе библиотека лишилась практически всех графических функций отрисовки примитивов, кроме отрисовки, непосредственно, одного кадра из буфера.
После чего я собрал программу через gcc (gcc –o example example.c –lwiringPi), и запустил из терминала.

Результат можно увидеть на видео:


Однако разницы, по сравнению с Arduino, практически нет. Отрисовка стала шустрее, но лишь немножко. Оно и неудивительно: чаще всего вызывается метод передачи по SPI (Send_to_lcd), а так как он у нас всё ещё программный, прироста в скорости мы не видим, сам GPIO работает достаточно медленно, по скорости сопоставим с обычным Arduino. Поэтому нам нужно исправлять ситуацию, задействовав аппаратный SPI.

❯ 3. Подключаем аппаратный SPI


Для замены программного SPI на апаратный можно, также, задействовать библиотеку wiringPi, а именно, из wiringPiSPI.h использовать функции wiringPiSPISetup и wiringPiSPIDataRW. Функции эти несколько хитрые. Но перед тем, как их использовать, нужно включить этот самый SPI. Информации о том, как это сделать конкретно на Orange Pi PC также в интернете нет, но удалось найти направление, в котором нужно искать. Немного погуглив, я выяснил, что spi включается правкой файла /boot/armbianEnv.txt (актуально для моей версии системы Armbian_23.11.1_Orangepipc_jammy_current_6.1.63_xfce_desktop.img).

В него нужно добавить следующие строки:

Эмуляция сотового телефона… на сотовом телефоне Python, Timeweb, Мобильные телефоны, IT, Электроника, Эмулятор, Видео, YouTube, Длиннопост
Эмуляция сотового телефона… на сотовом телефоне Python, Timeweb, Мобильные телефоны, IT, Электроника, Эмулятор, Видео, YouTube, Длиннопост

После чего сделать sudo reboot, и у нас в /dev/ появляется spidev0.0. Проверить это можно, выполнив команду ls /dev | grep spi. Если spidev0.0 появился, дальше библиотека wiringPiSPI подхватит его. Теперь контакты дисплея CS, CLK, DATA нужно подключить к пинам SPI0, как это сделано у Hoshi. Распиновка (40-pin) полностью соответствует Raspberry Pi. Пины RS и RESET оставляем на попечении обычного GPIO.

Однако, просто заменив SPI на аппаратный, я заметил, что FPS отрисовки практически не поменялся. Проблема заключалась в том, что если отправлять по одному байту, то с каждой посылкой SPI будет заново открываться и закрываться, а эта процедура отнимает очень много времени. Поэтому было решено отправлять данные пачками максимально возможной длины.

Возникла следующая проблема: буферизация пакетов SPI. На данном устройстве мы можем отправить только 4 килобайта данных за одну посылку. Наша страница же занимает порядка 44 Кб: 132*176*2, так как используется 16-битная цветность. В качестве решения можно было либо увеличить буфер SPI, что возможно, однако, мне не хотелось прибегать к данной методике. Поэтому я просто в своём коде раздробил страницу на 11 пачек:

Эмуляция сотового телефона… на сотовом телефоне Python, Timeweb, Мобильные телефоны, IT, Электроника, Эмулятор, Видео, YouTube, Длиннопост

И используя memcpy, копировал перед отправкой каждую пачку в буфер. К слову, это необходимо ещё и потому, что буфер побайтово очищается в процессе передачи, заменяя выходные данные на входные с буфера RX (MOSI pin).

Также библиотека позволяет регулировать скорость: от 500 КГц до предела в 32 МГц. Делается это в момент инициализации: int fd = wiringPiSPISetup(0, 32000000); мы выставляем канал 0, и скорость в 32 МГц.

После вышеописанных процедур мне удалось получить скорость кадров в 60 FPS. Я не уверен, способен ли дисплей отрисовать данные с такой скоростью, но таймер рапортовал именно так. Можно увидеть это на видеозаписи:


На первой половинке видео можно увидеть кусочек области дисплея, который передаётся за одну отправку (4096 байт), это примерно одна десятая всей экранной области. Скорость шины выставлена в 500 КГц. На второй половинке отправка всех 11 областей, и скорость шины в 32 МГц. То есть, скорость передачи примерно порядка 20 Мбит/сек. В данном случае, я считаю, достигнут потолок пропускной способности всей нашей сборки.

❯ 4. Выводим статичный bmp кадр


Следующее, что сделал Hoshi в своей статье – вывел статичную картинку, получив проблемы с цветностью. Поскольку я иду по его стопам, я попробовал вывести картинку из буфера, используя частично его код, поменяв только сдвиг (offset, так как мой заголовок занял другое количество байт). Однако, сначала я получил такую картинку, как показана на левой части изображения, и, лишь потом, такую, как на правой:

Эмуляция сотового телефона… на сотовом телефоне Python, Timeweb, Мобильные телефоны, IT, Электроника, Эмулятор, Видео, YouTube, Длиннопост

Я взял такую же картинку, как у Hoshi, и получил примерно такой же результат. Подводный камень заключался в следующем:

  1. Два байта нужно поменять местами, этот момент был в коде Hoshi. Либо же добавить/убрать один лишний байт в начале пакета, чтобы вызвать сдвиг всего массива.

  2. Я сохранил исходную картинку через Adobe Photoshop в формат BMP 16-bit. Однако, как выяснилось после просмотра в HEX-редакторе, белый цвет у меня получился не FF FF, а FF 7F, вследствие чего он отображался, как бирюзовый, и остальные цвета также имели искажения:

Эмуляция сотового телефона… на сотовом телефоне Python, Timeweb, Мобильные телефоны, IT, Электроника, Эмулятор, Видео, YouTube, Длиннопост

Произошло это из-за того, что редактор сохранил BMP файл в режиме X1R5G5B5 (с альфа-каналом), а у нас в дисплее используется R5G6B5, то есть, зелёный цвет занимает на один бит больше. Поэтому, при скармливании картинки дисплею, мало того, что один из старших битов пропадает, так ещё и происходит бинарный сдвиг одного цветового канала на единицу, из-за чего вся палитра оказывается искажена. После сохранения картинки в нужном режиме значения белого заменились на FF FF, потери одного бита данных больше не было, и она отрисовалась с нормальной цветностью.

На этом построение библиотеки для работы с дисплеем было закончено, и началось самое интересное – попытка вывести на него живой видеопоток.

❯ 5. Пишем ПО для захвата экрана


Далее вышеупомянутый автор для рендеринга использует интерполяцию из фрейм-буфера ОС Linux /dev/fb0. Попытка запустить его код не привела ни к чему хорошему: в моём случае фреймбуфер отображается как чёрная сетка из-за несоответствия данных, да и мне не нужно было проводить интерполяцию картинки всего рабочего стола, а нужна была конкретная область экрана.

Эмуляция сотового телефона… на сотовом телефоне Python, Timeweb, Мобильные телефоны, IT, Электроника, Эмулятор, Видео, YouTube, Длиннопост

Слева: отрисовка из /dev/fb0. Справа: отрисовка из скриншота.

Так как моя GUI в Armbian работает на графической оболочке XFCE, у меня возникла идея выдрать требуемые пиксели непосредственно через неё. Для этого используются средства gdk и x11. Добавление всех необходимых библиотек сильно усложнило бы программу, поэтому мне пришлось прийти к костыльному решению проблемы.

Я решил копнуть в сторону встроенной в ОС утилиты xfce4-screenshooter. Данная утилита позволяет снять скриншот, в том числе, через командную строку. Однако, функции сохранения заданной области в ней нет, либо требуется задавать каждый раз область мышкой, что было мне неудобно. Поэтому я сделал форк кода данной утилиты. И добавил в опции командной строки, помимо FULLSCREEN, WINDOW и REGION ещё и аргумент FIXED, который сохранял в файл конкретно прописанную в коде область экрана.

Для удобства разработки пришлось поставить xubuntu на виртуальную машину с x86, после чего изменить исходный код, а затем собрать его же, но под armbian непосредственно на своём Orange Pi. Сборка утилиты осуществляется помощью xdt-autogen: сначала ./autogen.sh, далее установить библиотеки по требованию (через apt-install) затем с помощью make, и make install для замены установленного в систему скриншоттера на изменённый вариант. После этого готовый скриншот нужного размера стало можно выводить в файл с помощью одной лишь команды терминала – для определения файлового пути, формата и прочего используется оригинальный код скриншоттера.

Эмуляция сотового телефона… на сотовом телефоне Python, Timeweb, Мобильные телефоны, IT, Электроника, Эмулятор, Видео, YouTube, Длиннопост

Однако, данное решение имеет и недостаток: программа-скриншоттер работает, вероятно, таким образом, что сначала делает скриншот всего root-окна (рабочего стола), затем обрезает его до требуемого размера. При этом, на какой-то момент, отрисовка даже приостанавливается. Вся процедура съемки занимает порядочное количество времени: на десктопе xubuntu она осуществлялась примерно за 50-100 миллисекунд. На Orange Pi она же стала занимать порядка 100-400 миллисекунд. Видеозахват – в целом тяжелая процедура для ЦПУ. Поэтому уменьшение разрешения рабочего стола помогло, но незначительно. В идеале нужно выдирать изображение через низкоуровневый код непосредственно из экранной памяти, а не из пользовательской среды через функции gdk. Более того, в самом коде скриншоттера написано, что рекомендуемая задержка между скриншотами должна быть не менее 200 мс, то есть, это уже ограничивает нас до 5 FPS. В случае, если нужно просто проверить консольный вывод, этого достаточно, а вот для видеопотока оказалось маловато.

Прим. авт.: через некоторое время после написания статьи, мне удалось решить данную проблему, используя вместо скриншоттера ПО jsmpeg-vnc. С ним я получил 50 FPS и выше, плюс имеются встроенные функции обрезки кадра до нужного размера.

Данное ПО передаёт MPEG-поток через WebSocket протокол (выполняя трансляцию видеосигнала), позволяет закодировать только нужную область, чтобы не передавать весь рабочий стол. Далее кадр можно расшифровать и передать непосредственно в контроллер, минуя костыль в виде отображения его на экране и снятия скриншота. Если это будет интересно, можно показать подробнее в следующей статье.


Также, поскольку сохранение в bmp происходит через встроенные средства gdk, мне не удалось заставить программу сохранять в 16-битный формат. Она сохраняла в 24-битный формат, поэтому для преобразования цветовой палитры мне пришлось написать фрагмент кода на бинарных сдвигах:

Эмуляция сотового телефона… на сотовом телефоне Python, Timeweb, Мобильные телефоны, IT, Электроника, Эмулятор, Видео, YouTube, Длиннопост

Изначально содержимое нашего скриншота копируется в массив байтов (uint8_t) в порядке очередности. Для конвертации цвета 24bit -> 16 bit (ещё и с перевёрнутым порядком байтов) использованы сдвиги: мы сравниваем первый байт красного с пятью единицами, далее сравниваем второй байт зелёного с тремя единицами и сдвигаем результат в самое начало, далее сравниваем следующие разряды байта зелёного и сдвигаем в самый конец, далее сравниваем синий и сдвигаем его в середину. Таким образом, из цветности КККККККК ЗЗЗЗЗЗЗЗ ССССССС мы привели палитру к цветности ЗЗЗССССС КККККЗЗЗЗ, которую и принимает наш дисплей. Для отладки я использовал цветные картинки, после чего смотрел, корректно ли отображается цвет согласно своему описанию, или же цветовой канал требуется сдвинуть ещё на какое-то количество ячеек.

После чего я в цикле запустил скриншоттер через вызов терминала, а далее отрендерил картинку на экран. Это можно увидеть на видео:


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

  • Через терминал вызывается скриншоттер, который сохраняет кадр в cache.bmp;

  • Файл cache.bmp открывается, после чего отправляется его содержимое на дисплей.

Причём, основная потеря скорости идёт на этапе снятия скриншота, а не записи/чтения его с диска. Для увеличения FPS выше 5 необходимо заменить xfce4 скриншоттер на какое-то другое ПО. Тем не менее, мы движемся дальше.

❯ 6. Эмуляция сотового телефона


Эмулятор телефона CX75 был написан лет 20 назад, и входил в официальный пакет программ для разработки java-приложений через WTK/JDK 2.0. Он пролежал у меня на жестком диске лет 15, после чего я запустил его для данной работы. Если кому-то интересно также запустить его на своём компьютере, делюсь файлами.

Для работы требуется JDK 6u45 и Windows XP. Насколько я помню, даже при запуске на Windows 7 эмулятор вылетал, на Win 10, тем более, работоспособность я не проверял. Поэтому запускать я его буду через виртуальную машину с WinXP.

Эмулятор полностью реализует функционал прошивки телефона 75-й серии, в том числе, можно устанавливать java-игры, подключать веб-камеру для съемки фото, и так далее. Единственное, вряд ли будет работать интернет, по причине того, что WAP технологии уже не получится использовать.

Вот так эмулятор выглядит в системном окне. Управлять можно с клавиатуры (джойстик – стрелки и enter, клавиши – цифры или тачпад), либо нажатием на виртуальные кнопки.

Эмуляция сотового телефона… на сотовом телефоне Python, Timeweb, Мобильные телефоны, IT, Электроника, Эмулятор, Видео, YouTube, Длиннопост

Выдаёт он картинку чётко размера 132x176, поэтому интерполяция не потребуется. Теперь нужно прокинуть картинку из виртуальной машины в Linux машину. Можно было использовать wine, но я не уверен, будет ли эмулятор адекватно работать на нём. Поэтому он запущен в XP. Для передачи картинки, опять же, ничего нового изобретать я не буду, использую TightVNC.

На Windows мы устанавливаем сервер, на armbian’е устанавливаем клиент через apt-get xtightvncviewer.

После чего запускаем клиент-сервер, и выставляем на экране требуемую зону отображения. FPS в данном случае также примерно равен 5 кадрам, поэтому дисплей будет рендерить с точно такой же скоростью.

И вот момент, ради которого всё затевалось: помещаем эмулятор телефона в экранную область на самом телефоне

Видео:


Таким образом, наш видеопоток проходит через следующие уровни:

  • Эмулятор CX75 (x86 C-программа, но порт ARM-совместимой прошивки);

  • Windows XP (виртуальная машина);

  • Windows 10 (через виртуализацию, но можно пропустить, выведя в VNC напрямую с XP);

  • Armbian xfce4 gui (через VNC);

  • Изображение cache.bmp (через xfce4-screenshooter);

  • Дисплей C75 (через wiringPi + wiringPiSPI).


Для эмуляции же клавиатуры достаточно просто припаять контактные площадки к контроллеру от USB-клавиатуры в соответствии со схемой их разводки:

Эмуляция сотового телефона… на сотовом телефоне Python, Timeweb, Мобильные телефоны, IT, Электроника, Эмулятор, Видео, YouTube, Длиннопост

Делать этого сейчас я не буду по причине того, что это несколько монотонное занятие, и вся задача заключается лишь в правильном сопоставлении таблиц кнопок и таблиц на контроллере от USB клавиатуры. После чего клавиатура подключается к виртуальной машине, и можно испытать полное погружение в эмулятор.

❯ 7. Заключение


Результат проекта:

Эмуляция сотового телефона… на сотовом телефоне Python, Timeweb, Мобильные телефоны, IT, Электроника, Эмулятор, Видео, YouTube, Длиннопост

В ходе работы были изучены особенности работы с GPIO, SPI, GTK3, VNC, преобразованием цветности и некоторым другим функционалом компьютерных и микроконтроллерных систем.

Готовые файлы проекта под wiringPi.

Спасибо за внимание.

  • Написано специально для Timeweb Cloud и читателей Пикабу. Подписывайтесь на наш блог, чтобы не пропустить новые интересные материалы.

  • Также подписывайтесь на наш телеграмм-канал — только здесь, технично, информативно и с юмором об IT, технике и электронике. Будет интересно.

  • Облачные сервисы Timeweb Cloud — это реферальная ссылка, которая может помочь поддержать наши проекты.

Показать полностью 17 5
[моё] Python Timeweb Мобильные телефоны IT Электроника Эмулятор Видео YouTube Длиннопост
9
Посты не найдены
О нас
О Пикабу Контакты Реклама Сообщить об ошибке Сообщить о нарушении законодательства Отзывы и предложения Новости Пикабу Мобильное приложение RSS
Информация
Помощь Кодекс Пикабу Команда Пикабу Конфиденциальность Правила соцсети О рекомендациях О компании
Наши проекты
Блоги Работа Промокоды Игры Курсы
Партнёры
Промокоды Биг Гик Промокоды Lamoda Промокоды Мвидео Промокоды Яндекс Директ Промокоды Отелло Промокоды Aroma Butik Промокоды Яндекс Путешествия Постила Футбол сегодня
На информационном ресурсе Pikabu.ru применяются рекомендательные технологии