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

Скайдом

Три в ряд, Головоломки, Казуальные

Играть

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

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

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

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

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

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

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

Требуется Пояснительная Бригада, что не так с PIP на последнем Пайтоне?⁠⁠

Поставил на новый компьютер официальный Пайтон свежий, но вот элементарный PIP поставить не получается.

Требуется Пояснительная Бригада, что не так с PIP на последнем Пайтоне? Информационная безопасность, Python, Habr, Вирус, Нужен совет

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

Вот статья кому интересно:

О новой угрозе для Python разработчиков в 2023 году или ещё один вирус в пакете PyPi

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

Показать полностью
[моё] Информационная безопасность Python Habr Вирус Нужен совет
42
16
IHard.CoreI
IHard.CoreI
1 год назад
Лига Новых Технологий

Монтаж уличной ip-камеры и вывод изображения по RTSP (python, raspberry pi) (автор SeregaChipset)⁠⁠

https://habr.com/ru/articles/783352/ - Оригинал

Монтаж уличной ip-камеры и вывод изображения по RTSP (python, raspberry pi) (автор SeregaChipset) Гайд, Программирование, Инструкция, Python, IP-камера, Видеонаблюдение, Opencv, Cctv, Питон, Flask, Камера, Код, IT, Из сети, Habr, Длиннопост

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

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

Монтаж

Монтаж уличной ip-камеры и вывод изображения по RTSP (python, raspberry pi) (автор SeregaChipset) Гайд, Программирование, Инструкция, Python, IP-камера, Видеонаблюдение, Opencv, Cctv, Питон, Flask, Камера, Код, IT, Из сети, Habr, Длиннопост

Коробка

Внутри помещения, я уже успешно использовал камеры фирмы vstarcam, по этому, лояльное отношение, подтолкнуло сделать заказ на али vstarcam CS64. Забегая вперед скажу, что это не лучший выбор - мыльная картинка, как будто нет даже заявленных 3 МегаПикселей.
План таков: повесить на внешнюю стену электрическую распределительную коробку, внутрь нее поместить блок питания, на крышку прикрепить камеру. Сигнал передается по wi-fi, питание - провести кабель через раму окна.

Примерный бюджет: ip-камера 3500р., коробка 600р., винтики-гаечки (продаются в леруа на развес) 5р., кабель/вилка/клеммы 200р.

Порядок работ:

  1. Блок питания закинут в коробку(не стал его там крепить), отрезан кабель питания. На клеммы прикрутил новый кусок кабеля(брал его с запасом, но в итоге понадобилась только половина), кабель вывел из коробки;

  2. В крышке коробки(она съемная), просверлил 4 отверстия и закрепил на ней камеру болтами с гайками;

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

  4. Взял крышку с камерой, продел и подключил внутрь коробки кабеля(питание и не нужный lan), закрыл крышку, таким образом смонтировав камеру.

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

Монтаж уличной ip-камеры и вывод изображения по RTSP (python, raspberry pi) (автор SeregaChipset) Гайд, Программирование, Инструкция, Python, IP-камера, Видеонаблюдение, Opencv, Cctv, Питон, Flask, Камера, Код, IT, Из сети, Habr, Длиннопост

Улица

Мотивом для дальнейшей части повествование было желание поделится с соседями видом со стены, ну и желание разобраться как захватывать видеопоток. Не было желания объяснять старшему поколению, как работает стандартное приложение eye4, по этому я решил реализовать веб страничку. Деплой будет на, уже обитавшую для домашних проектов, raspberry pi 4 4Gb.

В спецификации камеры было указано что она умеет в rtsp, его и выбрал. ip адрес камеры было просто вычислить в настройках маршрутизатора и задать его статичным. Предварительно надо было получить ссылку на видеопоток - а его нет! Я аж вспомнил nmap, а то мало ли с портом промахнулся. В документации нет ни слова, оказывается, в отличии от предыдущих моделей, в программе eye4, зайдя в настройки камеры надо включить опцию "незащищенный пароль". И как то напахнуло старыми китайскими девайсами, с непонятными настройками.

