• Как в Git в организовано хранение файлов?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    1. Гит в истории целые файлы, уже измененные, но сжатые (изменения хранит SVN, но у него другая модель работы)
    2. Сравнение файлов происходит через сравнение хэша файла. История изменений хранится в виде графа, поэтому переключение - это по сути: 1. Найти общего предка 2. Откатиться до этого предка 3. Применить изменения до новой ветки. Дополнительно, если у тебя есть незакоммиченные текущие изменения, то гит тебе об этом скажет
    3. Скачивается вся история изменений из удаленного репозитория и потом HEAD выставляется на ветку, которую клонировал (в основном это main/master)

    Почитай как работает git

    UPD: спасибо Saboteur за важное замечание
    Ответ написан
    1 комментарий
  • Как в Git в организовано хранение файлов?

    saboteur_kiev
    @saboteur_kiev Куратор тега Git
    software engineer
    Вообще-то как раз гит хранит целые копии файла.
    Для каждого файла создается его хеш, и файл-объект хранится под именем с этим кешом.

    If you again examine your objects directory, you can see that it now contains a file for that new content. This is how Git stores the content initially — as a single file per piece of content, named with the SHA-1 checksum of the content and its header. The subdirectory is named with the first 2 characters of the SHA-1, and the filename is the remaining 38 characters.


    То есть любое изменение файла - создает еще один файл-объект.
    Два одинаковых файла не будут занимать два места, даже если они хранятся под разными именами.

    Каждый коммит - содержит список файлов и хеш для содержимого.
    А ветка - это просто ссылка на конкретный коммит и немного метаданных.

    Также файлы-объекты хранятся упакованными, а периодически файлы-объекты могут быть объеденены в отдельный пакет.

    Чтобы посмотреть содержимое любого гит-объекта, юзай
    git cat-file -p ID_объекта (где айди объекта это как раз его хеш)

    И собственно именно эта фича - хранение каждого изменения файла отдельным объектом и позволило создать легковесные ветки, где переключение на любой коммит любой ветки - быстрая проверка и копирование файлов, в отличие от CVS и SVN, где любое переключение ветки - куча пересчетов диффов как назад так и вперед.

    Но, поскольку SVN - централизированная система, где все изменения хранятся только на сервере, можно менять формат хранения между версиями, так как это не нужно согласовывать со всеми пользователями репозитория.
    Например кроме диффов, в поздних SVN периодически сохраняются полные снепшоты, например каждые 1000 коммитов делается полный слепок, что ускоряет перерасчеты.
    Ответ написан
  • Как убрать мерцание консоли при использовании os.system('cls')?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    Curses? В ней можно использовать методы clear() и refresh() для обновления данные консоли без мерцания.
    Ответ написан
    1 комментарий
  • Как хранить информацию в БД о поставщиках когда они могут являться разынми сущностями?

    То, что Vindicar в общем-то правильно назвал "наследованием" в контексте моделирования РБД иногда называют subtype relationship или inheritance hierarchy, можете поискать примеры по этим терминам.
    Ответ написан
    Комментировать
  • Как хранить информацию в БД о поставщиках когда они могут являться разынми сущностями?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    Отнаследуйте любого продавана от базового класса, а дальше добавьте поле кто он такой
    Ответ написан
    4 комментария
  • Как хранить информацию в БД о поставщиках когда они могут являться разынми сущностями?

    Vindicar
    @Vindicar
    RTFM!
    Это, по сути, наследование. Абстрактный класс-предок (поставщик) и конкретные классы-потомки (физлицо, ИП, организация). Наследование обычно выражается в структуре БД так: создаётся таблица "Поставщик", содержащая общие для всех классов поля и имеющая свой ключ.
    Затем под каждый класс-потомок создаётся отдельная таблица, содержащая сведения, уникальные для этого класса. В этой таблице первичный ключ одновременно является внешним ключом, ссылающимся на таблицу "Поставщик". Иными словами, в таблице-потомке могут быть только записи с ключами, которые есть в таблице "Поставщик", а для каждой записи в "Поставщик" будет не более одной записи в таблице-потомке.

    В таблице "Поставщик" также может быть поле, указывающее на конкретный тип поставщика (физлицо, ИП, организация), т.е. в какой таблице искать остальные данные. Наличие или отсутствие этого поля - вопрос вкуса. В принципе, если нам нужны сведения о конкретном типе поставщика, мы можем попытаться сделать INNER JOIN с нужной конкретной таблицей. Это отсеет все записи других типов.
    Такой подход (без поля типа) позволяет избежать противоречий, когда запись находится в одной таблице-потомке, а поле указывает на другую. Но с другой стороны, если мы не знаем, какой конкретный тип у данного поставщика, нам придётся либо перебирать таблицы-потомки в рамках нескольких запросов к БД, либо делать LEFT JOIN со всеми таблицами-потомками, и смотреть, какие поля не будут NULL.

    Слабая сторона такой схемы в том, что связь по внешнему ключу не запрещает существование записей в нескольких таблицах-потомках, ссылающихся на одну и ту же запись в "Поставщике". Это придётся контролировать отдельно, триггерами или хранимыми процедурами.
    Ответ написан
    4 комментария
  • Правильно ли составлена схема для магазина?

    @full_stack_newbie
    Если это не курсовая, то сыро.
    Цены - в отдельную таблицу, добавлять период действия. Если цена меняется с завтрашнего дня, вы когда их менять будете?
    Закупочные цены - тоже имеют свойство меняться. Партии товаров на складе могут иметь разную цену поступления. Не увидел, что будет двигать остатки товара на складе (на вход).
    Оплаты фиксировать в отдельной таблице, там будут конкретные транзакции, типы оплаты, не стоит это все пихать в заказ.
    Скидки - так же в отдельную таблицу, период действия, типы скидок, etc
    Это очень кратко.
    Ответ написан
    5 комментариев
  • Правильно ли составлена схема для магазина?

    vabka
    @vabka
    Токсичный шарпист
    1. Хранение адреса в виде записей в базе.
    Думаю, вполне можно было бы обойтись текстовым полем и id по кладр/фиас/гар (если россия).
    Всё равно все возможные форматы адресов ты нормально не покроешь (а если покроешь - это будет свой фиас)
    2. Использование float для хранение цены товара
    3. Скидка чисто в виде числа в заказе - вполне возможно, что ты захочешь ввести какую-нибудь более гибкую систему скидок.
    В текущей ситуации такое невозможно.
    Например скидку в виде абсолютного количества денег, полностью бесплатный/подарочный товар.
    Скидку только на отдельную категорию товара, или систему баллов.
    Так что я бы сделал бы отдельную таблицу со скидкой на заказ, которую бы мог потом расширять.
    (в принципе, можно оставить пока так, а потом миграцией всё исправить)
    4. (комментарий про хранение цены убран, тк я изначально не заметил поле store_price)
    5. Хотелось бы, чтобы была функция оформления заказа без регистрации.
    6. А, ну и да. В заказе должен быть указан адрес. У пользователя их может быть несколько, и должен быть способ определить, на какой именно доставлять. (а с учётом п5 - адрес должен быть самостоятельной вещью)
    + Должна быть система как и с ценой - адрес у уже завершённого заказа не должен меняться.
    7. А где статусы заказа? Типа новый/оплачен/доставка/доставлен/завершён?

    PS: всё это из расчёта, что это магазин в россии, который продаёт физические товары за рубли.
    Думаю, если закапываться, можно ещё много чего найти не только в реализации, но и в требованиях

    PPS: Применять такую схему я бы осмелился только в рамках курсовой работы в колледже. Даже на диплом это врядли тянет, не говоря о реальном мире.
    Ответ написан
  • Правильно ли составлена схема для магазина?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    В целом правильно, но если уж затеваться с хранением адресов, то тогда в заказе должна быть ссылка на id адреса. иначе просто нет смысла. В целом для такой примитивной схемы отдельное хранение адресов выглядит неадекватным, я бы просто писал адрес в заказ.
    То же самое про телефоны. Просто писать в таблицу юзеров.
    Не хватает емейла. Смс на каждый чих рассылать дорого.

    В таблице заказов очень сильно не хватает поля status. Ну и связанной таблицы с историей статусов.
    Отдельно хранить дату и время - это глупость. Есть тип datetime
    discount - это ОЧЕНЬ отдельная тема. Но по крайней мере скидка должна размазываться по товарам. Если клиент при выкупе откажется от одного, то как пересчитывать цену?
    В целом стоит в заказе дублировать основную инфу по товарам. Потому что её надо показывать в истории заказов, а товара может уже не быть в базе. В том числе цену до скидки и со скидкой.

    Непонятно, что за таблица store.
    Ответ написан
  • Как в Python записать байты в файл?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Python
    Седой и строгий
    Просто берëшь и записываешь. В чëм проблема?
    Ответ написан
    7 комментариев
  • Как в Python записать байты в файл?

    @alex1478
    with open('test.hex', 'wb') as f:
        f.write(b'\x00\x01\x02')
    Ответ написан
    2 комментария
  • Почему не отображается миниатюра результата Inline-запроса?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Ссылка на файл на серверах Telegram - это плохо. Во-первых, она содержит токен бота (может утечь), во-вторых, она может меняться со временем. В большинстве ситуаций полагается передавать file_id, но для thumb_url надо передавать именно URL. Так что увы - придётся самому куда-то публиковать картинки.

    Скачивание файла вызывает заголовок Content-Disposition ответа.
    Ответ написан
    Комментировать
  • Как получить ссылку на фото профиля пользователя Telegram?

    @galoned
    @bot.message_handler(commands=["self_photo"])
    def user_photo(message):
        photo = bot.get_user_profile_photos(message.from_user.id)
        bot.send_photo(message.chat.id, photo.photos[0][2].file_id)

    Где 0 - первая или же основная фотография в профиле, 2 - размер аватарки (постоянная нумерация 0..2, от меньшего к большему). Код не оптимизирован к её отсутствию.
    Ответ написан
    4 комментария
  • Как запустить параллельный процесс в боте Telegram на Python?

    InternetMaster
    @InternetMaster
    Интернет
    Гораздо лучше запустить этот процесс вообще на отдельном сервере. Например, арендовать сервер на 1 час (с почасовой оплатой) и уже на нем пройтись по базе пользователей. При этом основный скрипт работать будет.
    Ну или на этом же сервере, но в отдельном скрипте, правда это будет занимать ресурс от используемого сервера.
    Ответ написан
    Комментировать
  • Как запустить параллельный процесс в боте Telegram на Python?

    @AlmazKayum
    я пользуюсь средствами Python модуль threading
    Ответ написан
    Комментировать
  • Как получить file_id без отправки сообщения пользователю?

    remberq
    @remberq
    Пытаюсь понять, что такое это ваше IT
    Я как раз сегодня сделал себе похожую вещь. Тоже благодаря помощи тут, так что я попробую и тебе помочь)
    Без отправки хотя бы себе в личку способа не знаю, да и его нет наверное, так что вариант через отправку себе файлов.
    Не знаю как тебе лучше будет хранить file_id, но я у себя сделал базу данных в sqlite(она встроена в питон).
    Суть такова, настрой бота, что бы он из твоей директории отправлял фото в личку тебе, а после отправки сохранял file_id в базу данных.

    from aiogram.types import InputFile
    ......
    photos = InputFile(f'D:\\Code\\english\\photo\\{eng}\\{eng}.jpg') # это пример моей директории
    id_photo = await bot.send_photo(chat_id=message.chat.id, photo=photos) # этот метод поможет получить file_id
    id = id_photo['photo'][0]['file_id'] # это сам file_id

    Я делал в aiogram у тебя должен быть похожий метод взять файл ботом из директории

    Как настроить сохранение зависит уже от тебя, будешь ли ты добавлять этот id в базу данных или в переменную, да хоть в текстовый файл. Я лично настроил добавление в базу, и за 10 минут залил 600 фоток в тг с пометками что к чему относится, потом же удобнее будет их доставать
    Ответ написан
    Комментировать
  • Как получить file_id без отправки сообщения пользователю?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Я решал эту задачу так: при первой отправке файла я его отправлял как файл, запоминая file_id в словаре и в таблице в базе, а при следующей уже имел готовый file_id. При этом я могу в любой момент добавлять файлы, не задумываясь о том, загружал ли я их уже в Telegram или нет.

    files = {}
    def load_files():
      global files
      res = db.execute("SELECT file_name,file_id FROM files")
      files = {}
      for row in res:
        file_name, file_id = row
        files[file_name] = file_id
    
    def save_file(file_name, file_id):
      global files
      db.execute("INSERT INTO files (file_name,file_id) VALUES (?,?) ON CONFLICT(file_name) DO UPDATE SET file_id=excluded.file_id", (file_name, file_id))
      files[file_name] = file_id
    
    load_files()
    
    ...
            if item["photo"] in files:
              file_id = files[item["photo"]]
              print (f" send photo file_name={item['photo']} file_id={file_id}")
              bot.send_photo(call.message.chat.id, file_id)
            else:
              with open(os.path.join("menu", item["photo"]), "rb") as f:
                bot.send_chat_action(call.message.chat.id, "upload_photo")
                r = bot.send_photo(call.message.chat.id, f)
                file_id = r.photo[0].file_id
                save_file(item["photo"], file_id)
                print (f" uploaded photo file_name={item['photo']} file_id={file_id}")
    Ответ написан
    Комментировать
  • Оплата товара в Telegram без регистрации юридического лица. Как подключить к боту Telegram?

    InternetMaster
    @InternetMaster
    Интернет
    Если речь об официальных Payments 2.0 то никак. Максимум - в качестве самозанятого.

    Если когда нибудь подключат Qiwi, такая возможность, думаю появится
    Ответ написан
    Комментировать