Хотел сделать сквозное шифрование, но чет руки так и не дошли доделать до конца. Эксперимент удался и этого, наверно, уже достаточно.
]]>Было выпилено все по максимуму, сделан на си интерфейс для DOS и собрано через DJGPP. А ну еще перекодировка в CP866 на лету с чтением IDF файлов по сдвигу. Причем если файл игры не IDF, а прямо ворох lua, то нужно позаботиться об именах файлов в размерности 8.3. Графику и звуки можно смело удалять, оно все равно не читается. Итого вся игра с легкостью поместится на одну дискетку.
Запуск на моем 486м. Минималка 386 и 4 Мб ОЗУ. На экране демка, которую пишем с сыном для знакомства с разработкой игр.
Встроена поддержка расширенного режима для строк через аргумент -ega
]]>Если вы пользуетесь vscode, то знаете как это установить https://git.blindage.org/21h/vscode-lexicon/releases
]]>Для изготовления в таком размере подойдут обычные 3м отрезки арматуры 8 или 10мм. Лучше берите 8 мм потому, что 10 мм я вспотел загибать.
Карта распила:
– 1 хлыст 3м: 1м + 2м, внутреннее и внешнее кольцо + 5-6 см провар на каждом
– 1 хлыст 3м: 1м + 2м, внутреннее и внешнее кольцо + 5-6 см провар на каждом
– 2 хлыста 3м: 37 см (16 шт), соединение внутреннего кольца с внешним
– 1 хлыст 3м: 37 см (8 шт), соединение внутренних колец между собой
Полученные отрезки по 1м и 2м загибаются тяжелым молотком или кувалдой в окружность между 2 огромными камнями. Да, это долго и первый грубый загиб лучше сделать руками о что-то прочное типа фонарного столба на улице. Чтобы загнуть 10мм арматурины в кольца я долбил 2 кг кувалдой минут по 5-10 каждую
Если есть возможность стрельнуть у соседа трубогиб стреляйте без раздумий! При загибе закладывайте 5-6 см нахлест чтобы замкнуть кольцо сваркой.
Раскладываете все детали симметрично и привариваете. Соединение внутренних колец выкладывать по внешней стороне чтобы была возможность насадить катушку хотя бы на черенок лопаты и чтоб она свободно крутилась без прыжков. Обваривайте арматуру хорошо, электродов 6 ушло на все. Лишнее спиливайте. Я решил не спиливать чтобы катушка сама не каталась по поверхностям, но учтите, что это опасно в случае падения на нее ![]()
Буду ли я еще раз делать такую конструкцию? Да ебись оно тунгусскими сусликами, да ни за что. Лучше закупитесь шпильками, тонкими полипропиленовыми трубами и стяните ими 2 колеса из фанеры или осб. Абсолютно все детали напиливаются даже самым дешевым электролобзиком.
]]>Первым делом нужно заблочить доступ в местах, куда нормальный человек вообще никогда не полезет и использовать это в целях блокировки:
if ($request_uri ~* "/(raw|src|commits|blame)/commit/") {
set $block_bot 1;
}
# Если переменная активирована, возвращаем 418 и сразу стопорим обработку
if ($block_bot = 1) {
return 418;
}
Это пометит в логах такие говнозапросы кодом 418. Потом в приложении нужно отключить скачивание архивов. Боты прожамкивают все ссылки на них и генерируют огромного размера кеш. Всего за 1 вечер у меня он вырос на 30 гигов. Добавить в app.ini:
[repository] DISABLE_DOWNLOAD_SOURCE_ARCHIVES = true
Я мигрировал с Gitea на Forgejo, проверьте имя опции для своего приложения, если не сработало сразу.
В принципе, вы уже на этом этапе ощутите прирост скорости и эффективность очистки кешей архивов через панель администратора. Это все можно завернуть на fail2ban, если вам не жалко памяти и процессорного времени потому, что хостов будет великое множество.
Создаем новое правило в файле /etc/fail2ban/jail.d/nginx-fuck-ai-bots.conf
[nginx-bot-blocker] enabled = true port = http,https filter = nginx-bot logpath = /var/log/nginx/k8s-git-access.log maxretry = 1 bantime = 86400 findtime = 60 ignoreip = 127.0.0.1/8 192.168.0.0/16 10.0.0.0/8 action = iptables-multiport[name=nginx-bot, port="http,https", protocol=tcp]
Можно сделать модифицированную копию этого action с добавлением маски /24, fail2ban начнет вваливать их небольшими подсетями, это сэкономит немного памяти. Но памяти сожрется очень много, сразу говорю.
Производительность можно увеличить переходом на кастомный action с ipset (ставится отдельно):
action = iptables-ipset-24[name=nginx-bot, port="http,https", protocol=tcp, blocktype=DROP]
А сам action в файле /etc/fail2ban/action.d/iptables-ipset-24.conf сделать таким:
[INCLUDES]
before = iptables-common.conf
[Definition]
actionstart = ipset create <ipmset> hash:net timeout <default-timeout><familyopt>
<iptables> -I <chain> -p <protocol> -m multiport --dports <port> -m set --match-set <ipmset> src -j <blocktype>
actionflush = ipset flush <ipmset>
actionstop = <iptables> -D <chain> -p <protocol> -m multiport --dports <port> -m set --match-set <ipmset> src -j <blocktype>
<actionflush>
ipset destroy <ipmset>
actionban = ipset add <ipmset> <subnet> timeout <bantime> -exist
actionprolong = %(actionban)s
actionunban = ipset del <ipmset> <subnet> -exist
[Init]
default-timeout = 600
ipmset = f2b-<name>
familyopt =
subnet = $(echo <ip> | grep -oP '^\d+\.\d+\.\d+').0/24
[Init?family=inet6]
ipmset = f2b-<name>6
familyopt = <sp>family inet6
Обращаю внимание на тип таблицы hash:net и получение subnet.
Теперь нужно создать сам фильтр /etc/fail2ban/filter.d/nginx-bot.conf
[Definition] failregex = ^"[^"]*","<HOST>","[^"]*","418","[^"]*/(raw|src|commits|blame)/commit/[^"]*" ignoreregex =
У меня логи пишутся в формате csv чтобы их было легко парсить. Если у вас дефолт, то должно быть что-то типа
failregex = ^<host> -.*GET.*/(raw|src|commits|blame)/commit/.* 418
Если все зашибок в логе fail2ban вы увидите что-то типа
2026-06-12 04:48:55,646 fail2ban.filter [2601244]: INFO Added logfile: '/var/log/nginx/k8s-git-access.log' (pos = 11892730, hash = 3766ecb7dadb449dee6e990831a627eb3468e574)
2026-06-12 04:48:55,665 fail2ban.jail [2601244]: INFO Jail 'sshd' started
2026-06-12 04:48:55,666 fail2ban.jail [2601244]: INFO Jail 'nginx-bot-blocker' started
2026-06-12 04:48:55,854 fail2ban.filter [2601244]: INFO [nginx-bot-blocker] Found 14.191.222.88 - 2026-06-12 04:48:55
2026-06-12 04:48:55,866 fail2ban.actions [2601244]: NOTICE [nginx-bot-blocker] Ban 14.191.222.88
2026-06-12 04:48:56,067 fail2ban.filter [2601244]: INFO [nginx-bot-blocker] Found 113.181.28.191 - 2026-06-12 04:48:56
2026-06-12 04:48:56,083 fail2ban.actions [2601244]: NOTICE [nginx-bot-blocker] Ban 113.181.28.191
2026-06-12 04:48:56,092 fail2ban.filter [2601244]: INFO [nginx-bot-blocker] Found 156.255.247.131 - 2026-06-12 04:48:56
2026-06-12 04:48:56,289 fail2ban.actions [2601244]: NOTICE [nginx-bot-blocker] Ban 156.255.247.131
2026-06-12 04:48:56,479 fail2ban.filter [2601244]: INFO [nginx-bot-blocker] Found 113.176.240.57 - 2026-06-12 04:48:56
Также можно понаблюдать как ваш фаервол заваливает адресами
watch -n 1 "iptables -L f2b-nginx-bot -n|wc"
Итого мы имеем, что послали любителей халявы на хуй + сразу же их определили в бан.
]]>Сайт с документацией https://imap2mbox.blindage.org
Программа предназначена для однократного запуска и не имеет функций архивирования, это простой инструмент для выкачивания писем в mbox файлы с возможностью докачать новые письма позже без повторной полной выкачки. Для архивации файлов используйте специализированное ПО, например, borg или даже самописный bash скрипт, что удобнее. Файлы mbox могут быть опционально сжаты в gzip прямо во время выкачивания писем, но тогда вы лишитесь возможности делать инкрементный бэкап с помощью того же borg просто потому, что файл стал бинарным и немного меняется каждое сжатие.
Запуск рекомендуется делать регулярно через cron. Также можно контейнеризировать весь набор ПО для бэкапа почты и запускать в Kubernetes по Cronjob, сохранив конфиг в секрет. Вывод программы подготовлен к использованию с системами сбора логов в kv формате. Там же на сайте есть helm чарт с кронджобой.
]]>
]]>
# Отключить...]]>
Полный сброс всего USB-контроллера (радикальный способ)
# Отключить USB-контроллер sudo sh -c "echo 0 > /sys/bus/pci/drivers/xhci_hcd/unbind" # Включить обратно sudo sh -c "echo 1 > /sys/bus/pci/drivers/xhci_hcd/bind"]]>
Первым шагом нужно создать ваш новый виртуальный диск. Это можно сделать прямо в VirtualBox в менеджере дисков.
Следующий шаг это установить необходимые утилиты и модули ядра из поставки Qemu.
sudo apt install qemu-utils qemu-block-extra sudo modprobe nbd max_part=8 qemu-nbd --version
Вся подготовка завершена, теперь можно указать новое блочное устройство.
sudo qemu-nbd -c /dev/nbd0 /tmp/New-disk-image.vdi
Наконец, финальный шаг это создать таблицу разметки и новую партицию в новом блочном устройстве. Как пример, я создам файловую систему ЕХТ4 и примонтирую к своей хост системе. Вы также можете даже записать какие-то специальные образы используя утилиту dd.
cfdisk /dev/nbd0 mkfs.ext4 /dev/nbd0p1 tune2fs -L VDIPART1 /dev/nbd0p1
На всякий случай проверим таблицу разметки.
vlad@turtle:/$ fdisk -l /dev/nbd0 Disk /dev/nbd0: 256 GiB, 274877906944 bytes, 536870912 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: dos Disk identifier: 0x10b50298 Device Boot Start End Sectors Size Id Type /dev/nbd0p1 2048 536870911 536868864 256G 83 Linux
Теперь можно как обычно примонтировать этот раздел и потом после работы отмонтировать.
sudo mount /dev/nbd0p1 /mnt/ sudo rsync -avz /my/special/files/ /mnt/ sudo umount /mnt
Отключение. Необходимо перед использованием в VirtualBox!
qemu-nbd -d /dev/nbd0
Вы великолепны.
]]>В моей инфре мониторится как можно больше всяких железок прямым или косвенным способом поэтому я ему написал экспортер для Prometheus.
Взял себе сразу 2 штуки чтобы покрыть вайфаем 1 и 2 этажи, соединив их через EasyMesh. Внутри увесистые куски алюминия нехило отводящие тепло от микросхем.
Внутри 2 пары 2-диапазонных антенн, направленных в разные стороны для хорошего покрытия вайфаем. Они не припаяны поэтому при необходимости можно заменить антенну на вашу собственную.
В случае проблем с доступом к веб интерфейсу возможно подключиться к консольке через UART, достаточно соединить землю, TX и RX.
Прошивка состоит из образа, сжатого в squashfs примерно до 10 Мб и вспомогательных файлов, которые придется поправить если вы захотите запатчить прошивку самостоятельно, распаковав образ, поменяв что-то и запаковав обратно. Никаких ключей вам не надо присовывать, роутер просто схавает новую прошивку, главное обновить все файлы с хеш суммами. Это открывает непаханное поле по модификации и запилу новых фичей, как было с легендарным Asus WL500gP. Ну а поскольку нет никаких проверок подписей, то лучше не ставить в ваш роутер что попало из интернета, могут и троян подарить 
Если вы запороли прошивку, то она хранится в 2-х банках памяти и с каждой прошивкой активный банк поочередно меняется. Если в течении 10 минут после прошивки произошел рестарт роутера, то старая прошивка восстановится самостоятельно и активный банк сменится на старый. Если не получилось, то можно подключиться к консоли по UART и попробовать прошить руками. Я уже запорол один раз прошивку, но добрый элтеховский саппорт помог мне все вернуть взад
. Ну а если совсем окирпичили, то придется искать JTAG.
Совместимость роутера с модемами: Alcatel IK41VE1; D-Link DWR-910; DEXP M1; Digma Dongle DW1961; Huawei 3372H-153, E3531, E5576-320, 8372H-320; Joy’s D20; Yota WLTUBA-107; ZTE MF79U; Мегафон М150-4.
]]>Сформируем шаблон запроса и сохраним в файл hiwatch-body.tmpl:
<?xml version="1.0" encoding="UTF-8"?> <TextOverlayList version="2.0" xmlns="http://www.hikvision.com/ver20/XMLSchema"> <TextOverlay> <id>1</id> <displayText>$CAM_TEXT</displayText> <enabled>true</enabled> <positionX>0</positionX> <positionY>576</positionY> </TextOverlay> </TextOverlayList>
Здесь передаются координаты OSD, ID, явное включение вывода и сам текст. Разумеется, все можно шаблонизировать.
Теперь делаем скрипт hiwatch-set-text.sh, который выведет текст:
#!/bin/bash
# Добываем данные из MQTT
romashka=$(/usr/bin/mosquitto_sub -C 1 -N -h 192.168.1.9 -p 1883 -u login -P password -t "/device/48:55:19:C8:E4:0A/termo/1/data" -W 1)
zemlya=$(/usr/bin/mosquitto_sub -C 1 -N -h 192.168.1.9 -p 1883 -u login -P password -t "/device/zemlya/termo/1/data" -W 1)
# Генерируем строку, которую вставим в шаблон
export CAM_TEXT="Romashka: ${romashka}, Grunt: ${zemlya}"
# Подгружаем шаблон и сразу же вставляем в него переменные
body=$(envsubst < hiwatch-body.tmpl)
# URL камеры куда упадет запрос
url="http://192.168.3.54/ISAPI/System/Video/inputs/channels/1/overlays/text"
# Вписываем креды от камеры и через PUT кидаем текст запроса
curl -s --digest -X PUT -u login:password "$url" -d "$body"
Смотрим результат.
Вы великолепны.
]]>
У роутера 2 банка памяти, которые переключаются после каждой прошивки. Особое указание: если после прошивки в течении 10 минут перезагрузить роутер, то роутер вернется к прошлому состоянию, переключившись на старый банк. Поэтому если вы запороли вашу кастомную прошивку, то можно вернуться к предыдущей просто успев перезагрузить роутер.
Обновить прошивку, используя tftp, вы можете следующим образом:
1. Выкачиваем по tftp прошивку в /tmp раздел
$> tftp -g -r /srv/tftp/orig.tar.gz -l /tmp/orig.tar.gz 192.168.3.6
2. Нужно убедиться какой банк активный в данный момент:
Если активный 1 банк, то записываем в 0, если 0 то в 1.
$> nv getenv sw_active
sw_active=1
Видим, что активный банк 1, значит пишем в 0.
3. /etc/scripts/fwu_starter.sh “указываем нужный банк” “путь до tar.gz архива” “0”
$> /etc/scripts/fwu_starter.sh 0 /tmp/orig.tar.gz 0 0
4. Выполнить след. команду
$> nv setenv sw_tryactive “Номер банка в который записывали прошивку”
5. Reboot
$> reboot
Собирается на алюминиевой полосе толщиной 2мм. Крепеж для уровня рассчитан под самый популярный размер 25 мм, закрепляясь обычным скотчем чтобы не ерзал туда сюда. На рифленой поверхности обычные большие канцелярские прищепки.
Инструмент крепится к нижнему ряду плитки с помощью прищепок, фиксируясь на бугристой поверхности по которой можно выставлять желаемую высоту видимой зоны плитки, а новый ряд опирается на “ушки” сверху, далее проверяете горизонт и если надо регулируете потому, что плитка иногда бывает кривоватая.
Купить модель на 3dToday.
]]>Выводим размеры волюмов и замечаем вот такое безобразие.
$> df -h tmpfs 3.8G 17M 3.7G 1% /tmp
А теперь представьте как вы запускаете mc и заходите посмотреть содержимое архива на 10 гигов. Есть архивы, которые mc может обработать просто прочитав его заголовки (типа zip), а есть непрерывные архивы (например, tar.gz), которые бабахнут не просто 10 гигов, а распакуют в /tmp все содержимое архива, а там и все 50-100 гигов может быть. Это означает, что в /tmp резко закончится место и операция просмотра архива завершится с ошибкой. Ладно, допустим вы таки зашли в архив и все хорошо, работаете, смотрите файлы и тут бац, новая ошибка, неизвесно как, но распакованные файлы ПРОПАЛИ! Там же в /tmp располагаются файлы Libreoffice, ssh, ssh-agent и кучи другого системного софта. Представляете какие спецэффекты вас будут ждать, если затянете с ними работу более, чем на сутки?
А всему виной еще одно западло, которое приготовили нам создатели systemd:
Чтобы отключить монтирование /tmp как tmpfs нужно в systemd выключить tmp.mount:
sudo systemctl mask tmp.mount
Теперь все временные файлы в /tmp будут располагаться на диске как в любом нормальном linux.
Отключение любых очисток с костылями
systemctl mask systemd-tmpfiles-clean.timer
Также можно изменять поведение, если отредактировать конфиги в /usr/lib/tmpfiles.d или создать новые в /etc/tmpfiles.d.
Например, модифицировать /usr/lib/tmpfiles.d/fs-tmp.conf для очищения разово при загрузке, как описано в документации:
D! /tmp 1777 root root -
А еще меня больше всего вымораживает вот это правило: /usr/lib/tmpfiles.d/fs-usr-local.conf
d /usr/local/bin 0755 root root - d /usr/local/include 0755 root root - d /usr/local/lib 0755 root root - d /usr/local/libexec 0755 root root - d /usr/local/man 0755 root root - d /usr/local/man/man1 0755 root root - d /usr/local/man/man2 0755 root root - d /usr/local/man/man3 0755 root root - d /usr/local/man/man4 0755 root root - d /usr/local/man/man5 0755 root root - d /usr/local/man/man6 0755 root root - d /usr/local/man/man7 0755 root root - d /usr/local/man/man8 0755 root root - d /usr/local/man/man9 0755 root root - d /usr/local/man/mann 0755 root root - d /usr/local/sbin 0755 root root - d /usr/local/share 0755 root root - d /usr/local/src 0755 root root - d /usr/local/lib64 0755 root root -
Программ в /usr/local просто хренова гора установлена обычно.
]]>Ива — род деревьев, кустарников и полукустарников семейства Ивовые. Включает около 600 видов, распространённых почти по всему земному шару.
Большинство ив — невысокие деревья и кустарники, реже встречаются древовидные ивы высотой до 40 метров. Побеги тонкие, прутьевидные, покрыты восковым налётом. Почки мелкие, сплюснутые, покрыты многочисленными чешуями. Листья очерёдные, черешковые, у некоторых видов игольчатые. Цветки собраны в кистевидные соцветия, расположены вдоль ветвей или в их верхушечной части. Плод — коробочка. Семена очень мелкие, легко разносятся водой и ветром.
Размножаются семенами, черенками, отводками, делением куста. Ива быстро растёт, устойчива к переувлажнению, загазованности воздуха, светолюбива. Используется для укрепления берегов рек и водоёмов, озеленения парков и скверов, в садоводстве и пчеловодстве. Кора многих видов применяется в медицине.
Семенное размножение используется редко, так как оно требует специальных условий и ухода. Семена ивы очень мелкие и легкие, поэтому они могут распространяться ветром на большие расстояния.
Сначала у ивы набухают почки, а затем из них появляются маленькие пушистые цветы.
В процессе взросления они увеличиваются в размерах и появляются первые пестики и тычинки.
Полностью развитый цветок, который ни один уважающий себя шмель не пролетит.
В конце цветения появятся семена, которые может разносить ветер
]]>Один из лучших вариантов для компа и мобилки
Еще интересные варианты
Аватарки для чатиков
И рисунки карандашом. На обои их не поставишь особо, но для эстетического удовольствия вполне неплохо выглядит. Возможно даже как постер на стену отлично подойдет.
]]>А это фотография самого гобелена, которую можно поставить на мобилку или рабочий стол
А вот нагенерировал нейросетью, опираясь на паттерн гобелена. Все картинки в хайрезе и подходят как обои на рабочий стол.
Космический воин
Ракета
Грибы
Человек под мостом
Человек в автомобиле
Закат солнца
Настольный компьютер
Кабинет
Космический шатл
Орбита Земли
Аудио кассета
Девушка
]]>
Инструкции
]]>Часы подвешиваются на цепочку за петельку над карманом. Цепь все еще оригинальная, за столько лет не деформировалась и распадаться не торопится, замочек также оригинал, он больше современных китайских раза в 2, хорошая сталь и также деформироваться не хочет. Рисунок рельефный и очень хорошо прощупывается.
]]>Теперь скрипт работает отлично!
Микросервис https://git.blindage.org/21h/geoip-api-service
Скрипт geoip для eggdrop https://git.blindage.org/21h/eggdrop-geoip
apt-mirror. Поскольку они те еще пидоры сейчас нужно это делать через прокси сервер в европе. После быстрого поиска по всяким стакэксченджам и подобным медиумам я нашел только совершенно идиотские способы типа добавления переменных в /etc/environment или /etc/profile и других офигительных советов от программистов и это совершенно не удовлетворяло меня. В общем, я полез посмотреть исходный код apt-mirror https://github.com/apt-mirror/apt-mirror/blob/master/apt-mirror#L100 и батюшки мои! Все нужные опции уже есть.
Успешный запуск apt-mirror:
Набор маничестов для Kubernetes https://git.blindage.org/21h/apt-mirror-kubernetes чтобы это говно можно было в кубере по кронджобе обновлять.
]]>
]]>
зерги эволюционировали из растений, то они эволюционировали бы из одуванчиков.
Пыльца
Тычинка
Семечко
Если прям обожаете одуванчики, то можно найти больше здесь.
]]>Репозиторий с кодом и полными инструкциями https://git.blindage.org/21h/qr-generator-service
Сервис умеет в ограничение списка доменов и принимает GET и POST запросы по урлу /qr:
$ curl -vs -X POST -d '{"URL":"http://blindage.org/"}' http://localhost:8080/qr -o qr.png
* Trying 127.0.0.1:8080...
* Connected to localhost (127.0.0.1) port 8080 (#0)
> POST /qr HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/7.81.0
> Accept: */*
> Content-Length: 30
> Content-Type: application/x-www-form-urlencoded
>
} [30 bytes data]
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Content-Type: image/png
< Date: Fri, 26 May 2023 21:25:17 GMT
< Content-Length: 430
<
{ [430 bytes data]
* Connection #0 to host localhost left intact
]]>Еще у меня есть собственный шрифт для DOS, который я сделал, назвал его comic.
]]>Для работы требуется в первую очередь получить токен в панели управления и, собственно, сам bind файл. Ну и, конечно же, скачать бинарник из раздела релизов в репозитории с кодом https://git.blindage.org/21h/selectel-dns-bind-zone-upload. Некоторые типы записей нежелательно импортировать, например NS или SOA, если зона уже была создана самостоятельно руками, поэтому они по умолчанию отключены, но их всегда можно включить через дополнительные аргументы.
TOKEN=selectel_token_2342 ./selectel-dns-bind-zone-upload \
-domain blindage.org -zonefile blindage.org.txt -includeNS
Поддерживаемые типы записей:
Записи PTR и другие, не входящие в список, игнорируются.
]]>
А это после раздавливания между 2 стеклами. Я еще понаблюдаю некоторое время и посмотрю как гриб разрастется.
]]>
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/configuration-snippet: |
internal;
rewrite ^ $original_uri break;
nginx.ingress.kubernetes.io/server-snippet: |
location /api/file {
if ( $request_method = GET) {
set $target_destination '/api/file/_get';
}
if ( $request_method = POST) {
set $target_destination '/api/file/_post';
}
set $original_uri $uri;
rewrite ^ $target_destination last;
}
name: simple-two-route
namespace: test
spec:
ingressClassName: nginx
rules:
- host: blindage.org
http:
paths:
- backend:
service:
name: service-post
port:
number: 80
path: /api/file/_post
pathType: Exact
- backend:
service:
name: service-get
port:
number: 80
path: /api/file/_get
pathType: Exact
]]>Другой принт и проблемы ровно те же самые
]]>Нити очень тонкие, прям ОЧЕНЬ тонкие и их много
]]>А это очень мелкие древесные опилки, также отчетливо видны похожие волокна.
]]>Перец черный молотый
Соль поваренная мелкая
]]>А этот светодиод у меня лежит еще со времен СССР, не знаю маркировку.
Это современный светодиод из китая. Технология не сильно поменялась.
]]>А это индикатор АЛС318А, вообще нулевый мне достался как запчасть к другому калькулятору. Как мы видим, линзы все еще используются чтобы кристаллы казались больше.
]]>Есть другая микросхема со схожей маркировкой, но с 16 кбитами.
]]>И да, в ней действительно полно золота и она в дорогущем керамическом корпусе. Думаю, что создавалась для устройство специального назначения.
]]>Ну все как обычно, поднимается где-нибудь рядом с сервисом, который необходимо отслеживать. Если у вас kubernetes я уверен на 100% вы справитесь с деплоем туда самостоятельно.
version: '3.3'
services:
filebeat:
image: elastic/filebeat:7.16.2
command: ["-e", "--strict.perms=false"]
environment:
LOGSTASH_HOST: 10.2.113.39
LOGSTASH_PORT: "5044"
user: root
restart: always
volumes:
- /srv/db/mysql-logs:/var/log/mysql:ro
- /srv/db/filebeat.yml:/usr/share/filebeat/filebeat.yml
- /srv/db/filebeat-modules.d:/usr/share/filebeat/modules.d
Внутри конфига filebeat.yml указываем output.logstash
filebeat.config.modules:
path: ${path.config}/modules.d/*.yml
output.logstash:
hosts: ['${LOGSTASH_HOST}:${LOGSTASH_PORT}']
index: "service-db-test-%{+yyyy.MM.dd}"
setup:
template:
name: "service-db-test"
pattern: "service-db-test"
Вот тут уже начинается магия. Мы видим, что это вообще не самый простой logstash.
version: "3"
services:
logstash:
image: opensearchproject/logstash-oss-with-opensearch-output-plugin:7.16.2
volumes:
- "./config:/usr/share/logstash/config:ro"
ports:
- "5044:5044/tcp"
- "5044:5044/udp"
restart: always
Конфиг пайплайна как раз и является ключевым во всей цепочке сбора логов. Обращаем внимание на то, что в output уже opensearch, а не эластик.
input {
beats {
host => "0.0.0.0"
port => "5044"
}
}
output {
if [service][type] == "mysql" {
opensearch
{
hosts => ["https://10.3.27.105:9200"]
index => "service-db-test-filebeat-%{+yyyy.MM.dd}"
user => "mylogin"
password => "mypassword"
ssl => "true"
ssl_certificate_verification => "false"
}
#stdout {}
} else {
opensearch
{
hosts => ["https://10.3.27.105:9200"]
index => "stand-test-filebeat-%{+yyyy.MM.dd}"
user => "mylogin"
password => "mypassword"
ssl => "true"
ssl_certificate_verification => "false"
}
#stdout{}
}
}
Подключаем этот пайплайн в logstash.yml: path.config: "./config/pipeline.conf"
Создаем нужные настройки для индексов в кибане и читаем логи.
Готово. Можно идти пить чай.
]]>У обоих датчиков есть цифровой выход с низким и высоким уровнем сигнала и аналоговый выход для АЦП. Понятно дело, что цифровой выход считать очень просто и часто даже не нужен МК чтобы сработала какая-то логика, например, через реле включить сигнализацию, а вот с аналоговой ногой уже не все так просто. Уровень выходного аналогового сигнала регулируется переменным сопротивлением под приемлемый уровень начального сигнала. У меня отладочная плата на ESP8266, но и для всяких андурин принцип работы ровно тот же. Никаких специальных библиотек не требуется, только использовать встроенный АЦП.
#define MQAnalogPin A0
int gasLevelWarning = 300;
void setup() {
Serial.begin(9600);
}
void loop() {
int gasLevel = analogRead(MQAnalogPin);
Serial.print(gasLevel);
if (gasLevel > gasLevelWarning) {
Serial.println(": WARNING! GAS LEAK!");
} else {
Serial.println(": clean");
}
delay(50);
}
Тестируем
Я не уверен, что из-за нагревательного элемента внутри эти датчики можно держать включенными постоянно иначе он может выйти из строя, нужно будет сделать подключение через оптрон или транзистор и опрашивать, скажем, раз в 15-30 минут с прогревом в течении минуты.
]]>Идем в настройки профиля -> Advanced и отключаем flow control. Зачем это фуфло держать включенным одним создателям KDE известно.
Выход из htop и mc не работал по F10, традиционно на кой-то черт вызывалось меню konsole, но тщательно обшарив настройки я не нашел где это отключается. Оказалось, что погружаясь все в больший кретинизм разработчики текущей версии KDE забиндили кнопку F10 на вызов любого главного меню. Никто из этих утырков не подумал, что огромная часть софта использует эту кнопку.
]]>
]]>
Крышку снизу можно напечатать и заклеить, а я просто залепил лентой. Плату с диодами закрепите термоклеем.
]]>На ручке размещается держатель для аккумулятора 14500 (3.7в)
Получилось примерно так. Не смотрите, что я сломал одну стенку, так получилось 

]]>