Монтаж уличной ip-камеры и вывод изображения по RTSP (python, raspberry pi) (автор SeregaChipset) Гайд, Программирование, Инструкция, Python, IP-камера, Видеонаблюдение, Opencv, Cctv, Питон, Flask, Камера, Код, IT, Из сети, Habr, Длиннопост

eye4

Итоговая ссылка rtsp://admin:password@192.168.0.119:10554/tcp/av0_0
Можно проверить ее подключившись например vlc
Пароль задавался в фирменной утилите.

Монтаж уличной ip-камеры и вывод изображения по RTSP (python, raspberry pi) (автор SeregaChipset) Гайд, Программирование, Инструкция, Python, IP-камера, Видеонаблюдение, Opencv, Cctv, Питон, Flask, Камера, Код, IT, Из сети, Habr, Длиннопост

Код

Программная часть будет использовать python (не судите строго, только год приручаю питона:)). Веб фреймворк Flask был выбран из-за простоты (для одностраничника больше и не надо); Для оптимизации, захват и генерацию кадров было решено разделить на разные процессы, с помощью multiprocessing (в надежде, что это поможет хилому rpi); Для захвата кадров видеопотока и их кодирования, оказалось лучшим вариантом будет использование библиотеки OpenCV.

Непосредственно код:

  1. Файл скрипта на питоне webstreaming.py: (См. Оригинал)

  2. Файл шаблона templates/index.html: (См. Оригинал)

Шаблон, состоит из нескольких тегов хтмл и думаю в объяснении не нуждается, по скрипту пройдемся более детально.

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

Кеширование реализовано с помощью глобальной переменной last_frame, которая для обмена между процессами представляет из себя manager(данные внутри обернуты в list, так как это условие его использования). Это позволяет не генерировать для каждого нового клиента уникальные данные, они смотрят одни и те же картинки, не увеличивая нагрузку.

Сначала запускается процесс p, это позволит параллельно создавать кадры, не нагружая основной процесс.

Далее запускается фласк приложение app.run. Блок try, я добавил для того что бы нормально обработать ctrl-c в терминале. По его завершению, происходят методы завершения созданного процесса.

Функция создания кадра cache_frames. Именно в ней происходит основная нагрузка, которую надо оптимизировать, для маломощного одноплатника. Будем резать качество! Если у Вас будет довольно мощный сервер, вероятно не стоит повторять все советы(оставив хотя бы нормальное разрешение). Для начала я пробовал снижать частоту кадров, это приводило к появлению старых кадров и очевидному замедлению воспроизведения. Обнулить буфер камеры в VideoCapture можно только вытащив из него все кадры. Запускать cap.grab() в цикле это действенный механизм, но это приводит к недопустимой для меня нагрузке. В моей камере есть второй поток с более низким разрешением, это позволило снизить разрешение без cv2.resize, что существенно уменьшило нагрузку, позволив оставить штатную частоту кадров камеры. Все эти моменты могут различаться в разных моделях камер. Давайте пройдемся по строкам главной функции. Сначала мы открываем видеопоток(cap) и узнаем какой у него fps. Далее идет цикл в котором мы читаем кадр(cap.read). Закомментирована строка с изменением размера, так как удалось это сделать на стороне камеры. Далее происходит кодирование в jpeg, с уменьшением качества(imencode). По итогу мы преобразуем массив в необработанную строку байтов, так как именно такой результирующий вид требуется, и размещаем в наш кеш last_frame. Цикл каждый раз засыпает, что бы снизить нагрузку, интервал чуть выше фпс, что бы вычитывать все кадры из буфера камеры. По выходу из цикла ресурсы видеопотока будут освобождены(release).

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

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

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

Перекинув файлы на распберри пай и запустив их, нагрузка составила:

Монтаж уличной ip-камеры и вывод изображения по RTSP (python, raspberry pi) (автор SeregaChipset) Гайд, Программирование, Инструкция, Python, IP-камера, Видеонаблюдение, Opencv, Cctv, Питон, Flask, Камера, Код, IT, Из сети, Habr, Длиннопост

