Tea Drinking
- Грешный анекдот
Пришла как-то раз девушка в церковь, подходит к батюшке и говорит:
— Батюшка, я согрешила....
— Как согрешила?
— Сосала
— Сколько сосала?
— 10 минут
— Замаливай грехи 1 час
На следующий день.....
— Батюшка, я опять согрешила....
— Как согрешила?
— Сосала
— Сколько на этот раз?
— полчаса
— Замаливай грехи 3 часа
На следующий день.....
— Батюшка, я опять согрешила
— Что, опять сосала?
— Да
— Ох, сколько в этот раз?
— 1 час 14 минут 38 секунд......
Поп охреневший пошел в келью за калькулятором. Через пару минут возвращается, на ходу расстегивая шеринку:
— Досасывай, а то охуительные дроби выходят.....
- OpenAI подала новую заявку на товарный знак "GPT-5".
Согласно новой заявке на товарный знак, поданной в США 18 июля, компания OpenAI, возможно, планирует запустить "GPT-5".
В выходные, компания OpenAI подала в USPTO новую заявку на товарный знак "GPT-5", представляющий собой "загружаемое компьютерное программное обеспечение для использования языковой модели".
Ранее OpenAI уже использовала такое же описание "загружаемое программное обеспечение для использования языковой модели" при подаче заявок на товарные знаки для моделей предыдущего поколения, таких как GPT-4 и GPT-3.5.
- Протоколы Python
В Python 3.8. появилась новая примечательная возможность — протоколы (protocols). Протоколы — это альтернатива абстрактным базовым классам (abstract base classes, ABC). Они позволяют пользоваться структурной подтипизацией (structural subtyping), то есть — осуществлять проверку совместимости классов исключительно на основе анализа их атрибутов и методов. В этом материале мы поговорим о протоколах в Python и разберём практические примеры работы с ними.
Типизация в Python
Начнём с рассмотрения системы типизации в Python. Это — динамически типизированный язык, то есть — типы выводятся во время выполнения программы, что ведёт, например, к тому, что следующий код нормально запустится и отработает:
``` def add(x, y): return x + y
print(add(2, 3)) print(add("str1", "str2"))
Первый вызов
add()к целых чисел и к возврату числа 5. Второй вызов производит конкатенацию строк с возвратом строки
str1str2```. То, что такое возможно, отличает Python от статически типизированных языков, вроде C++, где типы необходимо объявлять:``` int add(int x, int y) { return x + y; }
std::string add(std::string x, std::string y) { return x + y; }
int main() { std::cout<<add(2, 3); std::cout << add("str1", "str2"); return 0; } ``` Сильная сторона статической типизации — возможность выявления ошибок при компиляции кода. А в динамически типизированных языках подобные ошибки проявляются лишь во время выполнения кода. Но, с другой стороны, динамическая типизация может способствовать ускорению создания прототипов программ, может помочь в проведении различных экспериментов. Это — одна из причин того, что Python обрёл огромную популярность.
Динамическую типизацию ещё называют «утиной типизацией». Такое название этот термин получил от определения „утиного теста“: „Если нечто выглядит как утка, плавает как утка и крякает как утка, то это, вероятно, и есть утка“. В нашем случае это означает следующее: если объекты предлагают пользователю одни и те же атрибуты и методы, то с ними можно работать похожим образом. То есть, например, если есть пара схожих типов, объекты одного из них можно передавать функциям, рассчитанным на объекты другого типа.
Но такая гибкость даёт больше минусов, чем плюсов. Особенно — в больших программных проектах, которые ближе к профессиональным продуктам, чем к прототипам. В результате в мире программирования наблюдается тренд на статическую проверку типов. В Python это, например, включение в код подсказок типов, рассчитанных на применение статического анализатора типов mypy.
Подтипизация
Тут есть один интересный вопрос, намёк на который был дан выше, в разговоре об утиной типизации. Речь идёт о подтипизации. Предположим, имеется функция с такой сигнатурой:
foo(x: X)
. Какие классы, помимоX
, mypy позволит передать этой функции?Обратите внимание на то, что мы сейчас говорим лишь о типизации и о подсказках типов. Ведь Python, как уже было сказано, это язык с динамической типизацией, а это значит, что функции
foo
можно передать любой объект. Если этот объект имеет атрибуты и методы, которые ожидает увидеть функция, то всё будет работать, а если нет — программа даст сбой.Итак, при обсуждении подобных вещей различают структурную и номинальную подтипизацию. Структурная подтипизация основана на иерархии классов, на отношениях наследования. Если класс
B
является наследником классаA
— он является подтипом классаA
, а значит — может быть использован везде, где ожидается наличие классаA
.А подтипизация основана на анализе операций, доступных для данного класса. Если класс
B
предлагает все атрибуты и методы, предоставляемые классомA
— его можно использовать везде, где ожидается наличие классаA
.Тут, сравнивая структурную и номинальную подтипизацию, можно сказать, что первая не такая «питонистичная», как вторая, так как вторая лучше соответствует идее утиной типизации. Но, тем не менее, протоколы в Python — это механизмы, основанные на структурной подтипизации.
Подтипизация на практике До выхода Python 3.8 для подтипизации можно было использовать только наследование и, например, применять абстрактные базовые классы. Ниже мы определяем именно такой класс — «чертёж» для дочерних классов, а после этого определяем несколько классов‑потомков, являющихся наследниками абстрактного базового класса:
Подтипизация на практике
До выхода Python 3.8 для подтипизации можно было использовать только наследование и, например, применять абстрактные базовые классы. Ниже мы определяем именно такой класс — «чертёж» для дочерних классов, а после этого определяем несколько классов‑потомков, являющихся наследниками абстрактного базового класса:
``` from abc import ABC, abstractmethod
class Animal(ABC): @abstractmethod def feed(self) -> None: pass
class Duck(Animal): def feed(self) -> None: print("Duck eats")
def feed(animal: Animal) -> None: animal.feed()
duck = Duck() feed(duck) ```
Здесь мы сначала определяем абстрактный базовый класс
Animal
, символизирующий живое существо, в котором описан абстрактный методfeed
, позволяет это существо покормить. Затем мы создаём классDuck
, представляющий утку, являющимся наследником классаAnimal
и реализующий абстрактный метод. Далее — мы определяем универсальную функциюfeed
, которая, в качестве параметра, принимает объект классаAnimal
и вызывает его методfeed
, то есть — позволяет покормить то существо, которое ей передали.Выглядит всё это вполне здраво. Так в чём же тогда проблема? На самом деле, тут можно найти даже несколько проблем, которые способны оттолкнуть программистов от использования подобного подхода к работе с типами
Во‑первых — базовые классы часто плохо подготовлены для их использования сторонним кодом, их тяжело включать в свои проекты из, например, сторонних библиотек. То есть — если нужно создать класс, являющийся наследником некого базового класса, существующего во внешнем модуле, может — в общедоступной библиотеке, этот класс сначала надо самостоятельно найти.
Во‑вторых — возможна ситуация, когда нельзя менять существующий код базовых классов, содержащийся в общедоступных или в любых других внешних по отношению к проекту библиотеках. Это становится проблемой в том случае, если нужно, чтобы типы, импортированные из этих вот внешних источников, выглядели бы в проекте как подтипы других типов, возможно — в комбинации с другими типами, созданными разработчиком проекта.
И наконец — этот подход противоречит самому духу Python и идее утиной типизации.
Протоколы
Итак, в Python 3.8 появились протоколы. Это позволило смягчить вышеописанные проблемы. Протоколы, как можно догадаться из названия, воздействуют на код неявным образом. Они определяют «интерфейсы», описывающие ожидаемые атрибуты и методы, и, при необходимости, организуют проверку наличия всего этого в соответствующих классах:
``` from typing import Protocol
class Animal(Protocol): def feed(self) -> None: pass
class Duck: def feed(self) -> None: print("Duck eats")
def feed(animal: Animal) -> None: animal.feed()
duck = Duck() feed(duck) ```
Как видно,
Animal
— это теперь протокол (Protocol
). КлассDuck
не является наследником какого-либо базового класса. Но mypy всё это полностью устраивает.Подтипизация протоколов
Протоколы, как и следовало ожидать, поддерживают создание подклассов, то есть — определение дочерних протоколов, являющихся наследниками родительских протоколов и расширяющих их возможности. При создании подклассов протоколов главное помнить о том, что наследственные отношения надо устанавливать и с родительским протоколом, и с
typing.Protocol:
``` from typing import Protocol
class Animal(Protocol): def feed(self) -> None: pass
class Bird(Animal, Protocol): def fly(self) -> None: pass
class Duck: def feed(self) -> None: print("Duck eats")
def fly(self) -> None: print("Duck flies")
def feed(animal: Animal) -> None: animal.feed()
def feed_bird(bird: Bird) -> None: bird.feed() bird.fly()
duck = Duck() feed_bird(duck) ```
В этом коде мы создаём класс
Bird
(птица) в виде наследникаAnimal
, а затем определяем функцию, реализующую следующий план действий: сначала птицу кормят, а после этого она улетает.Краткая история протоколов
Весь код, который мы рассмотрели выше — это правильные Python‑программы, даже с точки зрения Python версий ниже 3.8 (не забывайте о том, что Python — это динамически типизированный язык). Тут лишь, чтобы не волновать mypy, нужно импортировать ABC. Кроме того, mypy жаловался бы на последние примеры, где ABC не используется. При этом надо сказать, что протоколы существовали и до Python 3.8. Просто раньше они были не такими заметными, они не были так чётко описаны, как сейчас. Дело в том, что большинство Python‑разработчиков использовало понятие «протокол», имея в виду соглашение соответствию определённому интерфейсу. Теперь в это понятие вкладывается тот же смысл. Один из известных примеров — протокол итератора (iterator protocol) — интерфейс, описывающий то, какие методы нужно реализовать пользовательскому итератору (custom iterator). Для того чтобы всё это, при отсутствии явным образом описанных протоколов, работало бы с mypy, существовало несколько «трюков», таких, как применение пользовательских типов:
``` from typing import Iterable
class SquareIterator: def init(self, n: int) -> None: self.i = 0 self.n = n
def iter(self) -> "SquareIterator": return self
def next(self) -> int: if self.i < self.n: i = self.i self.i += 1 return i**2 else: raise StopIteration()
def iterate(items: Iterable[int]) -> None: for x in items: print(x)
iterator = SquareIterator(5) iterate(iterator) ```
Сравнение абстрактных базовых классов и протоколов
Мы уже обсудили возможные проблемы, связанные с абстрактными базовыми классами (сложности с внешними модулями и интерфейсами, «непитонистический» код). Но протоколы не должны рассматриваться как замена абстрактных базовых классов. Пользоваться стоит и тем и другим. Например, абстрактные базовые классы — это хороший механизм многократного использования кода: весь общий функционал можно реализовать в виде базового класса, а в классах‑наследниках можно реализовывать лишь небольшие уникальные возможности программы. Протоколы же подобного не позволяют.
Итоги
В этом материале мы обсудили статическую и динамическую типизацию (утиную типизацию), поговорили о том, как mypy относится к подтипизации. До Python 3.8 применение подтипизации означало необходимость использования абстрактных классов. А с появлением протоколов в Python появился изящный механизм определения «интерфейсов». И у mypy появилась возможность проверки классов на соответствие этим «интерфейсам». Протоколы, отличаясь более «питонистическим» стилем, чем абстрактные базовые классы, позволяют указывать то, какие атрибуты и методы должны реализовывать классы. Такие классы можно использовать в качестве подтипов протокола, которому они соответствуют.
- AntennaPod
AntennaPod — менеджер и проигрыватель подкастов, которыйобеспечитвает мгновенным доступом к миллионам бесплатных и платных подкастов, как от независимых, так и крупных подкастеров. С легкостью добавляет, импортирует и экспортирует их каналы используя каталог подкастов iTunes, файлы OPML или адреса каналов RSS. Загружает, транслирует по сети или добавляет выпуски в очередь, с регулируемой скоростью воспроизведения, поддержкой оглавления и таймером сна. Экономит время, заряд батареи и мобильный трафик при помощи мощных средств автоматизации загрузки выпусков (фильтрация, указание времени и интервалов, а также сетей WiFi) и их удаления (избранные и настройки хранения).
> Созданное поклонниками подкастов, AntennaPod — бесплатное и свободное приложение без рекламы и платежей.
Возможности приложения:
- Управление воспроизведением: виджетом, системным уведомлением и кнопками проводных и беспроводных гарнитур
- Добавление и импорт каналов через каталоги iTunes и gPodder.net, файлы OPML и ссылки на каналы в RSS или Atom
- Приятное прослушивание с регулировкой скорости воспроизведения, оглавлениями, запоминанием места воспроизведения и продвинутым таймером сна (со сбросом при встряхивании, снижением громкости)
- Доступ к каналам и выпускам, защищенным паролем
- Функция размещения подкастов в избранном
- того самого выпуска в истории воспроизведения или по заголовкам и примечаниям
- Разнообразие способов поделиться выпусками и каналами через социальные сети и e-mail, услуги gPodder.net и экспорт в OPML
- Управление автоматической загрузкой: выбор отдельных каналов, запрет на использование мобильных сетей, выбор определенных точек доступа WiFi, только во время зарядки телефона и в заданное время или интервалы
- Хранение: ограничение количества кешируемых выпусков, автоудаление и выбор расположения файлов
- Приспосабливается к вашему окружению посредством светлого или темного оформления
- Резервирование подписок путем интеграции с gPodder.net и экпорта в OPML, HTML
Download
Скачать AntennaPod из F-droid
AntennaPod community
- Stable-Diffusion-Android
Stable-Diffusion-Android is an Android application that allows users to quickly and easily create images from text or other images.
Technically, it is a Stable-Diffusion client that connects to either your neural network instance (running on your server or Colab) or you can use AI Horde (a crowdsourced distributed cluster)
The app also includes a built-in gallery for storing AI-generated images, with export capabilities.
- AI Horde
That's the Haidra logo !
> Haidra is the overarching community org behind the AI Horde project and the ecosystem built around it. We represent the infinite expression of the open commons
AI Horde
This is a crowdsourced distributed cluster of Image generation workers and text generation workers. If you like this service, consider joining the horde yourself!
For more information, check the FAQ. Finally you can also follow the main developer's blog
Usage
First Register an account which will generate for you an API key. Store that key somewhere.
- if you do not want to register, you can use '0000000000' as api_key to connect anonymously. However anonymous accounts have the lowest priority when there's too many concurrent requests!
- To increase your priority you will need a unique API key and then to increase your Kudos. Read how Kudos are working. Read how Kudos are working
Disclaimer
The article does not provide all the information, for detailed acquaintance I recommend you to visit the official resources, I only highlighted the most basic.
- Authenticator Pro
Authenticator Pro - Бесплатное приложение с открытым исходным кодом для двухфакторной аутентификации под Android. Имеет зашифрованные резервные копии, иконки, категории и высокий уровень кастомизации. Также имеется приложение-компаньон для Wear OS.
Поддерживаются аутентификаторы TOTP (по времени) и HOTP (по счетчику), использующие алгоритмы хеширования SHA1, SHA256 или SHA512. Также поддерживаются Mobile-Otp (mOTP), Steam и Yandex.
Двухфакторная аутентификация обеспечивает дополнительный уровень безопасности учетных записей, требуя ввода одноразового кода для входа в систему. В дополнение к имени пользователя и паролю требуется код, предоставляемый Authenticator Pro. Таким образом, даже если ваши регистрационные данные будут скомпрометированы, ваша учетная запись останется в безопасности.
Функционал
- ⚙️ Совместимость: Authenticator Pro совместим с большинством провайдеров и учетных записей.
- 📲Импорт: Легкий перенос учетных записей в Authenticator Pro из поддерживаемых альтернативных приложений.
- 💾 Резервное копирование/восстановление: Резервное копирование аутентификаторов с надежным шифрованием. В случае потери или смены телефона вы всегда сможете получить доступ к своим учетным записям. Резервные копии можно сохранять в облачном хранилище или на устройстве.
- 🌙 Темный режим: Authenticator Pro имеет красивый внешний вид, созданный в стиле материального дизайна, в светлой или темной темах.
- ⏺️ Иконки: Легко находите свои аутентификаторы благодаря узнаваемым логотипам брендов и значкам рядом с каждым кодом.
- 📂 Категории: Организуйте аутентификаторы по категориям.
- 🔒 Автономность с небольшим количеством разрешений: Authenticator Pro требует только одного разрешения¹ и не нуждается в доступе в Интернет.
- 🔑 Безопасность: Установите пароль и используйте биометрическую аутентификацию для защиты своих кодов.
- 🎨 Персонализация: Установка значков и переименование. Вы также можете расположить аутентификаторы в любом порядке, чтобы их можно было легко найти.
- ⌚ Wear OS: Быстрый просмотр аутентификаторов прямо с часов. Обратите внимание, что требуется подключение к устройству Android. Кроме того, дистрибутивы приложения для F-Droid не совместимы с Wear OS, так как требуются несвободные зависимости.
Для сканирования QR-кодов приложению требуется разрешение камеры.
> В настоящее время Authenticator Pro доступен только в клиенте F-Droid через репозиторий IzzyOnDroid. Сначала необходимо добавить этот репозиторий в клиент F-Droid.
- Jerboa
Jerboa is an app for Lemmy, a federated reddit alternative. Jerboa is made by Lemmy's developers, and is free, open-source software, meaning no advertising, monetizing, or venture capital, ever.
Lemmy is similar to sites like Reddit, Lobste.rs, or Hacker News: you subscribe to forums you're interested in, post links and discussions, then vote, and comment on them. Behind the scenes, it is very different; anyone can easily run a server, and all these servers are federated (think email), and connected to the same universe, called the Fediverse.
- Geddit
Geddit is an open-source Reddit client that is designed to be fast, beautiful and simple. Its main objective is to not use the Reddit API directly, but instead use the RSS/JSON feeds to display content. This allows the app to view Reddit without being subject to API limits, changes and problems. Geddit works without a Reddit account, which also means that you can stay anonymous while browsing Reddit, if you are concerned about privacy.
Some of the features of Geddit include:
- View posts, comments, subreddits and users
- View images, gifs, videos and self posts
- Access NSFW content
- View your subscribed subreddits
- Save photos to your device
- Share posts
- Search for posts, subreddits and users
- Support for app links
> Anti-features This app has features that you may not like. Learn more!
This app popularizes proprietary network services or depends on them completely
- [@tea\_drinking](https://lm.ilyamikcoder.com/c/tea_drinking) Test 2
@tea\_drinking Test 2
I'm actually curious if this just doesn't work with replies, or something broke with the Lemmy instance:blobcatthinking:
- Федерация с kbin-инстансами
Работает ли у нас федерация с kbin-инстансами? Насколько мне известно, создавать посты в kbin-магазинах и комментить под ними должно быть возможно. Однако, мой пост на журнале feddit.online не отображается.
Что интересно, пост видно при поиске по прямой ссылке. Однако даже после этого он не виден в журнале. Это баг федерации между инстансами, или же баг в самом kbin?
UPD: на компе посты стали отображаться после сброса куков чужого инстанса, вывод - глюки кбина
- Первый!
Как-то пусто у нас. Пусть это сообщество будет эдаким каталогом для остальных сообществ здесь, а также местом для новостей (обновлений, прочее...)
Хотел назначить u/ilyamikcoder модератором, но оказывается, это очень криво сделано в Лемми. Хотя я не против, если он сам создаст сообщество с той же целью ¯\\\(ツ)\/¯