Pull to refresh
53
0
Send message
Немного исправил код
import os
import sys
import time
import cv2
import numpy


os.system("title Bad Apple")
string = " `.,-':<>;+!*/?%&98#"
string = list(map(ord, string))
size = len(string)
coef = 256 / size
width = 480 // 3
height = 360 // 5
newline = numpy.array((ord("\n"),)*height, dtype="uint8")
cap = cv2.VideoCapture("img/BadApple.mp4")
start = time.time()
while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        break
    frame = cv2.resize(frame, (width, height), interpolation=cv2.INTER_LINEAR)
    frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    frame = frame / coef
    frame = frame.astype("uint8")
    for i in range(size):
        frame[frame == i] = string[i]
    frame = numpy.column_stack((newline, frame))
    text = frame.tobytes().decode("ascii")
    sys.stdout.write(text)
    sys.stdout.flush()
    pos = cap.get(cv2.CAP_PROP_POS_MSEC) / 1000
    now = time.time()
    pause = pos - (now - start)
    if pause > 0:
        time.sleep(pause)
os.system("cls")
cap.release()

Чтобы в отображалось корректно необходимо установить размер окна 160x72

Получилось вот так

Моя реализация Bad Apple на LEGO EV3 Mindstorms

У меня R2S под openwrt 22.03.1 несколько раз зависал при перезагрузке. На вики проекта нашёл, что вроде виновата карта памяти и во FriendlyWrt этот баг пофиксили, но похоже пофиксили только в нём, например у armbian до сих пор указано Known problem: reboot sometimes doesn’t bring the device back.
А так да, R2S хорош и мне его тоже хватало, но рекомендовать не хочу.

Рекомендую присмотреться к Nanopi R4S. Актуальный, продаётся на али. С хорошей начинкой и поддержкой.
А за ним ставить точку(и) доступа wifi.

Надо было в Firefox уменьшить до 1 значение network.http.max-connections
Это не плохо. Есть свои плюсы и минусы. Например автор указал минус — невозможно заменить диск на горячую. Вы указали плюс — гибкость. Просто если уже есть хороший контроллер почему бы его не использовать по назначению? Выше уже указали пожалуй главный минус — что делать если сдохнет контроллер? Вдруг новый контроллер не увидит массив или превратит его в кашу. Или вообще контроллер этой фирмы купить не сможем. Но и автор не ушёл от этой проблемы, так как создал 6 RAID0. Тут уже или использовать все возможности аппаратного RAID-контроллера или заменить его на полноценный HBA.