Я посчитал, что чуть более 20% использования cpu(BCM2711), хороший результат, не стеснит остальные проекты.

Осталось только пробросить порт на маршрутизаторе и можно делиться видео наблюдениями. Соседи рады, я рад :-)

Этот текст я написал, так как увидел скудность ру доков по rtsp+python. Возможно кого то это мотивирует на эксперименты с наблюдением и обработкой видеозахвата:) Всем удачи!

Монтаж уличной ip-камеры и вывод изображения по RTSP (python, raspberry pi) (автор SeregaChipset) Гайд, Программирование, Инструкция, Python, IP-камера, Видеонаблюдение, Opencv, Cctv, Питон, Flask, Камера, Код, IT, Из сети, Habr, Длиннопост
Показать полностью 7
Гайд Программирование Инструкция Python IP-камера Видеонаблюдение Opencv Cctv Питон Flask Камера Код IT Из сети Habr Длиннопост
3
DELETED
1 год назад

Бредогенератор 2.0⁠⁠

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

У меня все)

[моё] Личный опыт Программирование Нейронные сети Habr Посты на Пикабу Python Текст
2
574
ZibabveRulit
ZibabveRulit
3 года назад
IT-юмор

Разработчик предложил устроить коммунистическую революцию в Python, объединив все классы и сделать их равными⁠⁠

Разработчик предложил устроить коммунистическую революцию в Python, объединив все классы и сделать их равными Habr, Python, Программирование, IT юмор

Оригинальная статья - https://habr.com/ru/news/t/645777/

Показать полностью 1
Habr Python Программирование IT юмор
58
11
CTPOuTEJlb
CTPOuTEJlb
5 лет назад

Простой Telegram-бот на Python за 30 минут⁠⁠

От автора.

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

Часть 1: Регистрация бота


Самая простая и описанная часть. Очень коротко: нужно найти бота @BotFather, написать ему /start, или /newbot, заполнить поля, которые он спросит (название бота и его короткое имя), и получить сообщение с токеном бота и ссылкой на документацию. Токен нужно сохранить, желательно надёжно, так как это единственный ключ для авторизации бота и взаимодействия с ним.

Часть 2: Подготовка к написанию кода


Как уже было сказано в заголовке, писать бота мы будем на Python’е. В данной статье будет описана работа с библиотекой PyTelegramBotAPI (Telebot). Если у вас не установлен Python, то сперва нужно сделать это: в терминале Linux нужно ввести:

sudo apt-get install python python-pip

Если же вы пользуетесь Windows, то нужно скачать Python с официального сайта .


После, в терминале Linux, или командной строке Windows вводим:


pip install pytelegrambotapi

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



Часть 3: Получаем сообщения и говорим «Привет»


Небольшое отступление. Телеграмм умеет сообщать боту о действиях пользователя двумя способами: через ответ на запрос сервера (Long Poll), и через Webhook, когда сервер Телеграмма сам присылает сообщение о том, что кто-то написал боту. Второй способ явно выглядит лучше, но требует выделенного IP-адреса, и установленного SSL на сервере. В этой статье я хочу рассказать о написании бота, а не настройке сервера, поэтому пользоваться мы будем Long Poll’ом.


Открывайте ваш любимый текстовый редактор, и давайте писать код бота!

Первое, что нужно сделать это импортировать нашу библиотеку и подключить токен бота:

import telebot;

bot = telebot.TeleBot('%ваш токен%');

Теперь объявим метод для получения текстовых сообщений:

.message_handler(content_types=['text'])

def get_text_messages(message):

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

@bot.message_handler(content_types=['text', 'document', 'audio'])

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

Теперь добавим в наш метод немного функционала: если пользователь напишет нам «Привет», то скажем ему «Привет, чем я могу помочь?», а если нам напишут команду «/help», то скажем пользователю написать «Привет»:

if message.text == "Привет":

