Медленный текст в Python
Обычный код с надписью "Привет, Мир!" выводится сразу:
print("Привет, Мир!")
Это не так хорошо будет выглядеть в консольной игре.
Так что добавляем функцию print_slow():
import time
def print_slow(text):
for i in range(len(text)):
print(text[i], end="")
time.sleep(0.5)
print_slow(input("Введите текст: ")) # Если пробелы не расставлены, то это вина Пикабу
Теперь, любой введённый нами текст будет выводиться в скорости 1 символ в 0.5 секунд.
Чтобы настроить время, надо изменить 6-ую строку кода:
time.sleep(Введите время в секундах)
Пожалуйста.
UPD: Вот готовый код:
import time
def print_slow(text, speed):
for i in range(len(text)):
print(text[i], end="")
time.sleep(speed)
def main():
while True:
s = input("Введите текст (exit - выход): ")
if s == "exit":
break
else:
speed = float(input("Введите скорость текста в секундах: "))
print_slow(s, speed)
print()
if __name__ == '__main__':
main() # Если пробелы не расставлены, ЭТО НЕ МОЯ ВИНА!!!
Video2HTML
Затестить можно тут: https://mempix.ru/vhg Предупреждаю... очень криво и сыро, половина функций не работает.Более-менее правильно функционирует нод рандом и список, ну и простые цепочки. И большие файлы грузить не получится, это все-таки пока JS.
Как работает GetHashCode в .NET
В .NET метод GetHashCode устроен сложнее, чем «просто вернуть адрес объекта»: CLR хранит и кеширует хеш в заголовке объекта, использует разные алгоритмы для ссылочных, значимых типов, строк, делегатов и анонимных типов.
Что хранится в объекте
У любого ссылочного объекта есть заголовок (Header) с двумя полями: указатель на таблицу методов типа (MethodTablePointer) и индекс блока синхронизации (SyncBlockIndex).
MethodTablePointer нужен для RTTI и виртуальных вызовов (через него работает GetType и диспетчеризация методов), SyncBlockIndex ― для работы lock/Monitor и других механизмов синхронизации.
Как менялся GetHashCode у ссылочных типов
В .NET 1.0–1.1 хеш ссылочного объекта просто брался как свободный индекс блока синхронизации (SyncBlock), который записывался в SyncBlockIndex; это создавало лишние структуры и делало хеши предсказуемыми и идущими подряд.
Начиная с .NET 2.0 хеш для Object генерируется потоко-специфичным линейным конгруэнтным генератором: у каждого потока своё семя и множитель, что снижает риск одинаковых последовательностей хешей между потоками.
Где хранится хеш‑код
При первом вызове GetHashCode CLR вычисляет значение и кладёт его в SyncBlockIndex; если объекту уже нужен SyncBlock для синхронизации, хеш переносится внутрь SyncBlock, а при освобождении блока обратно копируется в заголовок.
Таким образом, хеш стараются хранить либо в заголовке объекта, либо в связанном SyncBlock, чтобы не тратить дополнительную память на отдельное поле в каждом объекте.
Значимые типы: две стратегии
Если структура не содержит ссылочных полей и не имеет «пустот» между полями, CLR применяет быструю версию: XOR каждых 4 байт структуры, что задействует всё её содержимое; так, простые пары int,int получают разные хеши при разных значениях.
Если есть ссылочные поля или выравнивание даёт пробелы, используется медленная версия: CLR берёт первое экземплярное поле, считает его хеш, XOR‑ит его с указателем на тип этого поля и игнорирует остальные поля, что может давать одинаковые хеши для разных значений остальных полей.
Баг с decimal и вывод
В старых версиях .NET быстрый алгоритм давал разные хеши для чисел decimal, которые математически равны, но имеют разное внутреннее представление (например, 10.0m и 10.0000…m); это исправили только в .NET 4.
Поведение и производительность дефолтного GetHashCode для value types могут быть неожиданными, поэтому для пользовательских структур и классов рекомендуют явно переопределять GetHashCode (и Equals) под свою модель равенства.
Строки, делегаты и анонимные типы
String имеет собственный быстрый алгоритм (вариант djb2 с двумя накопителями), который при каждом вызове заново вычисляет хеш, не кэшируя его, чтобы не тратить память на дополнительное поле в каждом объекте строки; реализация менялась между версиями .NET, поэтому запрещено хранить такие хеши «на диск».
В .NET 4.5 добавили опцию «randomized string hashing» на домен приложений (Marvin32), чтобы одинаковые строки в разных доменах могли иметь разные хеш‑коды и лучше защищаться от атак по коллизиям.
Delegate по умолчанию возвращает хеш типа делегата (GetType().GetHashCode), поэтому делегаты одного типа с разными методами могут иметь одинаковый хеш.
MulticastDelegate переопределяет GetHashCode так, чтобы учитывать всю цепочку методов: обход _invocationList и комбинирование хешей каждого элемента, поэтому при различном количестве/наборе методов хеши различаются.
Для анонимных типов компилятор генерирует GetHashCode, который последовательно комбинирует хеш всех полей через умножение на константу и сложение, что делает их хорошо пригодными как ключи в LINQ‑операциях group/join.
Equals у анонимных типов переопределён (сравнение по значениям всех полей), а оператор == нет, поэтому Equals может вернуть true, а оператор == — false для двух разных экземпляров с одинаковыми полями.
Сделал расширение, чтобы учиться на YouTube, а не утопать в рекомендациях
Привет, Пикабу!
Я из тех людей, кто честно проводит полжизни на YouTube.
Часть — лекции универа, курсы по коду, рабочие видосы от начальника.
Часть — классика: «ещё один видосик и спать»… и уже три часа ночи, какой-то обзор чайника и котики.
С организацией этого всего у меня всегда был хаос.
Иногда я кидаю себе ссылку на видео в личку в телеге “чтобы не потерять”.
Иногда думаю: “ладно, это я точно запомню”.
Иногда всё-таки сажусь и пишу нормальный конспект в тетрадочку или, на худой конец, в гугл-док.
А потом, когда реально нужно вернуться к материалу, начинается квест:
где это было — в ТГ, в тетрадке, в доке, в голове, в истории YouTube?.. И сколько времени я вообще на всё это убиваю — отдельная загадка.
В итоге я написал себе небольшое расширение для Chrome — YouFocus. Оно делает несколько простых вещей:
Заметки там, где они нужны.
Справа от видео появляется панель, куда можно писать мысли по ходу ролика. Заметка сохраняется вместе с названием видео и каналом. Плюс по этим заметкам потом можно искать, а не пролистывать всё подряд.
Режим “учусь, не трогать”.
Когда включаю фокус-режим, расширение подчищает интерфейс: прячет часть рекомендаций, вырубает Shorts, можно скрыть особенно отвлекающие каналы. YouTube становится больше похож на видеоплеер, а не на ленту соблазнов.
Статистика по всему YouTube и по “полезному” времени.
Расширение считает, сколько времени уходит просто на просмотр YouTube, а сколько — на ролики в режиме учёбы/работы. В итоге видно, где действительно учился/работал, а где просто залипал. Я, например, внезапно понял, что могу выкроить почти 3 часа в день на что-то полезное, если перестану тупо крутить ленту с бесполезными видосами.
Я чуть параноик, поэтому всё хранится локально в браузере: без аккаунтов, серверов и “мы собрали ваши данные, чтобы сделать сервис лучше”. То, что вы пишете в заметках, живёт у вас, а не у меня.
Делал это изначально чисто под себя, по вечерам после работы. Сейчас стало интересно, я один такой или нет, поэтому выкладываю сюда.
Кому любопытно — расширение можно поставить из Chrome Web Store
Если есть идеи, как это допилить, или ощущение, что чего-то не хватает — с удовольствием почитаю комменты. Если скажете “велосипед, никому не нужен” — тоже ок, главное аргументируйте :)
Так просто!?
https://app.sensortower.com/overview/1163786766?country=US
Программист зарабатывает ₽38,9 млн ($500 тыс.) в месяц на приложении будильника. Он просто создал версию, которая в разы громче стандартного будильника iPhone.
В приложении можно поставить свои звуки для пробуждения, а также разные челленджи на утро, чтобы лучше проснуться. Например, решить уравнение, потрясти телефон или сфотографировать определённый объект.