Задачи получить NAS не было. Задач было несколько, автор их объединил в одно решение, я предложил их разделить на несколько решений.
По производительности — обсуждаем конкретную конфигурацию сервера, чудес производительности от него не ждём, но автор в задаче указал получить адекватную скорость, попробуем с ней разобраться.
У жестких дисков есть кэш память, например автор использует Toshiba P300 у которых 64MB кэша. По умолчанию кэш используется и на чтение и на запись.
При объединении дисков в массив, не важно какой — аппаратный, программный или ZFS пул RAIDZ, крайне рекомендуется отключать внутренний кэш диска на запись.
Это помогает сохранить консистентность массива при аварийной ситуации, но снижает скорость записи.
Каждый вид массива по своему старается сохранить консистентность и выжать максимум производительности.
У RAID-контроллеров для этого есть модуль кэш памяти и аккумулятор.
Программый RAID-массив для кэша использует оперативную память, размер выделяемой памяти указывается в stripe_cache_size.
Так же у программного массива есть write intent bitmap который позволяет после некорректной перезагрузки системы производить перепроверку не всего массива, а только тех областей, в которые на момент перезагрузки или отключения питания производилась запись.
Пул RAIDZ так же для кэша использует оперативную память, а для консистентности контрольные суммы.
Повторюсь — каждый вид массива чтобы повысить производительность использует кэш на запись.
Какое решение использовать вы выбираете сами, можете предпочесть использовать ZFS, это ваше право, вы несёте ответственность за эксплуатацию вашей инфраструктуры.
Я просто дал рекомендацию основываясь на своём скромном опыте.
Я работаю и с аппаратными и с программными массивами, с дисками разного уровня — от desktop sata до enterprise sas hdd/ssd.
Я сам уже почти десять лет использую сделанную из сервера дисковую полку подключенную по iSCSI к серверу виртуализации ESXi двумя 10Gb интерфейсами.
Мне случалось менять контроллер HP SmartArray на более новый, следующего поколения, естественно прошивка была другая. Контроллер нормально определил массив.
Я расширял аппаратный массив «на горячую». Менял диск на более емкий, дожидался синхронизации, менял следующий и т.д. После замены дисков просто расширил массив в HP ACU.
Я видел отказ второго диска при синхронизации RAID6.
Я видел аварийную остановку сервера из-за некорректируемой ошибки оперативной памяти.
Я видел внезапную «смерть» относительно нового APC Smart-UPS с достаточно свежими аккумуляторами.
Я ничего не имею против ZFS, аппаратных и программных массивов. Просто считаю что каждое решение должно использоваться там, где это уместно.
Мне кажется странным имея хороший аппаратный контроллер не использовать его возможности. Не надо боятся отказа аппаратного RAID-контроллера, отказать может всё что угодно, нужно просто быть к этому готовым.
Мне кажется сомнительным желание автора использовать один сервер для множества столь разных задач.
Я предложил решение, отличное от того к которому пришёл автор, и постарался указать его сильные стороны. Я не навязываю своё решение, не заставляю им пользоваться.
Я художник, я так вижу. Вы видите по другому. Сколько людей — столько мнений. И это хорошо. В споре рождается истина.
1) Если так, то тогда собираем программный RAID6 через mdadm и не жалуемся на производительность, которая будет точно ниже чем у аппаратного контроллера с кэшем
2) В случае с контроллером надо будет просто заменить диск, только сегодня менял, синхронизация начинается автоматически. А с mdadm нужно будет лезть в консоль, «что может быть проблемой для людей не знакомых с linux»
Ну и не важно какой массив собрали, аппаратный или программный, мониторить его в любом случае надо — smartmontools, zabbix и «утилиты производителя» вам в помощь.
Не надо так.
У вас есть хороший RAID контроллер, а вы используете его как HBA.
Доукомплектуйте контроллер гигом кэша и аккумулятором. Из ваших весьма посредственных шести 3TB дисков лучше собрать RAID6, поверьте, у вас по факту RAID5 что на таких объёмах неприемлемо. Включите кэш контроллера на запись, отключите кэш дисков на запись. Создайте два логических диска — один на 5GB под систему, второй на весь оставшийся объём. Можно даже у первого логического диска выключить кэширование.
Устанавливаете debian только базовую систему (без окружения рабочего стола).
У вашего сервера четыре сетевых интерфейса, сколько сетевых интерфейсов у сервера виртуализации из статьи не понятно, подключите хотя бы два патч-кордами напрямую, не через коммутатор, если надо доукомплектуйте сервер виртуализации сетевой картой на два/четыре интерфейса. На интерфейсах пропишите адреса с маской 30.
Установите targetcli и опубликуйте ваш второй логический диск только для этих адресов.
В ESXi добавьте storage с включенным multipath политикой Round Robin, в свойствах storage вы увидите два пути к target или больше, сколько интерфейсов подключили. Multipath повысит скорость обмена и отказоустойчивость (от «случайного» выдёргивания одного патч-корда).
Всё. На этом storage делайте что хотите — храните резервные копии или запускайте виртуальные машины, хоть ту же TrueNAS с шарой на 50 пользователей AD.
По факту у вас получится дисковая полка с iSCSI.
Такая конфигурация производительней и безопасней, позволит крепче спать.
Смешались в кучу кони, люди…
Сначала делаются горячие резервные копии. Тут важна скорость восстановления актуальной резервной копии, поэтому лучше использовать SSD.
Далее по схеме ротации из горячих делаются холодные резервные копии. Тут важен объём для обеспечения глубины хранения, скорость уже вторична, поэтому лучше использовать HDD.
Далее для долговременного хранения из холодных резервных копий по схеме ротации делаются архивы. Тут уже подойдут ленточки, жесткие диски и может быть даже оптические диски.
Для каждой задачи свой инструмент. Не надо забивать гвозди микроскопом. Не надо делать горячие резервные копии на оптические диски. Не надо делать архивы на SSD.
Eneloop пятого поколения, их на вб продают.
Из недорогих но хороших зарядок можно в днс посмотреть Xtar VC4 или Xtar VC2S.
Ещё можно на али посмотреть что нибудь из LiitoKala например Lii-M4.

По своему опыту могу сказать — аккумуляторы имеет смысл брать, только если пользуешься ими лично и постоянно. Лет десять назад покупал Eneloop третьего поколения и зарядку La Crosse RS-700. Имел глупость поставить аккумуляторы в детские игрушки. То что их регулярно разряжали в ноль это ещё ладно. А вот то, что большая часть аккумуляторов была утеряна — это обидно. В итоге аккумуляторы использую только в личной технике, а в игрушки и прочее — только батарейки.
Кто же спорит.
Лично я в данном случае не стал бы использовать функции Any и All, а написал что-то вроде:
for i, number in enumerate(numbers):
    if number > 10:
        print(f"{number} > 10 (index {i})")
        break
else:
    print("all numbers < 10") 