bot.send_message(message.from_user.id, "Привет, чем я могу тебе помочь?")

elif message.text == "/help":

bot.send_message(message.from_user.id, "Напиши привет")

else:

bot.send_message(message.from_user.id, "Я тебя не понимаю. Напиши /help.")

Данный участок кода не требует комментариев, как мне кажется. Теперь нужно добавить в наш код только одну строчку (вне всех методов).

bot.polling(none_stop=True, interval=0)

Теперь наш бот будет постоянно спрашивать у сервера Телеграмма «Мне кто-нибудь написал?», и если мы напишем нашему боту, то Телеграмм передаст ему наше сообщение. Сохраняем весь файл, и пишем в консоли

python bot.py

Где bot.py – имя нашего файла.

Теперь можно написать боту и посмотреть на результат:

Простой Telegram-бот на Python за 30 минут Habr, Python, Социальные сети, Длиннопост, Telegram, Бот

Часть 4: Кнопки и ветки сообщений


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

name = '';

surname = '';

age = 0;

@bot.message_handler(content_types=['text'])

def start(message):

if message.text == '/reg':

bot.send_message(message.from_user.id, "Как тебя зовут?");

bot.register_next_step_handler(message, get_name); #следующий шаг – функция get_name

else:

bot.send_message(message.from_user.id, 'Напиши /reg');


def get_name(message): #получаем фамилию

global name;

name = message.text;

bot.send_message(message.from_user.id, 'Какая у тебя фамилия?');

bot.register_next_step_handler(message, get_surnme);


def get_surname(message):

global surname;

surname = message.text;

bot.send_message('Сколько тебе лет?');

bot.register_next_step_handler(message, get_age);


def get_age(message):

global age;

while age == 0: #проверяем что возраст изменился

try:

age = int(message.text) #проверяем, что возраст введен корректно

except Exception:

bot.send_message(message.from_user.id, 'Цифрами, пожалуйста');

bot.send_message(message.from_user.id, 'Тебе '+str(age)+' лет, тебя зовут '+name+' '+surname+'?')

И так, данные пользователя мы записали. В этом примере показан очень упрощённый пример, по хорошему, хранить промежуточные данные и состояния пользователя нужно в БД, но мы сегодня работаем с ботом, а не с базами данных. Последний штрих – запросим у пользователей подтверждение того, что все введено верно, да не просто так, а с кнопками! Для этого немного отредактируем код метода get_age

def get_age(message):

global age;

while age == 0: #проверяем что возраст изменился

try:

age = int(message.text) #проверяем, что возраст введен корректно

except Exception:

bot.send_message(message.from_user.id, 'Цифрами, пожалуйста');

keyboard = types.InlineKeyboardMarkup(); #наша клавиатура

key_yes = types.InlineKeyboardButton(text='Да', callback_data='yes'); #кнопка «Да»

keyboard.add(key_yes); #добавляем кнопку в клавиатуру

key_no= types.InlineKeyboardButton(text='Нет', callback_data='no');

keyboard.add(key_no);

question = 'Тебе '+str(age)+' лет, тебя зовут '+name+' '+surname+'?';

bot.send_message(message.from_user.id, text=question, reply_markup=keyboard)

def get_age(message):

global age;

while age == 0: #проверяем что возраст изменился

try:

age = int(message.text) #проверяем, что возраст введен корректно

except Exception:

bot.send_message(message.from_user.id, 'Цифрами, пожалуйста');

keyboard = types.InlineKeyboardMarkup(); #наша клавиатура

key_yes = types.InlineKeyboardButton(text='Да', callback_data='yes'); #кнопка «Да»

keyboard.add(key_yes); #добавляем кнопку в клавиатуру

key_no= types.InlineKeyboardButton(text='Нет', callback_data='no');

keyboard.add(key_no);

question = 'Тебе '+str(age)+' лет, тебя зовут '+name+' '+surname+'?';

bot.send_message(message.from_user.id, text=question, reply_markup=keyboard)

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

@bot.callback_query_handler(func=lambda call: True)

