• Как пробросить SSH на сервер без внешнего ip?

    martin74ua
    @martin74ua Куратор тега Linux
    Linux administrator
    поставьте эту задачу перед тем самым вашим админом
    Ответ написан
    Комментировать
  • Хорошая ли стратегия разбивать монолит джанго на микросервисы джанго?

    vabka
    @vabka
    Токсичный шарпист

    этот монолит очень тяжело поддерживать, обновлять код и дебажит.

    Распилив его на два микросервиса ты получишь два микросервиса, которые ещё тяжелее поддерживать, обновлять, и дебажить.

    В твоём случае будет лучше разобраться с первопричиной, тк монолитность сама по себе очень редко приводит к описанным проблемам.

    Дело пахнет скорее масштабным рефакторингом, чем разделением.
    Ответ написан
    1 комментарий
  • Хорошая ли стратегия разбивать монолит джанго на микросервисы джанго?

    @mayton2019
    Bigdata Engineer
    Смотри. Уже прошло время когда все пилили монолиты на микросервисы. Щас пошло переосмысление.
    Объективно есть 2 причины пилить. Первое - организационная. Команда по какой-то причине не хочет
    или не может поддерживать приложение. Или там что-то с бизнесом. Слияние. Поглощение. Передача
    проекта другой команде в поддержку. Тогда берут и ставят задачу раздела отвественностей.
    Конвей про это писал еще.

    И второе - это баланс нагрузки и децентрализация. Про failover тут еще даже речи нет. Это
    тяжелая тема и распилить монолит так чтобы его части были отказоустойчивы очень трудно. Более
    того в случае синхронных взаимодействий между частями микросервисов может быть даже падение
    перформанса
    . Да. Теоретики которые там пишут восторженные отзывы - совершенно игнорируют
    накладные на RPC. И не упоминают что в монолите цена RPC была равна нулю. Иногда RPC заменяют
    на MQ - но это новая архитектура и это надо полностью переделывать бизнес.

    И что делать с базой данных? Это тот еще вопрос. Я почти готов спорить что вы базу пилить не будете.
    И что в результате будет? Иммитация микро-сервисов? Где слабая связность?

    Тоесть если у вас нет таких кричащих ситуаций что оргазниация требует или нужно баланс
    нагрузки как-то разнести - то тебе вообще-вообще нет смысла ходить ни в какие микросервисы.

    Но имеет смысл сделать модуляризацию монолита. Например что там...
    application
    - sales
    - hiring
    - userprofiles

    Тоже очень полезно для управления сложностью. И пускай себе будет монолит зато будет сильный
    контроль за изменениями.
    Ответ написан
    6 комментариев
  • Как хранить характеристики товаров в БД и делать поиск по ним?

    @dimoff66
    Кратко о себе: Я есть
    Характеристики относятся к товарам? То есть у одного товара только один набор характеристик или один товар может приходить и продаваться с разными наборами характеристик, например кроссовки адидас, цвет: Белый, размер: 37 и кроссовки адидас, цвет: Синий, размер: 39. Если второй, более сложный случай, то делаем следующие таблицы

    1) Таблица Properties (id, name, valueType) - здесь просто храним список возможных свойств
    2) Таблица PropertyValues (id, propertyId, value) - здесь храним возможные варианты значений для свойств, у которых не простой тип, то есть не строка, не число, не булево, не дата
    3) CharacteristicsSet (id, productId, name) - здесь будет храниться набор свойств для конкретной позиции товара на складе, name будет составляться автоматически как строка из свойств и их значений, указанных для позиции товара
    4) CharacteristicsValues (chartacteristicSetId, propertyId, valueType, value) - здесь будут храниться значения свойств для конкретной характеристики.

    Например нам пришли партии кроссовок со свойствами цвет: белый, размер: 37й и цвет: синий, размер: 39й. (например 100 и 50 штук соответственно)

    Тогда наши таблицы будут выглядеть следующим образом:

    Properties:
    id: 1, property: 'Цвет', valueType: 'set'
    id: 2, property: 'Размер', valueType: 'number'

    PropertyValues:
    id: 1, propertyId: 1, value: 'Белый'
    id: 2, propertyId: 1, value: 'Красный'
    id: 3, propertyId: 1, value: 'Синий'

    CharacteristicsSet:
    id: 1, productId: 777, name: 'Цвет: белый, размер: 37'
    id: 2, productId: 777, name: 'Цвет: синий, размер: 39'

    CharacteristicsValues
    chartacteristicSetId: 1, propertyId: 1, valueType: set, value: 1(ссылка на белый цвет)
    chartacteristicSetId: 1, propertyId: 2, valueType: number, value: 37
    chartacteristicSetId: 2, propertyId: 1, valueType: set, value: 2(ссылка на синий цвет)
    chartacteristicSetId: 2, propertyId: 2, valueType: number, value: 39

    Ну и в таблице склада можно будет хранить записи в виде:
    productId: 777, characteristicsSetId: 1, quantity: 100
    productId: 777, characteristicsSetId: 2, quantity: 50

    Если же различный набор свойств для одного товара нам не нужен, то все то же самое, но обходимся без таблицы CharacteristicsSet: а в CharacteristicsValues ссылаемся на сам товар. Соответственно весь поиск будет проходить по одной таблице CharacteristicsValues с индексированными полями. Например чтобы найти любые товары с цветом Белый, мы делаем поиск

    select * from CharacteristicsValues where propertyId = 1 and value = 1


    ну и с соответствующим соединениям по таблицам характеристик и(или) товаров
    Ответ написан
    Комментировать
  • Зачем в примере нужны фигурные скобки и функция format?

    SoreMix
    @SoreMix Куратор тега Python
    yellow
    По сути, я так же могу поменять значение в переменной без всяких кавычек и функции format


    Имеется в виду зачем применили два способа форматирования? Скорее всего для демонстрации того, что строки можно объединить несколькими способами. Зачем конкретно это сделал автор - вопрос скорее к нему.

    А вообще, строки через + как правило не объединяют. Лучше это делать через format или f-строки. Но знать все способы всё равно полезно
    Ответ написан
    1 комментарий
  • Зачем в примере нужны фигурные скобки и функция format?

    Mi11er
    @Mi11er
    A human...
    Методы работы со строкой.

    name = "Tuti"
    # Форматная строка
    a = f"Hello {name}"
    print(a) # Hello Tuti
    
    # Метод формат
    a = "Hello {}".format(name) 
    print(a) # Hello Tuti
    
    #конкатенация строк
    a = "Hello " + name 
    print(a) # Hello Tuti


    Выбор способа, всегда за вами
    Ответ написан
    8 комментариев
  • Как при запуске сервера, запустить CRON с нужным окружением python?

    @ceytnot
    Ищу работу (:
    У меня в Кроне вот такая запись:
    */10 * * * * /var/py_proj/polikliniki_bot/bin/python3.9 /var/py_proj/polikliniki_bot/main_inform_user.py

    Первым идет путь к виртуальному окружению, потом уже путь к скрипту.
    У вас судя по всему наоборот. У меня Debian и у меня нет cd и &&, но возможно вам это необходимо т.к. является особенностью Убунты.
    Ответ написан
    Комментировать
  • Как происходит работа с api?

    @mayton2019
    Bigdata Engineer
    Не нужно тебе брать таких заказов. Просто если ты задаешь такой вопрос - то ты находишся где-то на самом старте Web API. И сколько у тебя вопросов еще будет если ты вдруг возьмешь аванс и приступишь к работе?

    Отвечая на вопрос - никто не знает. Надо читать информацию на самом сайте. Там обычно есть описание
    этого API и обычно его использование стоит денег.
    Ответ написан
    4 комментария
  • Как закрыть доступ к старым commit для разработчиков на ветке master?

    vabka
    @vabka
    Токсичный шарпист
    Как не удалив историю коммитов в master предоставлять доступ разработчикам к актуальной версии приложения без доступа к коммитам содержащим конф. данные в коде?

    Раз уже данные скомпрометированы, то их нужно изменить (старые отозвать, новые выпустить).

    А историю можно переписать, чтобы убрать ненужное.
    Ответ написан
    Комментировать
  • Как закрыть доступ к старым commit для разработчиков на ветке master?

    GavriKos
    @GavriKos
    Надо не просто перенести данные в переменные окружения, надо еще и сменить их. И тогда пофиг что они там получат
    Ответ написан
    1 комментарий
  • Как сделать длинный id для поста в Django?

    @maksam07
    Ответ написан
    Комментировать
  • Почему индекс нулей в списке равен нулю?

    Vindicar
    @Vindicar
    RTFM!
    У тебя в строках массива несколько нулей. Метод index() по умолчанию находит только первое искомое значение. Если бы ты почитал документацию, ты бы это понял, и увидел, как это обойти.

    list.index(x[, start[, end]])

    Return zero-based index in the list of the first item whose value is equal to x. Raises a ValueError if there is no such item.

    The optional arguments start and end are interpreted as in the slice notation and are used to limit the search to a particular subsequence of the list. The returned index is computed relative to the beginning of the full sequence rather than the start argument.


    Вообще, раз уж ты ручками перебираешь строки и ячейки матрицы, используй enumerate().
    for i_row, row in enumerate(grid):  # row == grid[i_row]
        for i_col, value in enumerate(row):  # value == row[i_col]
            # далее сам
    Ответ написан
    1 комментарий
  • Почему не работает запрос?

    ManticoreSearch
    @ManticoreSearch
    SELECT *, WEIGHT() AS weight FROM companyIndex WHERE MATCH (Компания | *Компания*) OPTION ranker=proximity_bm25, max_query_time=3, max_matches=300


    Не хватает одинарных кавычек вокруг Компания | *Компания*
    Ответ написан
    Комментировать
  • Как осуществить на python в телеграм боте?

    HemulGM
    @HemulGM Куратор тега Python
    Delphi Developer, сис. админ
    Изучать питон, изучать работу ботов, изучать Telegram Bot API для питона.

    После этого вопросов не будет
    Ответ написан
    Комментировать
  • Как прослушать событие изменение окна браузера?

    @Camaro67
    Помог? - "Отметить решением"
    window.onresize = function( event ) {};
    Ответ написан
    Комментировать
  • Как прослушать событие изменение окна браузера?

    evgeniy8705
    @evgeniy8705
    Повелитель вселенной
    window.addEventListener(`resize`, event => {
    	// some code
    }, false);
    
    // PS. Кажется вы делаете что то не то. Возможно стоило бы просто прослушивать изменение размера первого блока и изменять размер второго, а не слушать resize всего окна.
    // И вообще кажется все это можно сделать на css.
    // Объясните для чего вам изменять размер блока в зависимости от размера другого блока?
    Ответ написан
    3 комментария
  • Стоит ли использовать Django при разработке относительно небольшого сайта?

    @deliro
    Всегда удивляли и удивляют доводы против джанги на тему "ну это же комбайн". Да, комбайн, и чё? Что значит "не слишком ли массивен"? Не вместится на впску? Да вроде вместится, не переживай. По этой логике, массивен тут скорее питон, потому что интерпретатор с зависимостями весит 100+мб. Или логика "массивен = лагает"? А у твоего лендинга будет нагрузка в две тысячи запросов в секунду и больше, чтобы переживать?

    Функциональность фреймворка должна быть надмножеством требуемой тебе функциональности. И чем больше функциональности сверх твоих требований, тем больше места для манёвра ты себе оставляешь. Остальные доводы неуместны.
    Ответ написан
    Комментировать
  • Куда подключать путь стилей(link) во Vue CLI?

    @frankieksai
    Если создавали проект через VUE-CLI, то он делает папку PUBLIC в нем index.html
    Вот в этом index.html и можно подключить стили в headers.
    Ответ написан
    Комментировать
  • Что значат символы #! в URL некоторых сайтов?

    sajgak
    @sajgak
    простой пример hash навигации (динамическая часть страницы загружается по ajax, не перезагружая основной контейнер)! нужен для того, чтобы отличать обычный якорь от ссылки. Кстати, с выходом history.pushstate в подобного вида ссылках необходимости больше нет. Правда пока не поддерживается оперой и соотвественно ие.
    Ответ написан
    1 комментарий