• Какой наиболее простой и надежный SMTP-сервер выбрать для рассылки оповещений с сайта?

    AlexanderMint
    @AlexanderMint
    Web Developer
    Работаю в крупной компании разработчиком, и так сложилось что за достаточно длительный период времени мы меняли сервисы для рассылок по различным причинам, остановились на sendgrid.com, и это самый оптимальный вариант. Работаем сейчас с ними уже год по API + все письма хранятся у них, но и SMTP они поддерживают. Можете у них хранить письма как для рассылок (от них пользователь может отписаться) так и для уведомлений. Так же могу посоветовать SparkPost, но с ним все сложнее и дороже
    Ответ написан
    Комментировать
  • GraphQL, стоит ли использовать для социальной сети?

    AlexanderMint
    @AlexanderMint
    Web Developer
    Напишу тебе пару своих мыслей, как человек который ежедневно использует GraphQL в связке с реактом. Технология классная, очень удобная и понятная (не зря же её Facebook использует). Но есть и свои минусы (https://www.howtographql.com/advanced/4-security/).

    Если у вас есть в запасе пару недель, что вы готовы потратить на изучение в целом технологии, на изучение схемы что строится на бэке, на то что бы понять как вы со всем этим будете работать на фронте, то используйте, все упирается во время.

    P.S. использовать REST после GraphQL желания нет...
    Ответ написан
    Комментировать
  • Может ли проект быть собран с низким качеством кода, и пользоваться большим спросом?

    AlexanderMint
    @AlexanderMint
    Web Developer
    Главное что задачу решает. Код постоянно будет улучшатся и дорабатываться...
    Ответ написан
    2 комментария
  • Как задать другой параметр в роутинге?

    AlexanderMint
    @AlexanderMint
    Web Developer
    Если по простому, то используйте гем friendly_id
    Ответ написан
    Комментировать
  • Как написать условие при котором 3 переменные не равны друг другу?

    AlexanderMint
    @AlexanderMint
    Web Developer
    a = 1
    b = 2
    c = 3
    
    if a != b && a != c && b != c
    // все данные разные
    end
    Ответ написан
    Комментировать
  • UPDATED: Балансировка запросов из разных стран (NGINX) и попытка войти в аккаунт из страны из которой не была произведена регистрация?

    AlexanderMint
    @AlexanderMint
    Web Developer
    Отвечу опираясь на тему и Ваш комментарий
    Пример приложения:
    Есть платформа на которой любой пользователь может зарегестрировать свой магазин и продавать на ней свои товары, так же есть некая страница где будут размещены все товары от всех магазинов. Покапатели зайдя на эту страницу видят все товары и могут совершать покупки.
    Но вот появилась необходимость разместить данную платформу для других стран, но не хочется смешивать товары из разных стран. Необходимо чтобы пользователь зайдя в систему видел только ту продукцию и только те магазины, которые находятся в его стране.
    Также пользователи не должны никак ничего не знать о том, что есть некие другие товары и другие магазины из других стран. Для них это будет просто локальная платформа для их страны.


    Вариантов реализации множество, я напишу как бы сделал я:

    1. Одна база данных и вот почему:
    - Легко поддерживать
    - Исключает ситуацию когда пользователь подключится не к той БД (если один домен)
    - Не будет проблем если вы решите разделить БД, так как id будут по прежнему уникальны. (ибо обьединить гораздо сложнее)
    - Сложная реализация вашей идеи в несколько БД
    P.S. Выводить определенный товар и не смешивать их, это столбец добавить и 2 слова к запросу дописать. Так же и с авторизацией + есть возможность писать что то в духе "Ваш аккаунт не поддерживается в этой стране"

    2. Для каждой страны свой домен (любого уровня, не важно) и вот почему:
    - Правильное индексирование поисковыми системами
    - Легко поддерживать
    - Проще мониторить и отслеживать статистику
    - Фильтровать пользователей
    P.S. Если хотите запретить доступ Х страны к магазинам Y страны, то лучше на домене Y страны запретить "диапозон IP" X страны

    3. Отказаться от распределения пользователей по IP, причины просты:
    - Нет 100% гарантии что человек попадет на нужный домен/язык и т.п.
    - Будут проблемы с поисковиками
    - Пользователи не смогут выбирать
    - Пользователь привязан к стране (что уже дикий бред)
    - Море звонков в ТП с вопросом "У меня ничего не работает!!!"

    0. к слову:
    - вы сами себя ограничиваете и это плохо
    - я уверен что есть аналоги по архитектуре вашей идеи, которые реализованы верно

    Я написал первые мысли что пришли в голову и могу в чем то "перегибать палку" или что то не учесть, так как не знаю все детали. И да, если вы сейчас гадаете как лучше и опираетесь на мнение людей с тостера, которые не знают вашей концепции, то у вас уже проблемы...
    Ответ написан
    Комментировать
  • На каком языке программирования написан сайт ukr.net?

    AlexanderMint
    @AlexanderMint
    Web Developer
    Advertising Network
    AdRiver
    DoubleClick for Publishers (DFP)

    Analytics
    Google Analytics

    Web Server
    Nginx

    Advertising Network
    Google AdSense

    Tag Manager
    Google Tag Manager

    JavaScript Framework
    jQuery

    А вообще советую поставить плагин Wappalyzer, что бы не задавать больше таких вопросов
    Ответ написан
    Комментировать
  • Система для мониторинга и оповещения об ошибках - free/opensource?

    AlexanderMint
    @AlexanderMint
    Web Developer
    Посмотрите в сторону Kibana, использовали в одно время, было крайне удобно. Даже какая то демка есть
    Ответ написан
    1 комментарий
  • Как правилньо подключить сторонние шрифты в Rails5?

    AlexanderMint
    @AlexanderMint
    Web Developer
    Вот тут отлично описано решение по шрифтам.

    Если коротко то создаем директорию assets/fonts
    И в css используем
    font-family: 'simple-line-icons';
    src: font-url("Simple-Line-Icons.eot");


    Почему у Вас не работает, нужно для начала понять "как именно не работает"? Что в выводе css? Или какая ошибка?
    Ответ написан
  • Как протестировать отправку почты на localhost?

    AlexanderMint
    @AlexanderMint
    Web Developer
    Для тестирования шаблонов есть встроеные инструменты Rails - Previewing Emails, после чего просмотр вьюх будет доступен по адресу localhost:3000/rails/mailers
    Для тестирования отправки писем используйте gem letter_opener
    Ответ написан
    Комментировать
  • Как лучше организовать структуру компонентов сайта React?

    AlexanderMint
    @AlexanderMint
    Web Developer
    Вот тут хорошо описаны различные варианты подходов
    Ответ написан
    Комментировать
  • Как спроектировать БД для сайта?

    AlexanderMint
    @AlexanderMint
    Web Developer
    Читать бестолку, нужен человек "на опыте".

    То что напишите Вы, все равно рано или поздно будет переписано, ведь вы можете и не догадываться о многих вещах... Другое дело если учитесь для себя, тогда можно читать все подряд по запросу "Как спроектировать БД" - пока не сформируется "каркас" мышления в этом направлении
    Ответ написан
    3 комментария
  • Как вы огранизовываете свои sass файлы?

    AlexanderMint
    @AlexanderMint
    Web Developer
    В своей компании мы используем следующую архитектуру:

    assets/
      stylesheets/
        shared/
        admin/
        application/
        vendors/
        admin.scss
        application.scss
        shared.scss


    shared.scss
    shared.scss - этот файл подгружается везде и содержит все общее, мы указываем что бы он грузил все файлы из shared/*

    @import 'shared/*';

    А в папке shared может лежать например colors_picker.scss, calendar.scss и т.п. то что используется прям везде
    application.scss
    application.scss - основной файл проекта, который грузится как дефолтный. Тут мы грузим общий shared + все файлы из папки application
    @import 'shared';
    @import 'application/*';


    В папке application лежат файлы основных страниц, например:
    welcome.scss
    user.scss
    page.scss

    Где стили данных страниц. Так же можно там создать папку components и вынести мелкие обьекты туда, например footer, header и т.п. далее подгружать их в основном файле или в файлах страниц
    admin.scss
    По аналогии c application делаем дальше:
    admin.scss - стили админки, тут она может быть просто на бутстрапе поэтому основной файл почти как всегда:
    @import 'shared';
    @import 'admin/*';
    @import 'vendors/bootstrap.scss'

    В папке admin/ лежит файл dashboard.scss который и будет рендерится + берем из папки venders bootstrap.
    Что касается media

    Если у вас они занимают значительное место, можете в папке application создать папку media, туда и класть, далее рендерить, например в application/page.scss.
    @import 'media/page_file1.scss';
    @import 'media/page_file2.scss';
    Ответ написан
    Комментировать
  • Как сделать работу нескольких уникальных sidekiq задач внутри одной очереди?

    AlexanderMint
    @AlexanderMint
    Web Developer
    Я думаю что Вы должны проверять параметры со своей стороны, прежде чем создавать воркер.
    P.S. Можно в redis-e брать/хранить временные данные для сравнения "запускался такой воркер или нет".
    Ответ написан
  • Возможно ли благодаря Github автоматически загружать файлы на сайт после изменения?

    AlexanderMint
    @AlexanderMint
    Web Developer
    Думаю это то что Вам нужно:
    https://circleci.com
    https://travis-ci.org

    Правда они задуманы больше как для тестирования, но и публиковать они тоже умеют
    Ответ написан
  • Где взять готовый сайт как toster.ru?

    AlexanderMint
    @AlexanderMint
    Web Developer
    Готовый open source проект www.discourse.org на Ruby
    Ответ написан
    Комментировать
  • Как задать имена дочерних таблиц при joins() в Rails?

    AlexanderMint
    @AlexanderMint
    Web Developer
    Судя по документации и личному опыту, нельзя. Хотя если столбец name уникален среди используемых таблиц, должно сработать
    .select(:name)
    Ответ написан
  • Как распределить хранение изображений и файлов на сервере?

    AlexanderMint
    @AlexanderMint
    Web Developer
    Я Вам советую реализовать следующую структуру:

    Файлы проекта, те что используются в дизайне, хранятся в директории images
    assets
    -- images/

    По мимо директории images, там могут находится папки со стилями, js кодом и т.п.

    Файлы загружаемые пользователями хранятся в
    public
    -- uploads

    Далее в uploads хранятся директории "сущностей" с объектами внутри
    Ответ написан
    Комментировать
  • Как корректно сделать связку в геме the_role?

    AlexanderMint
    @AlexanderMint
    Web Developer
    Сразу скажу что данный гем не использовал, но напишу как можно сделать иначе, вдруг пригодится...

    Пример что ниже описывает как можно реализовать простую роль или роль к "компании"

    Модель Role
    class Role < ApplicationRecord
      belongs_to :user
      belongs_to :company, optional: true
    
      validates :user, :name, presence: true
      enum name: %i[admin manager]
    end


    И например отрывок из модели User
    has_many :roles, dependent: :destroy
    
    def create_role(role_name, company = nil)
      roles.create(name: Role.names[role_name], company: company)
    end
    
    def role?(role_name, company = nil)
      if company.present?
        roles.where(name: Role.names[role_name], company: company).any?
      else
        roles.where(name: Role.names[role_name]).any?
      end
    end
    
    def admin?
      role? 'admin'
    end
    
    def manager?(company)
      role? 'manager'
    end


    Дальше все просто

    # Fake
    user = User.first
    company = Company.first


    Создать роль администратора:
    user.create_role :admin

    Создать роль владельца компании:
    user.create_role :manager, company

    Проверить роль администратора:
    user.admin?

    Проверить роль к компании:
    user.manager? company

    А ограничить доступ "по ролям" можно простым гемом pundit
    Возможно где то опечатался, писал от руки
    Ответ написан
    Комментировать
  • Как правильно разделить ассеты?

    AlexanderMint
    @AlexanderMint
    Web Developer
    Покажу на примере стилей
    assets/
      stylesheets/
        mobile/
        shared/
        application.scss
        mobile.scss
        shared.scss


    shared.scss - этот файл подгружается везде и содержит все общее, например
    @import 'bootstrap';
    @import 'jquery-ui';
    @import 'shared/*';


    application.scss - основной файл проекта, который грузится как дефолтный при просмотре через браузер например. Тут мы грузим общий shared + что то свое например
    @import 'shared';
    
    @import .......


    mobile.scss - мобильная версия, содержит стили которые грузим только для мобилок + конечно же shared
    @import 'shared';
    @import 'mobile/*';
    Ответ написан
    1 комментарий