def callback_worker(call):

if call.data == "yes": #call.data это callback_data, которую мы указали при объявлении кнопки

.... #код сохранения данных, или их обработки

bot.send_message(call.message.chat.id, 'Запомню : )');

elif call.data == "no":

... #переспрашиваем

Остаётся только дописать в начало файла одну строку:

from telebot import types

Вот и всё, сохраняем и запускаем нашего бота:

Простой Telegram-бот на Python за 30 минут Habr, Python, Социальные сети, Длиннопост, Telegram, Бот

Источник


PS. Сорян если баян, но ничего такого не нашел.

Показать полностью 2
Habr Python Социальные сети Длиннопост Telegram Бот
10
45
delvinfil
delvinfil
5 лет назад
Программирование на python

Яндекс.переводчик для Linux на Python GUI⁠⁠

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

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

Яндекс.переводчик для Linux на Python GUI Python, Linux, Gui, Habr, Длиннопост


Translate-shell вещь достаточно удобная, особненно, если пишешь, допустим, в Vi/vim. Переключился в соседнюю консоль и переводи.

Ключи простейшие и запоминаются легко.

Яндекс.переводчик для Linux на Python GUI Python, Linux, Gui, Habr, Длиннопост

Но этого как обычно было мало. Захотелось графики.

Работа в SublimeText и Zeal несколько удобней, нежели голая консоль.

Яндекс.переводчик для Linux на Python GUI Python, Linux, Gui, Habr, Длиннопост

Хм… Подумал-подумал, и решил прикрутить переводчик на горячую клавишу.

Выбор пал на gxmessage. Zenity меня не устроил, уж и не помню почему.

Был написан код:

Яндекс.переводчик для Linux на Python GUI Python, Linux, Gui, Habr, Длиннопост
И назначен на Ctrl+1. В IceWm это легко. Правим $HOME/.icewm/keyskey


"Ctrl+1" $HOME/progs/trans.sh

Некоторое время меня это устраивало. На "контрол+1" с английского, "контрол+2" на английский. Хорошо...

Яндекс.переводчик для Linux на Python GUI Python, Linux, Gui, Habr, Длиннопост

Но тут translate-shell начал давать сбои.

Яндекс.переводчик для Linux на Python GUI Python, Linux, Gui, Habr, Длиннопост

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

Я решил, пора, давно на питоне не писал.


Недолгие поиски в гугл привели меня к Yandex.API, Python и GTK+ 3 в виде модуля gi.


Почему gi, ведь обычно писал на PyQt5? Он на моей машине работает значительно быстрее. Машина не новая, памяти тоже(по современным меркам) не ахти.

Яндекс.переводчик для Linux на Python GUI Python, Linux, Gui, Habr, Длиннопост
Модуль GTK+ 3 для python был для меня вновинку. Целый вечер разбирался с синтаксисом на сайтах раз, два и три.


Так родился код.


В итоге имею автопереводчик на горячей клавише.

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


Оригинал здесь.

Показать полностью 6
[моё] Python Linux Gui Habr Длиннопост
23
darikcr
6 лет назад
Скриншоты комментов

Из комментариев. Сравнение популярности языков программирования⁠⁠

Комментарии к статье «Python становится самым популярным языком программирования», https://habr.com/ru/post/436626/#comment_19632318

Из комментариев. Сравнение популярности языков программирования Скриншот, Комментарии, Программирование, Python, Ольга Бузова, Habr
Показать полностью 1
Скриншот Комментарии Программирование Python Ольга Бузова Habr
1
k0567
8 лет назад

Руби(н) vs Питон: самые важные вопросы и ответы⁠⁠

Руби(н) vs Питон: самые важные вопросы и ответы Python, Ruby, Habr, Программирование, Длиннопост

«Питон или Руби» — это один из самых горячо обсуждаемых топиков в мире программирования. Впереди него только “emacs или vim” и “pro-skub или anti-skub” по важности и сложности. Сегодня мы изучим разницу и ответим на вопросы, а также объективно и окончательно решим, что лучше.



