Отправлял в Discord (десктопный). Видимо, бекенд по расширеню понял, что это видео, и решил его отдавать с плеерной обвязкой, а там уже фронтендовая часть сумела раскодировать по внутренностям.
Разработчик open source проекта несёт ровно столько же ответственности за исправление уязвимостей, сколько и closed source - очень часто "no warranty".
Размер (конкретного) ПО и количество багов конечно только если проект больше не получает новых фич, лишь исправления багов. И даже в этом случае, количество багов может расти: обновились системные библиотеки, железо, настройки окружения - и ваш продукт начал вести себя не как положено.
"теперь с этим справляется 1 человек с помощью 10 сканеров уязвимостей" - и эти 10 сканеров найдут 10 000 уязвимостей, из которых не галлюцинациями будут, скажем, 3% - как один человек это всё проверит? Почитайте Death by a thousand slops, особенно 4 пример, Buffer overflow in strcpy
"Например, можно включить дополнительную стадию в свой CI\CD процесс" - см. п. 3 про кучу не-уязвимостей. А кто будет за эти прогоны платить, лично GitHub?
Да.
Не обязательно быть мейнтейнером, чтоб стать контрибутором. Раз уж говорим про open source, то вот как раз патч прислать может любой мимокрокодил. Да, не факт, что любой "мимокрокодильный" патч примут как есть, но он как минимум покажет один из возможных методов исправления.
С другой стороны как раз сидит ИИшенка, которая по своему шаблону завела баг. И даже если нет - в самом баге УЖЕ написано, какие сроки разглашения - почему сторона, создающая баг не могла первой связаться с представителями проекта?
Когда вам в проект накидывают кучу... просто кучу, вам нужно потратить время и силы чтобы это всё разобрать, категоризировать, приоритизировать. В какой-то момент, накидываемая куча становится настолько большой, что вы не можете с ней совладать, и она начинает бесконтрольно расти, а настоящие баги начинают теряться. Это натуральный DoS. Тем более мерзко, что примерно в то же время, кто-то из Google дал интервью вида "наше DeepSleep такое крутое, нашло 20 багов в мультимедиа продуктах - только вот их не исправили ещё".Это подгонка фактов и вампирский пиар. Аж сейчас упоминать про это противно, тьфу.
Многим пользователям GUI-IDE приходится страдать от того, что запустив сборку проекта приходится ждать окончания непредсказуемое время.
У меня в MS VS прям графический прогресс-бар рисуется :)
Простой счётчик файлов в принципе не сильно поможет решить проблему "Вы никогда не можете сказать сколько еще осталось ждать до окончания процесса":
есть великое множество single-header библиотек, они просто не попадут в счётчик как он есть. Это легко исправить, но...
файл на 50 строк и файл на 1050 строк будут собираться за очень разное время. Очень может быть, что у вас не очень большая программа, которая по тем или иным причинам собирает SQLite из его амальгамации - там пара .h и .c занимают вместе под 10 мегабайт
а ещё после сборки чаще всего идёт линковка, и может быть не одна (если это какой-то массивный проект с пачкой промежуточных библиотек), и может быть ещё и с LTO, которое может линковку замедлить в десятки раз
В итоге, конечно, со счётчиком чуть нагляднее, чем совсем вслепую, но не сильно точнее, чем прогресс-бары / счётчики при копировании файлов: есть и число файлов, и суммарный объём, и подсчёт уже затраченного времени - но предсказание всё равно плавает как ветка в шторм
Как будто бы мессенджеры не очень поддерживают MKV как видеоконтейнер?.. WebM, MOV - да, видел работающими.
Ради интереса записал OBSкой 2 секунды видео в MKV, но с обычными MP4шными кодеками (AVC + AAC LC). Telegram и Discord предлагают его скачать как любой другой бинарный файл, не показывают как видео (хотя Discord показывает превьюшку при отправке, видимо Electron сумел декодировать - Firefox тоже успешно воспроизводит MKV, если в него кинуться). Вот если переименовать файл в .mp4 - тогда всё нормально, подставляют плеер как положено.
В статье очень не хватает информации, что этот баг найден в кодеке для LucasArts SANM / Smush. Соответственно, "в дикой природе" используется он только для просмотра катсцен в некоторых играх LucasArts.
Какая разница, где он найден? А такая, что просто так, при стандартных сценариях работы с современным мультимедиа, наткнуться на использование этого кодека невозможно.
нужно решить проблему останова в общем случае (а то как вы определите, вот эта вот конкретная машина, сделавшая уже дофигаллиард операций, остановится, или ушла в бесконечный цикл?)
если оно вычислимо - можно написать конечную программу, считающую BB(n), следовательно, она будет реализована на машине Тьюринга с X состояниями, следовательно, BB(n) в принципе не может расти быстрее, чем позволяет реализовать машина Тьюринга с X состояниями, то есть до BB(x) оно растёт с одной скоростью, а после BB(x) резко замедляется? Парадокс?
Эти большие числа - на самом деле последовательности, и сравнивается не фактическое значение какого-то конкретного элемента, а скорость роста последовательности. Добавление слагаемых, возведение в степень, и даже применение функции к самой себе не увеличивает скорость роста фундаментально, поэтому это всё избыточно.
К сожалению, в статье не объясняется ничего, и не даётся никаких ссылок для заинтересовавшихся. Те крохи пояснений по теме, которые всё же попали в статью, в лучшем случае заставят вспомнить эффект Манделы монады (как только вы начинаете понимать монады, вы теряете способность объяснить, что это такое), в худшем - RTFM.
Буквально по этой теме, т.е. про число Лоадера, есть пара видео от CodeParade:
сотни других простаивают, занимая дорогостоящие GPU
Так, падажжи. Обычная Ollama с настройками по умолчанию выгружает модель, если к ней не приходят запросы в течение 5(?) минут. А ещё она выгружает старые модели, если требуется загрузить новую, а ресурсов не хватает.
Ускорители переключаются между моделями в реальном времени, прямо в процессе генерации ответов.
Они догадались, что после завершения вычислений одного слоя / группы слоёв можно не брать следующий, а переключиться на другую задачу? То есть они изобрели планировщик задач для GPU?
Так я ж и не говорю про нейросети, да и (массово, как стадо помешанных баранов) работу на них мы перекладываем буквально года 2-3. SQL, например, не вернёт вам то, чего вы не запрашивали. Численные методы решения дифф. уравнений дадут ответ формально неточный, но с известным диапазоном погрешности. С другой стороны, методом Монте-Карло уже десятки лет быстро получают приблизительные ответы, но без гарантии.
Только вот при использовании Монте-Карловых симуляций мы знаем, что для повышения точности в Х раз надо увеличить количество симуляций в Y - а с нейросетями у нас даже этого нет. Вы же не будете 1000000 раз скармливать её один и тот же промпт, чтобы ну прям почти наверняка получить точный ответ (после некоего "усреднения")? Вот и получается, что для каких-то "обзорных" запросов нейросети, в общем-то, подходят, а для точных ответов - точно не подходят.
Про "галлюцинации" человека мы давно знаем, и именно поэтому перекладываем точную работу на точные алгоритмы точного компьютера. Если компьютер тоже галлюцинирует - зачем это всё?
Если вы говорите «монада», имея в виду Option, вы используете термин неправильно.
Если я говорю "рыба", имея в виду форель - я тоже использую термин неправильно? Я понимаю, что монады не ограничиваются одним Option, но ведь это же представитель монад, почему его вдруг нельзя называть общим термином?..
Судя по моим наблюдениям - их код не на 1% состоит из map, а процентов на 25.
Неужто и правда в каждой четвёртой строчке есть вызов map? Или там четверть кода - это тело функции, которая передаётся в map? Если второе - тогда подсчёт grep'ом тоже некорректен, потому что я более чем уверен, что тело функции зачастую длиннее однострочной лямбды.
монады используются в 14.4% строк
А переменные в том же JS - почти в 100% строк, а переменная в императивном языке - это ж, по сути, State-монада 🙃
Ну и в чём смысл делать яблофоны всё тоньше и тоньше? Чтобы блок камеры казался пропорционально толще? Чтобы аккумулятор держал меньше заряда, и была мотивация покупать ещё и внешнюю блямбу? Чтобы пальцы резало когда держишь? Давайте уж тогда весь смартфон будет в виде пластинки толщиной в экран + корпус (предположим, 2 мм), чтоб вообще тонююююсенький был. А вся начинка будет в "валике" 3х3х7 см, но это не в счёт, потому что это другое, у этого недоразумения тоже блок камер почему-то не входит в замер толщины, с ним было бы все 10(?) мм...
Потому что если Visa/Mastercard/PayPal скажут, что из-за одного конкретного примера они получают негативную огласку ("Ааа, они позволяют покупать это!") и в связи с этим вообще перестают обслуживать весь Steam или Itch - что тогда?
Потому что типы данных в программировании в принципе лучше рассматривать со стороны теории категорий. Например, есть категория/тип под названием "множество" / "set", есть пачка функций над объектами этой категории (всякие пересечения-объединения), а дальше-то что? Тот же размер множества сам не является множеством. Просто представьте, что
(unordered_set{1,2,3,2}).size()
возвращает не число 3, а unordered_set{3}. Да, можно идти аж из ZF и определить числа как очень специфические множества, только вот в программировании мы так не делаем (кроме ну совсем уж специфических случаев). Зато теория категорий такая "Дык это ж две разные категории" - и всё. У чисел одни гомоморфизмы, у множеств - другие, наслаждаемся. Зато теория категорий описывает и, самое главное, доказывает корректность многих "трюков". Например, что разные виды полиморфизма эквивалентны, то есть перегрузка функций, шаблонные классы и "any + пачка if для уточнения типа" - это одно и то же по фактическим возможностям, нет такого алгоритма, который бы принципиально мог использовать один вид полиморфизма, но не мог другой (разумеется, с поправкой на возможную слабую выразительность языка). У нашего любимого профессора по имени Bartosz Milewski есть прекрасные лекции "Category theory for programmers", они в своё время буквально перевернули моё видение махинаций с типами. Очень рекомендую.
Так ведь через USB-C Он и заряжается, и сигналы передаёт, так что всё +- сходится. И Nintendo нигде не заявляла, что Switch использует стандартный DisplayPort, например. С другой стороны, даже V-USB для микров AVR позволяет легко использовать кастомный USB-класс, с которым не сможет работать никто "посторонний" - это же нормальная ситуация?
Множество как тип данных - это не из теории множеств, это из теории категорий. Кстати, что такое "средний айтишник"? Вот мне периодически приходится работать с 3D-графикой с её матрицами - я ещё средний? А те, кто делает мат. пакеты типа BLAS - они тоже средние, ведь они тоже не используют дедукцию и бесконечные ординалы?
Во-первых, это транслирует позицию/мнение разных сторон в ваш пузырь "а на самом деле так"а. Полезно хотя бы для кругозора.
Во-вторых, у этого Иван Иваныча на самом деле может работать не так, как у вас. Например, через мой домашний Wi-Fi я спокойно могу играть в некоторые мобилки,, при этом на роутере у меня нет никаких особых средств, а вот через сотовую сеть - не могу, просто по таймауту отваливается. Теперь представьте, что Иван Иваныч играет в эти мобилки через эмулятор Android (которому всегда нормально, он же через роутер ходит), а у вас пароля от Wi-Fi нет, вы пытаетесь зайти через 4G И не можете. Кто прав в такой ситуации?
В-третьих, даже если Иван Иваныч вот прям совсем, объективно не прав, но он считает что его слова соответствуют истине (неважно, искренне он верит или актёрствует) - почему его мнение не должно быть транслировано дальше, особенно если это официальная позиция? Ну посмейтесь, ну покрутите пальцем у виска.
В-четвёртых, вы буквально предлагаете цензуру. Буквально "есть два мнения - моё, и запретить-непущщщать".
Кстати, есть и забавная обратная сторона: небольшому подмножеству живых цифровых художников не повезло писать в стиле, очень уж похожем на типичное нейротворчество. Вот так увидишь картинку - подумаешь что очередной промптхудожник накашлял в ЧатГПТ, а потом откроешь профиль - а там все работы такие, уже лет 10. А ведь 10 лет назад трава была зеленее, Open AI - ещё open, а из нейрогенерации была разве что DeepDream с её собаками из глаз.
Типографика - это хорошо. То, что вводить корректные символы намного сложнее "поддельных" - нехорошо. В дополнение к тире, надо не забывать, что правильные кавычки - это когда “так” или «эдак», но не "вот так". А многоточие - это один символ … вместо ... Кстати, во многих довольно авторитетных англоязычных источниках тире пишется без пробелов по бокам—вот так.
Отправлял в Discord (десктопный). Видимо, бекенд по расширеню понял, что это видео, и решил его отдавать с плеерной обвязкой, а там уже фронтендовая часть сумела раскодировать по внутренностям.
Разработчик open source проекта несёт ровно столько же ответственности за исправление уязвимостей, сколько и closed source - очень часто "no warranty".
Размер (конкретного) ПО и количество багов конечно только если проект больше не получает новых фич, лишь исправления багов. И даже в этом случае, количество багов может расти: обновились системные библиотеки, железо, настройки окружения - и ваш продукт начал вести себя не как положено.
"теперь с этим справляется 1 человек с помощью 10 сканеров уязвимостей" - и эти 10 сканеров найдут 10 000 уязвимостей, из которых не галлюцинациями будут, скажем, 3% - как один человек это всё проверит? Почитайте Death by a thousand slops, особенно 4 пример, Buffer overflow in strcpy
"Например, можно включить дополнительную стадию в свой CI\CD процесс" - см. п. 3 про кучу не-уязвимостей. А кто будет за эти прогоны платить, лично GitHub?
Да.
Не обязательно быть мейнтейнером, чтоб стать контрибутором. Раз уж говорим про open source, то вот как раз патч прислать может любой мимокрокодил. Да, не факт, что любой "мимокрокодильный" патч примут как есть, но он как минимум покажет один из возможных методов исправления.
С другой стороны как раз сидит ИИшенка, которая по своему шаблону завела баг. И даже если нет - в самом баге УЖЕ написано, какие сроки разглашения - почему сторона, создающая баг не могла первой связаться с представителями проекта?
Когда вам в проект накидывают кучу... просто кучу, вам нужно потратить время и силы чтобы это всё разобрать, категоризировать, приоритизировать. В какой-то момент, накидываемая куча становится настолько большой, что вы не можете с ней совладать, и она начинает бесконтрольно расти, а настоящие баги начинают теряться. Это натуральный DoS.
Тем более мерзко, что примерно в то же время, кто-то из Google дал интервью вида "наше DeepSleep такое крутое, нашло 20 багов в мультимедиа продуктах - только вот их не исправили ещё".Это подгонка фактов и вампирский пиар. Аж сейчас упоминать про это противно, тьфу.
У меня в MS VS прям графический прогресс-бар рисуется :)
Простой счётчик файлов в принципе не сильно поможет решить проблему "Вы никогда не можете сказать сколько еще осталось ждать до окончания процесса":
есть великое множество single-header библиотек, они просто не попадут в счётчик как он есть. Это легко исправить, но...
файл на 50 строк и файл на 1050 строк будут собираться за очень разное время. Очень может быть, что у вас не очень большая программа, которая по тем или иным причинам собирает SQLite из его амальгамации - там пара
.hи.cзанимают вместе под 10 мегабайта ещё после сборки чаще всего идёт линковка, и может быть не одна (если это какой-то массивный проект с пачкой промежуточных библиотек), и может быть ещё и с LTO, которое может линковку замедлить в десятки раз
В итоге, конечно, со счётчиком чуть нагляднее, чем совсем вслепую, но не сильно точнее, чем прогресс-бары / счётчики при копировании файлов: есть и число файлов, и суммарный объём, и подсчёт уже затраченного времени - но предсказание всё равно плавает как ветка в шторм
Как будто бы мессенджеры не очень поддерживают MKV как видеоконтейнер?.. WebM, MOV - да, видел работающими.
Ради интереса записал OBSкой 2 секунды видео в MKV, но с обычными MP4шными кодеками (AVC + AAC LC). Telegram и Discord предлагают его скачать как любой другой бинарный файл, не показывают как видео (хотя Discord показывает превьюшку при отправке, видимо Electron сумел декодировать - Firefox тоже успешно воспроизводит MKV, если в него кинуться). Вот если переименовать файл в
.mp4- тогда всё нормально, подставляют плеер как положено.В статье очень не хватает информации, что этот баг найден в кодеке для LucasArts SANM / Smush. Соответственно, "в дикой природе" используется он только для просмотра катсцен в некоторых играх LucasArts.
Какая разница, где он найден? А такая, что просто так, при стандартных сценариях работы с современным мультимедиа, наткнуться на использование этого кодека невозможно.
Busy Beaver, как раз, не вычислимо, потому что
нужно решить проблему останова в общем случае (а то как вы определите, вот эта вот конкретная машина, сделавшая уже дофигаллиард операций, остановится, или ушла в бесконечный цикл?)
если оно вычислимо - можно написать конечную программу, считающую BB(n), следовательно, она будет реализована на машине Тьюринга с X состояниями, следовательно, BB(n) в принципе не может расти быстрее, чем позволяет реализовать машина Тьюринга с X состояниями, то есть до BB(x) оно растёт с одной скоростью, а после BB(x) резко замедляется? Парадокс?
Эти большие числа - на самом деле последовательности, и сравнивается не фактическое значение какого-то конкретного элемента, а скорость роста последовательности. Добавление слагаемых, возведение в степень, и даже применение функции к самой себе не увеличивает скорость роста фундаментально, поэтому это всё избыточно.
К сожалению, в статье не объясняется ничего, и не даётся никаких ссылок для заинтересовавшихся. Те крохи пояснений по теме, которые всё же попали в статью, в лучшем случае заставят вспомнить эффект
Манделымонады (как только вы начинаете понимать монады, вы теряете способность объяснить, что это такое), в худшем - RTFM.Буквально по этой теме, т.е. про число Лоадера, есть пара видео от CodeParade:
https://www.youtube.com/watch?v=Mzgw6zMtipQ
https://www.youtube.com/watch?v=kQLcoSuMKHg
Да, там тоже мало что объясняется для непосвящённых, но там хотя бы есть намёк на связное повествование. А не просто
Самодиагонализация(кого, чего?)Так, падажжи.
Обычная Ollama с настройками по умолчанию выгружает модель, если к ней не приходят запросы в течение 5(?) минут. А ещё она выгружает старые модели, если требуется загрузить новую, а ресурсов не хватает.
Они догадались, что после завершения вычислений одного слоя / группы слоёв можно не брать следующий, а переключиться на другую задачу? То есть они изобрели планировщик задач для GPU?
Так я ж и не говорю про нейросети, да и (массово, как стадо помешанных баранов) работу на них мы перекладываем буквально года 2-3.
SQL, например, не вернёт вам то, чего вы не запрашивали. Численные методы решения дифф. уравнений дадут ответ формально неточный, но с известным диапазоном погрешности. С другой стороны, методом Монте-Карло уже десятки лет быстро получают приблизительные ответы, но без гарантии.
Только вот при использовании Монте-Карловых симуляций мы знаем, что для повышения точности в Х раз надо увеличить количество симуляций в Y - а с нейросетями у нас даже этого нет. Вы же не будете 1000000 раз скармливать её один и тот же промпт, чтобы ну прям почти наверняка получить точный ответ (после некоего "усреднения")? Вот и получается, что для каких-то "обзорных" запросов нейросети, в общем-то, подходят, а для точных ответов - точно не подходят.
Про "галлюцинации" человека мы давно знаем, и именно поэтому перекладываем точную работу на точные алгоритмы точного компьютера.
Если компьютер тоже галлюцинирует - зачем это всё?
Отчасти - нетривиальная система охлаждения
Если я говорю "рыба", имея в виду форель - я тоже использую термин неправильно? Я понимаю, что монады не ограничиваются одним Option, но ведь это же представитель монад, почему его вдруг нельзя называть общим термином?..
Неужто и правда в каждой четвёртой строчке есть вызов map? Или там четверть кода - это тело функции, которая передаётся в map? Если второе - тогда подсчёт grep'ом тоже некорректен, потому что я более чем уверен, что тело функции зачастую длиннее однострочной лямбды.
А переменные в том же JS - почти в 100% строк, а переменная в императивном языке - это ж, по сути, State-монада 🙃
Ну и в чём смысл делать яблофоны всё тоньше и тоньше? Чтобы блок камеры казался пропорционально толще? Чтобы аккумулятор держал меньше заряда, и была мотивация покупать ещё и внешнюю блямбу? Чтобы пальцы резало когда держишь?
Давайте уж тогда весь смартфон будет в виде пластинки толщиной в экран + корпус (предположим, 2 мм), чтоб вообще тонююююсенький был. А вся начинка будет в "валике" 3х3х7 см, но это не в счёт, потому что это другое, у этого недоразумения тоже блок камер почему-то не входит в замер толщины, с ним было бы все 10(?) мм...
Потому что если Visa/Mastercard/PayPal скажут, что из-за одного конкретного примера они получают негативную огласку ("Ааа, они позволяют покупать это!") и в связи с этим вообще перестают обслуживать весь Steam или Itch - что тогда?
Потому что типы данных в программировании в принципе лучше рассматривать со стороны теории категорий.
Например, есть категория/тип под названием "множество" / "set", есть пачка функций над объектами этой категории (всякие пересечения-объединения), а дальше-то что? Тот же размер множества сам не является множеством. Просто представьте, что
возвращает не число 3, а
unordered_set{3}. Да, можно идти аж из ZF и определить числа как очень специфические множества, только вот в программировании мы так не делаем (кроме ну совсем уж специфических случаев). Зато теория категорий такая "Дык это ж две разные категории" - и всё. У чисел одни гомоморфизмы, у множеств - другие, наслаждаемся.Зато теория категорий описывает и, самое главное, доказывает корректность многих "трюков". Например, что разные виды полиморфизма эквивалентны, то есть перегрузка функций, шаблонные классы и "any + пачка if для уточнения типа" - это одно и то же по фактическим возможностям, нет такого алгоритма, который бы принципиально мог использовать один вид полиморфизма, но не мог другой (разумеется, с поправкой на возможную слабую выразительность языка).
У нашего любимого профессора по имени Bartosz Milewski есть прекрасные лекции "Category theory for programmers", они в своё время буквально перевернули моё видение махинаций с типами. Очень рекомендую.
Так ведь через USB-C Он и заряжается, и сигналы передаёт, так что всё +- сходится. И Nintendo нигде не заявляла, что Switch использует стандартный DisplayPort, например.
С другой стороны, даже V-USB для микров AVR позволяет легко использовать кастомный USB-класс, с которым не сможет работать никто "посторонний" - это же нормальная ситуация?
Множество как тип данных - это не из теории множеств, это из теории категорий.
Кстати, что такое "средний айтишник"? Вот мне периодически приходится работать с 3D-графикой с её матрицами - я ещё средний? А те, кто делает мат. пакеты типа BLAS - они тоже средние, ведь они тоже не используют дедукцию и бесконечные ординалы?
Во-первых, это транслирует позицию/мнение разных сторон в ваш пузырь "а на самом деле так"а. Полезно хотя бы для кругозора.
Во-вторых, у этого Иван Иваныча на самом деле может работать не так, как у вас. Например, через мой домашний Wi-Fi я спокойно могу играть в некоторые мобилки,, при этом на роутере у меня нет никаких особых средств, а вот через сотовую сеть - не могу, просто по таймауту отваливается. Теперь представьте, что Иван Иваныч играет в эти мобилки через эмулятор Android (которому всегда нормально, он же через роутер ходит), а у вас пароля от Wi-Fi нет, вы пытаетесь зайти через 4G И не можете. Кто прав в такой ситуации?
В-третьих, даже если Иван Иваныч вот прям совсем, объективно не прав, но он считает что его слова соответствуют истине (неважно, искренне он верит или актёрствует) - почему его мнение не должно быть транслировано дальше, особенно если это официальная позиция? Ну посмейтесь, ну покрутите пальцем у виска.
В-четвёртых, вы буквально предлагаете цензуру. Буквально "есть два мнения - моё, и запретить-непущщщать".
Кстати, есть и забавная обратная сторона: небольшому подмножеству живых цифровых художников не повезло писать в стиле, очень уж похожем на типичное нейротворчество.
Вот так увидишь картинку - подумаешь что очередной промптхудожник накашлял в ЧатГПТ, а потом откроешь профиль - а там все работы такие, уже лет 10. А ведь 10 лет назад трава была зеленее, Open AI - ещё open, а из нейрогенерации была разве что DeepDream с её собаками из глаз.
Типографика - это хорошо. То, что вводить корректные символы намного сложнее "поддельных" - нехорошо.
В дополнение к тире, надо не забывать, что правильные кавычки - это когда “так” или «эдак», но не "вот так". А многоточие - это один символ … вместо ...
Кстати, во многих довольно авторитетных англоязычных источниках тире пишется без пробелов по бокам—вот так.