45


Осторожно! Чтение данного текста вслух может вызвать адского сотону.
Только для красноглазых!Мой приятель приболел, а т.к. переизбыток свободного времени вызывает у него зуд в разных частях тела, он начал мучить свою Arduino Uno R3.
Железка довольно архаичная, а потому быстро приземлила его сообщением о том, что все 2 килобайта оперативной памяти закончились.
*сюрпрайз мазафака!Приятель не сдался — он отправил мне скетч и попросил "
сделай мне нарядно, а?"
Я (ленивый, да ещё и гуманитарий) тут же принялся писать ему ответ в духе: ну вот же, первая же ссылка в гугле, тебя там, что, забанили?...
Допечатав ещё несколько нелестных высказываний в адрес форточников, аникейщиквов и прочих мышкоелозителей, я полез гуглить.
А вот фигушки!
Мой шикарный план "отделаться ссылкой на какое-нибудь обсуждение или урок" провалился с треском!
Гугл вместе яндексом упорно выдавали мне всякую дичь и вообще не про то, что нужно было бы "по науке".
Задача то на самом деле тривиальная:
на Arduino Uno R3 у которой есть пара сенсоров и пара актуаторов, есть RTC и сетевуха W5500 (
классная штука, OSI L4 уже в кремне и не напрягает атмегу!),
крутится вэб–сервер, который не выглядит "нарядно",
т.е. нет у него своих иконок (favicon) и приличного оформления (CSS), а очень хочется.
И вот тут он затронул проблему, которая давно медным тазом накрывает интернет,
а именно: десигнеры, которые с трудом освоили тильду конечно же знают и такой вещи, как favicon
и конечно же они знают, что под разные браузеры на разных устройствах эти самые иконки нужны разных размеров,
но не знают "как и зачем",
а потому упорно копируют чужие заблуждения и ошибки.
Т.е. если делать "нарядно" по–дизайнерски, то конечно же придётся к ардуинке подцеплять flash–модуль с карточкой на 64Gb.
*PROGMEM на ATmega328 всего 32KbА ещё же хочется красивую вёрстку (собственно именно на этом этапе у приятеля и закончилась оперативка),
да чтобы с всеобъемлющим CSS, а там и JS захочется побольше... Чтобы всё как у больших.
Но вернёмся к favicon и дизайнерам.
Если открыть исходники странички на которой ты читаешь этот текст (
Ctrl+U), то увидишь, что в команде ЯПа тоже есть десигнер, который вообще не вдупляет что он творит.
Давай на примере самого тупого в плане работы с favcion браузера (
из актуальных на данный момент) — Chrome (
любой на движке хрома)
*пока ты ещё не дочитал до развязки — ты сейчас думаешь про PNG 16x16px с именем favicon.ico?
бггг!Если ты открыл исходный текст этого документа, то может быть даже обратил внимание, что значки вкладок отличаются (вкладка с исходниками от вкладки документа).
Понял что произошло, да?
Я подтвержу твои догадки: при открытии сайта в браузере, подгружается одна из favicon описанных в <head/>,
причём браузер сам выбирает какую именно загрузить.
Chrome сейчас для тебя выбрал иконку
favicon-32x32.png и конечно же сжал её до 16x16px (на обычном 1080p десктопе с Windows),
но для вкладки с исходниками тот же Chrome показал иконку
favicon.ico — и тут всё ясно: браузер не выполнял инструкции из <head/>, а просто самовольно спросил у сервера файл
/favicon.ico*а ты думал откуда в логах твоего сервера так много обращений по этому URL?Бред! А ведь там ещё иконки для андроида, для всяких яблок и для тёмной темы оформления браузера.
*Интересно — для какого браузера ЯП объявил favicon.ico в <head/>?
Огнелис у ЯПа вообще спросил favicon-16x16.png и favicon-194x194.png — бля, да что происходит то?И что, нам теперь так же делать на ардуинке — каждому браузеру по иконке рисовать?
Нет конечно.
Универсальное обезболивающее давно изобретено — SVG!
В отличии от растровых форматов, векторные изображения превосходно масштабируются,
а значит нам нужно всего одно изображение на все случаи жизни (ну, может два — иногда не обойтись без версии "для тёмной темы")
Объяви в <head/> один единственный
favicon.svg, достаточно крупный, чтобы не выглядел убого при большом масштабе и пусть браузеры и пр. сами себе выбирают нужный размер.
Большинство вменяемых верстальщиков об этом знают давно и успешно пользуются,
но оказывается, что готовые примеры реализации SVG favicon для Aurduino вообще не гуглятся.
Вместо этого начинающему МК`шнику упорно предлагается подключить к Arduino flash–модуль, хранить там картинку или переписать блоб в BASE64 и хранить это всё в виде стрингов.
Придётся перебороть лень и сделать "правильно", а заодно показать "любителю нарядного" как не просрать всю оперативку.
сразу же отмазка (AKA Disclaimer): в первую очередь делюсь с тобой потому, что сам не нашёл готового решения,
ну и воспринимай прочитанное критично, это не единственное расово–верное решение — сам я нередко ошибаюсь и заблуждаюсь.1. Мы объявим только одну иконку в <head/>,
в теории браузер не должен в обычных условиях спрашивать ардуинку на предмет
/favicon.ico,
но на всякий случай по этому URL`у нужно поставить заглушку.
Самая подходящая заглушка, ИМХО, это вернуть код 204 (no content) — это и не ошибка, и не предупреждение, а значит для всех "всё идёт по плану".
Кстати, рекомендую на твоём сайте сделать тоже самое — это избавит тебя от засирания логов предупреждениями о 404
(
ты же наверное отдаёшь красивую 404.php — не дофига ли трафика ради того, чтобы сказать браузеру или боту о том, что такой иконки нет?)
и тем самым облегчит чтение логов, ну и сэкономит какое-то количество места в /var/log/
2. Попутно придётся решить проблему с нехваткой оперативной памяти.
Я ленив, а значит буду использовать стандартную библиотеку StreamLib (довольно лёгкая, но сэкономит время и нервы).
Но ты можешь наплевать на побайтовый вывод из PROGMEM и пользоваться "чистым" F() macro (
включи сетевой сниффер,
посчитай количество переданных пакетов на страничку с показаниями сенсоров и парой выключателей — бодрит?)
Или же можешь самостоятельно читать в буфер и отправлять фреймы при его наполнении.
Не? Я так и подумал ;)
Постараюсь объяснить подробно что и для чего, но ты на меня не обижайся — это только для тех, кто вообще ничего не понимает, ага?
И да,
я не смогу ответить тебе в этом топике — из–за болезненной реакции на человеческую глупость, я выпросил себе лимит "одно сообщение в сутки".
Погнали:
подключаем сетевуху W5500 и функции вэб–сервера