Что такое Питон?


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



Что такое Руби(н)?


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



В чем схожесть?


Для незнакомого с темой человека рубин и питон могут показаться идентичными:


• Динамическая типизация: Тип, к которому относится слово, динамически определяется из контекста. Питон может относится к семейству (питонов), роду (broghammerus) или к виду (сетчатый питон). Аналогично, рубин может быть конкретным минералом (корунд с примесями хрома), или относиться к общей категории красных камней.


• Интерпретируемый: Питоны и рубины часто используются как символы и метафоры, особенно в поэзии и мифологии.


• Объектно-ориентированные: Они оба — объекты, но некоторым людям некомфортно относиться к животным как к объектам.


• Высокоуровневые: Я изучал в университете физику, и все, что больше атома водорода считаю «высокоуровневым». Я не шучу. Мы еще не нашли решение уравнению Шредингера для атома гелия, а это все лишь атом водорода с дополнительной болтающейся хреновиной.



В чем отличия?


Несмотря на кучу схожих черт, существует и значительные отличия:


• У Рубинов есть блоки, то есть рубины можно складывать в блоки. Если сложить питоны в блоки, то они расползутся.


• У Питонов есть списковое включение (comprehensions). Рубины — неодушевленные предметы, и не способны ничего включать. ("comprehension" — понимание, поэтому в оригинале получается забавнее: «рубины не способны ничего понимать», — прим. пер.)


• Питон считается более легко читаемым (на питоне можно написать большие слова фломастером), а Рубин считается более элегантным (естественно).



Какие есть важные примеры?


• Рельсы (Rails): Рубин можно положить на рельсы, и он останется на рельсах, если только не укатится.


• Панды (Pandas): Питон скорее всего сможет съесть панду, если хорошенько постарается.


• Шеф (Chef): Может показаться, что речь идет о питоне, однако шеф-повары обычно избегают рептилий. Но иногда принимают рубины в качестве оплаты.


• Джанго (Django): Гитарист, который любил змей.



Что лучше?


Зависит от ситуации!!!



Ты обещал объективный, окончательный ответ!


Серьезно. Зависит от ситуации. Что вы пытаетесь сделать?


• Играть в скраббл: Рубин стоит 9 очков, питон стоит 14 очков, и с вариантами множественно числа можно дойти до бинго. Преимущество: Питон


• Толкание ядра: Не кидайте змей. Преимущество: Рубин


• Моделирование соленоидного электромагнита когда в наличии есть цилиндр, но веревку и провод забыл дома: Нужно быть достаточно сильным, но в остальном — отличный способ применения питона. Преимущество: Питон


• Украшения: С одно стороны, рубины — популярные украшения. С другой стороны, озмерелье это кру-то-та. Преимущество: Ничья


• Организация будки для поцелуев: Люди предпочитают целовать рубины, а не питонов. Возможно, это связано с повышенным риском заболевания сальмонеллёзом. Преимущество: Рубин


Можно заметить, что в примерно в половине случаев можно сделать выбор в пользу рубина, и в другой половине случаев — в пользу питона. Скорее всего, есть еще несколько мелких случаев, которые ломают красивое отношение 1:1, но они — нишевые и эзотерические.

Показать полностью
Python Ruby Habr Программирование Длиннопост
8
Посты не найдены
О нас
О Пикабу Контакты Реклама Сообщить об ошибке Сообщить о нарушении законодательства Отзывы и предложения Новости Пикабу Мобильное приложение RSS
Информация
Помощь Кодекс Пикабу Команда Пикабу Конфиденциальность Правила соцсети О рекомендациях О компании
Наши проекты
Блоги Работа Промокоды Игры Курсы
Партнёры
Промокоды Биг Гик Промокоды Lamoda Промокоды Мвидео Промокоды Яндекс Директ Промокоды Отелло Промокоды Aroma Butik Промокоды Яндекс Путешествия Постила Футбол сегодня
На информационном ресурсе Pikabu.ru применяются рекомендательные технологии