А что плохого в комбинировании? Можете сослаться на какой-нибудь PEP?
result = [x for x in (func(y) for y in data) if x]
То что сам пример упрощён не говорит о том, что морж в нём не уместен.
Fix:
result = any(
    number > 10
    for i, number in enumerate(numbers)
    if (key := i) is not None  # проверка не нужна, просто сохраняем индекс
)
if numbers and result:
    print(f"key:\t{key}\r\nvalue:\t{numbers[key]}")
Не надо моржа пихать где не попадя, во многих примерах он не нужен.
Не надо экономить строки в ущерб читаемости.

# result = [y := func(x), y**2, y**3]
y = func(x)
z = 3  # or 100500
result = [y**e for e in range(1, z+1)]
О ужас, аж две лишних строки кода!
Зато код легко читаем и изменяем, при изменении количества степеней достаточно изменить значение переменной z

# result = [y for x in data if (y := func(x))]
result = [x for x in map(func, data) if x]
Не потребовалось 5 строк кода, код стал даже короче на 2 символа.

import re
test = "Something to match"
patterns = (
    r"^.*(thing).*",
    r"^.*(not present).*",
)
for i, pattern in enumerate(patterns, 1):
    m = re.match(pattern, test)
    if m:
        break
print(f"Matched the {i}st pattern: {m.group(1)}")
И снова код более читаем и гибок.
В случае добавления паттерна в этом варианте добавится всего одна строка, в приведённом в статье — три строки.

# print(list(accumulate(data, lambda a, b: a*b)))
print(list(accumulate(data, operator.mul)))
Иногда нужно читать документацию, чтоб не выдумывать костыли и велосипеды.

Но я не говорю, что морж не нужен.
Это инструмент и использовать его надо с умом и по назначению.
Например в примере с Any и All он вполне уместен.
any((value := number) > 10 for number in numbers)  # True
print(value)  # 12
Удалёнку не рассматриваете?
Я пришёл к такому решению: дешёвый ноутбук и мощный стационарный компьютер, к которому подключаюсь по vnc.
Ноутбук Acer Aspire 3 (Pentium N6000, 4GB, SSD 256GB, 14" TN 1920x1080, Eshell) купил за 21990 ₽. Поставил Debian 11, всё работает кроме ждущего режима, пришлось пользоваться спящим.
Для пользовательских задач вполне хватает. Для разработки и работы с виртуалками подключаюсь к стационарному компьютеру. Производительности TigerVNC хватает для комфортной работы. Работаю при пинге ~70мс.
Как вариант, в зависимости от задач и бюджета, вместо стационарного компьютера можно использовать VDS.
Из плюсов — ноут лёгкий, тихий, компактный, автономность точно не меньше 3 часов (максимум не замерял). При такой цене не жалко сломать, потерять, залить кофе. Легче обеспечить сохранность данных — на компьютере raid и настроены бэкапы, а на ноуте ничего важного нет.
Из минусов — решение подойдёт под узкий круг задач, для разработки нормально, для работы с графикой нет. Для понимания, даже в Firefox листать хабр не комфортно, прокрутка дёрганая.
В марте тоже ставил FreePBX на M625q и также столкнулся с этой проблемой.
Разбираться было некогда, решил заменой NVMe диска на SATA.
Глокая куздра и все-все-все
Жевокая менза колюила грозка и сакавала яшчэ па пяходзе. На прывяге праз сваю дзбу она дапамала па цёплыя, свётлыя мары и яблыня, што гэтая ды на абайцы збярася ён, лёс у сям'яй знаходзся.

Чайнело… Мильные бокры
Юлись и дрырлись к поросе,
И глокой куздры развихры
Курдячились по белесе.

А кусявые да косе
Яры, кусявы, досевыны
На тую белу лебеду,
Которой вся округа тощища.
Да ить тутошняя кузяка
Занедужила, как кутяна

Lorem ipsum dolor sit amet, consectetur adipisicing elit.
Ut en elit vulnere dolor nesciuntque.
Cursus comprehendi
В этом разделе выложены некоторые дипломные, курсовые и контрольные работы для студентов, выполненные специалистами нашего портала.
Brodcast даст ширину канала как у худшего из каналов, но латентность как у лучшего из каналов.
Плюс дублирование даёт хорошую защиту от потерь пакетов, не 100%, но вероятность потери пакета сразу на двух каналах значительно ниже.
Поэтому при агрегации LTE, когда важнее получить более стабильный канал с шириной «как повезёт», лучше подходит broadcast.
Active-backup лучше подходит при агрегации стабильных каналов с разной шириной.
Зачем внутри шифрованного L2TP шифрованный OpenVPN?
Зачем вообще OpenVPN в этой схеме? Судя по статье, интерфейс ovpn_over_bonding1 используется только для маршрутизации, но ведь уже есть интерфейс bonding1 и для маршрутизации можно использовать его.

Information

Rating
Does not participate
Location
Серов, Свердловская обл., Россия
Registered
Activity