• В чём суть шутки про ноги в С/С++?

    zoonman
    @zoonman
    ⋆⋆⋆⋆⋆
    Это есть книга такая
    71AE90J735L._SX377_BO1,204,203,200_.gif

    В продолжение веселья https://www-users.cs.york.ac.uk/susan/joke/foot.htm
    Ответ написан
    Комментировать
  • Почему цапы в китайском исполнении не звучат?

    zoonman
    @zoonman
    ⋆⋆⋆⋆⋆
    Скачайте даташит на ES9038Q2M и почитайте.
    Там внутри гора программируемых опций, включая компенсацию нелинейных искажений, фильтров, нарастания громкости и т.д.
    По поводу питания - рекомендуется раздельная запитка аналоговой и цифровой частей. Ушами вы это не услышите, но в сигнале будет меньше искажений.
    Поскольку DAC требует нормированного импенданса, следует убедиться в том, что выход ЦАПа согласован со входом УНЧ. Возьмите sabre9602 и подкиньте на выход. Они вроде как вместе должны работать.
    Ну и последний момент - китайский ЦАП может сильно отличаться от оригинала. Купите оргинал у нормального поставщика (Digikey, Mouser). Если своп покажет разницу, то ответ очевиден.
    Ответ написан
  • Запрос в MongoDB используя Jongo?

    zoonman
    @zoonman
    ⋆⋆⋆⋆⋆
    У вас ошибки в синтаксисе. Исправьте и все будет работать.
    Ответ написан
  • Как учиться дизайну самостоятельно?

    zoonman
    @zoonman
    ⋆⋆⋆⋆⋆
    1. Делаешь, чтобы было удобно и красиво.
    2. Читаешь книги по искусству, архитектуре, цвету, композиции, стилистике и т.д.
    3. Изучаешь дизайн на курсах или находишь курс дизайна в каком-нибудь универе и учишься по вечерам. Тут главное работать по плану.

    Вникаешь в то, что содержание первично, а форма вторична. Как только прозреешь, учись отсекать все лишнее. Когда лишнего не останется, познай гармонию содержания и формы в движении.
    Ответ написан
    Комментировать
  • Стоит ли учить php в 2021 году для разработки web приложений и сайтов?

    zoonman
    @zoonman
    ⋆⋆⋆⋆⋆
    Для Web-приложений не очень. Для сайтов очень даже.

    Почему для Web-приложений не очень: чаще всего они требуют сложных пользовательских интерфейсов. А это JavaScript, скорее даже TypeScript. Если у вас в команде Fullstack разработчики, то добавление каждого нового языка программирования усложняет разработку. В целом Typescript ничем не уступает PHP. ООП и т.д., строгая типизация, это все имеется. Да, в некоторых случаях он медленнее и разработка на нем несколько сложнее. Но это уже зависит от кривизны ваших рук.

    В общем и целом зависит от того, чем вы хотите заниматься в дальнейшем. Хотите пилить Битрикс и клепать веб-магазинчики - тогда PHP.
    Хотите заниматься разрботкой веб-приложений, тогда Typescript/Javascript. Опять же React Native никто не отменял. В любом случае вам прийдется учить Javascript, т.к. фронт весь сделан на нем. Так почему бы не начать с него?

    Как начинающему, я бы советовал вам учить языки примерно в такой последовательности Javascript, Typescript, PHP, Python, Rust или Go.
    Ответ написан
  • Что энергоэффективней, соленоид или BLDC мотор при статическом удержании веса?

    zoonman
    @zoonman
    ⋆⋆⋆⋆⋆
    Эффективно будет использовать уравнивающий вес и редуктор. В данном случае можно удерживать малой мощностью мотора.
    Ответ написан
    Комментировать
  • Как рекламировать пиво на яндексе и гугле?

    zoonman
    @zoonman
    ⋆⋆⋆⋆⋆
    Попробуйте гуглить https://zhiza.evotor.ru/kak-zakonno-reklamirovat-a...
    А так и ежу понятно, прямую рекламу делать нельзя.

    Можно продакт плейсмент. Можно рецептуру. Можно рекламировать уроки пивоварения. Думаю реклама солода тоже возможна.
    Ну и через тематические блоги.
    Вообще вам надо пообщаться с людьми, у которых есть уже опыт в налаживании системы сбыта.
    Ответ написан
    Комментировать
  • Можно ли сделать данные внутри предметов списка PyMongo?

    zoonman
    @zoonman
    ⋆⋆⋆⋆⋆
    Можно.

    Чтобы понять как это сделать, вам следует вернуться к тому, как работают базы данных в целом. Ну и структуры данных подучить. Исходя из вашего вопроса вы понятия не имеете, о чем говорите.
    Ответ написан
    Комментировать
  • Как сгенерировать изображение 3D кубиков (игральных костей) на стороне сервера?

    zoonman
    @zoonman
    ⋆⋆⋆⋆⋆
    У вас есть 2 пути: сделать рендеринг в браузере, но генерировать данные на сервере, либо сделать рендеринг на сервере.
    При выбросе костей на самом деле имеет значение лишь то, что на верхних гранях, а остальное по большому счету не важно. Данных вам нужно немного, по сути массив с выпавшими костяшками.
    На мой взгляд, логичнее всего произвести рендеринг на клиенте с использованием Three.js. Благо нарисовать кубик с разными гранями задача элементарная. В threejs вы можете начать с простых кубиков, а потом нарисовать хорошую модель с материалами в Fusion 360, экспортировать в STL, загрузить модель в Three.js и анимированно разместить ее в пространстве.
    Так или иначе вы прийдете к тому, что вам захочется иметь красочный результат. Такой результат возможен лишь при наличии контроля освещения и материалов поверхностей. Т.е. нужна работа OpenGL или иного графического движка. Это можно делать на PHP https://github.com/Ponup/php-opengl Вопрос лишь в накладных ресурсах.
    Если вам не нужно делать статическую одинаковую картинку, которая будет потом отправляться по почте, то нет смысла делать рендеринг на сервере.
    Ответ написан
    1 комментарий
  • Что может а что не может содержать миграция?

    zoonman
    @zoonman
    ⋆⋆⋆⋆⋆
    Нормальная миграция подразумевает следующие характеристики:
    • идемпотентность - будучи запущена, серия миграций приводит к одинаковому результату
    • обратимость - любой шаг миграции можно откатить с откатом версии приложения
    • целостность - миграция переводит приложение из рабочего состояния в рабочее (баги не в счет)

    Естественное применение миграций - это CI/CD. Т.е. в большинстве случаев ожидается минимальный простой приложения во время деплоя, именно поэтому миграции в большинстве своем изменяют структуры данных.
    Но это совсем не означает того, что данные не могут быть изменены. Часто так бывает, что некоторые системные справочники требуют обновления или же данные пользователей требуют изменений. Например - для имени и фамилии использовалось одно поле, а теперь оно делится на два, как положено. Миграция данных в данном случае естественный и необходимый процесс, который может занять значительное время. Поэтому используется запланированный процесс выкатки приложения с его аннонсированием для пользователей. Запланированный даунтайм стандартная практика больших и сложных приложений, которые могут это себе позволить.
    Если ваше приложение не может себе позволить остановку обслуживания пользователей, то для таких случаев пишется вспомогательный код, который делает обработку случаев немигрированных данных и вообще всевозможные костыли, лишь бы оно работало (основной источник гемора).

    Является ли ресайз картинок частью миграции? И да и нет. Это зависит от ряда факторов - сломается ли приложение, если не будет картинки или будет старая картинка, это критичная функция или нет. Пример критичной функции - инстаграм.
    Если дизайн приложения сделан правильно и функция второстепенная, то миграция происходит лишь на уровне БД, а сам ресайз на уровне приложения (скрипта во время выкатки). Пример - новый размер юзерпика, никто не умрет, если он будет больше или меньше, может выглядеть не очень какое-то время, но в конце концов он станет нормальным. Если для нового размера добавляется новый столбец, то в него во время миграции копируются данные из другого столбца, чтобы не рушить функционал.

    Итак, мои ответы по вашим вопросам (как бы делал я):
    1. Добавил бы миграции с внесением/удалением 2 новых столбцов. Первый для email, второй email_verified. После развертывания запустил бы скрипт верификации почты (ох нескорый и ненадежный этот процесс). По-хорошему, по первому логину просил бы проверить и верифицировать email путем отправки кода на него. Думаю, вы уже поняли, что мы попадаем в серую область того, что машинная проверка здесь неуместна. Но допустим, мы использовали машинную верификацию, все проверили, все нужно сделали. В следующей версии мы удаляем столбец email_verified.
    2. Как правило, такие вещи данные в БД не изменяют, а значит нет необходимости в миграциях, достаточно скрипта. Но, если вы ок с простоем приложения, то можно вполне внести данный скрипт в миграцию, а также не забыть об откате этой миграции (удалять новые размеры, к примеру).

    Как мы все видим, миграцию можно рассматривать, как в контексте СУБД, так и в контексте приложения в целом.
    Общепринятая практика - рассматривать миграцию в контексте баз данных. Все остальное - скрипты и костыли в самом приложении.

    Универсального рецепта нет. Все завязано на бизнес-логику и реализацию кода приложения. Если нельзя отделить сложную обработку данных от процесса деплоя, то эту логику следует встраивать в код миграций. Пример такой обработки - получение какого-нибудь системного идентификатора, который используется при работе приложения, например ротация API ключей при смене системы аутентификации.
    Ответ написан
    2 комментария
  • Как раскрутить мобильное приложение?

    zoonman
    @zoonman
    ⋆⋆⋆⋆⋆
    Этих фоторедакторов как грязи, 99% - полное говно. Более-менее нормальный фоторедактор это 5-6 лет интенсивной работы небольшой команды.
    Если ваш редактор ничем не отличается от конкурентов, то можете не тратить время.
    Ответ написан
    Комментировать
  • Почему нельзя хранить важные данные в localStorage и вообще, JWT чем-то опаснее cookie?

    zoonman
    @zoonman
    ⋆⋆⋆⋆⋆
    Важные данные обычно никогда не хранятся на клиенте, они передаются, используются и удаляются.

    Есть ли какие-то ситуации, когда использование httpOnly сессионной куки нас защищает, а вот использование localStorage и sessionStorage уязвимо?

    Если есть компроментация клиента, то никак не защищает. Единственное место, это где JS вообще в принципе не используется, т.е. клиенты с отключенным JS. Ну это как в рыцарских доспехах ходить по улице. Неудобно, но вроде как защищает от меча. Только с мечом уже давно не ходят, все больше с автоматами.

    Теперь про токены. Токены в теории лучше всего держать не в localStorage, а в sessionStorage. Это хранилище переживает перезагрузки страниц и не расшарено между табами. Т.е. при открытии того же самого адреса в новом табе будет созданая новая сессия. Хранилище очищается при закрытии браузера и таба. Но это жутко неудобно, каждый раз логиниться. Поэтому здравая логика говорит об использовании localStorage, хотя если вы совсем отбитый, то можете хранить токен в сессионой куке.

    Если вы прочли те статьи внимательно, то можно понять, что преимущества сессионных кук нивелируются неудобством их использования.
    JWT Токены предназначены для микросервисной архитектуры. Т.е. у вас есть некоторый центр аутентификации, который выдает вам токен. Токен этот подписан относительно стойкой криптографией и постоянно ротируется.
    Этот токен передается другим микросервисам, которые могут его верифицировать через публичные ключи (JWKS).
    Т.е. если вы хотите, вы можете строить свои сервисы так, что они доверяют не только вашему центру аутентификации, но и гуглу с амазоном через OpenID. Есть ситуации, например когда вы хотите разрешить доступ к сервису сотрудникам другой компании. Например, когда такая компания огромна (десятки тысяч сотрудников). Они аутенфицируются у себя, а вы проверяете, что токен выпущен сервисом данной компании. Это не так сложно реализовать.
    Реализация авторизации лежит на плечах каждого микросервиса и напрямую завязана на бизнес-логику. Как правило это некий внутренний микросервис, который интегрирован c middleware микросервиса.
    Ответ написан
    5 комментариев
  • Как "это" чудо укоротить, или сделать проще?

    zoonman
    @zoonman
    ⋆⋆⋆⋆⋆
    Создавать массив состояний и обнулять состояние для невыбранных элементов (это если что-то вроде списка чекбоксов). Иначе просто держать массив и индекс выбранного элемента.
    Ответ написан
    Комментировать
  • Трюк с тернарным оператором PHP?

    zoonman
    @zoonman
    ⋆⋆⋆⋆⋆
    Просто выбрасывать исключение нужно внутри метода check() и переименовать его в assert(). Тогда все станет на свои места.
    Ответ написан
  • Three js модели?

    zoonman
    @zoonman
    ⋆⋆⋆⋆⋆
    Никак. Просто элегантно внедряйте в них свой копирайт, логотип и т.д. Удовольствия выковыривать его из моделей то еще занятие.
    Ответ написан
    Комментировать
  • Как включить музыку при загрузке страницы?

    zoonman
    @zoonman
    ⋆⋆⋆⋆⋆
    Пожалуйста, не делайте так.
    Во-первых, это очень раздражает, т.к. на ваш сайт могут заходить люди в разное время суток и при разных обстоятельствах.
    Во-вторых, это мгновенно делает ваш сайт куском говна. Нет ничего дерьмовее непредсказуемого поведения сайта. Сайт, на котором играется музыка/видео, вылезают какие-то всплывашки, чатики, счетчики и прочее мигающее, ездящее, прыгающее, вращающееся и новящевое - это говно. Такие сайты делаются лохами для лохов.
    Ни один нормальный человек не будет оставаться на таком сайте дольше 10 секунд. Конкурентов много, не думайте, что ваш сайт такой уникальный.
    Ответ написан
    2 комментария
  • Как организовать сбор отпечатков пальцев?

    zoonman
    @zoonman
    ⋆⋆⋆⋆⋆
    Ну вот смотрите, у вас есть сенсор, например "фотография" отпечатка. Далее эта фотография обрабатывается системой машинного зрения, которая извлекает особенности строения вашего отпечатка. Читайте про то, как работает дактилоскопия в криминалистике. Назовем этот набор особенностей "узор". Вобщем, доводите железяку до состояния, когда она вам будет возвращать "узор". Собираете базу узоров, ранжируете наборы особенностей по максимуму специфичности. Получаете реверсивное дерево поиска. Отсекаете все ненужное. Строите по нему индекс.
    На телефонах тот же принцип, только узор хранится в железяке непосредственно и аппарат взаимодействует по принципу - какой идентификатор узора и событие распознавания. Ну и добавление со стиранием. Принцип тот же самый, только реализован полностью в железе с публичным интерфейсом по SPI/I²C.
    Ответ написан
    2 комментария
  • Зачем вообще использовать брокеры очередей?

    zoonman
    @zoonman
    ⋆⋆⋆⋆⋆
    В первую очередь брокеры нужны для балансировки нагрузки и увеличения надежности и скорости работы системы в целом.

    В вашем приведенном примере приведен способ уведомления клиента о каком-то событии. Например о том, что его заказ обработан, отправлен, доставлен и т.д. Событий может быть много и их источники могут быть различными.
    Например у вас может быть интеграция со сторонней системой логистики. А еще с 10 разными системами оплаты.
    Еще есть маркетинг, который тоже хочет отправлять массовые рассылки.
    Получается, что под каждый случай вам прийдется хранить информацию о письмах и статусах. Но даже проблема не в этом, проблема в том, что каждое событие имеет разный приоритет и разную ценность.

    В случае работы с сайтом у вас будет 1 воркер, который будет просто сканировать таблицы на поиск неуведомленных пользователей. Если у вас будет 2 воркера, надо делать систему блокировок и т.д. Т.е. мы упираемся в проблему масштабирования. Для решения задачи разной скорости уведомлений, вы построите систему приоритетов или будете делать разные таблицы с разными воркерами. Это все будет работать, но нагрузка на базу будет серьезной и она будет увеличиваться с ростом пользовательской базы. Опять вы упретесь в тормоза.
    Опять же есть письма, которые должны быть доставлены немедленно, вроде подтверждений аккаунта, смены пароля и т.д. Еще одна таблица? Дополнительный приоритет? Может так произойти, что вы некоторые пользователи вообще никогда не получат писем и уведомлений. Прийдется придумывать способ контроля.
    Я уж не говорю о куче кастомных воркеров под каждую ситуацию. И их будет с десяток, не меньше.

    Очереди решают, т.к. можно сделать их несколько и на для каждой настроить определенное количество абсолютно одинаковых воркеров. Пример с поллингом отвратителен и сейчас никто так не делает, а с очередями делают так.
    У вас может быть цепочка из нескольких воркеров, когда результат работы одного помещается в очередь.
    Например, когда надо сначала достать данные из нескольких разных медленных систем, отрендерить в шаблон, а потом отправить письмо. Сборка, рендеринг и отправка - три разные компонента, последние два из которых, можно активно переиспользовать для других целей изменяя лишь конфигурацию времени исполнения.
    При таком подходе проще развивать кодовую базу, исправлять ошибки, т.к. они изолированы в одном месте, а не разбросаны по всей системе. И да, косяк в "горячем" модуле вы заметите немедленно. А самое прикольное то, что ваш косяк, пользователи и не заметят, для них это будет выглядеть как простая задержка, а у вас будет время на то, чтобы исправить ошибку. Сообщения посидят в очереди и все.
    Но это еще не все, ваши воркеры могут быть написаны на разных языках программирования. Например пользователь может загружать фото на сайт на PHP, объекты распознаваться на Python, видео рендериться на Rust, а отправка писем может быть на Go. И такой подход может подойти для сложных систем с распределенными командами и различным уровнем компетенция в применяемых технологиях. Специалистов превосходно владеющих всеми приведенными технологиями просто единицы, и поверьте, они решают задачи совершенно другого уровня.
    Ответ написан
    Комментировать