Задать вопрос
  • Синхронизируется ли история операций POS терминала с банком?

    1. Попробуйте ещё подолбить свой банк и банк-эквайер.
    2. На вашей стороне закон о защите прав потребителей, всегда можно опереться на него.
    Ответ написан
    Комментировать
  • Что такое конечная точка в ASP.NET Core?

    метод, путь и твой код, который с ними ассоциирован.
    GET /something и POST /something - это две разные конечные точки.
    Ну и как источник истины следует использовать докуменацию, а не chatgpt.
    https://learn.microsoft.com/en-us/aspnet/core/fund...


    An endpoint is something that can be:
    • Selected, by matching the URL and HTTP method.
    • Executed, by running the delegate.

    Ответ написан
    Комментировать
  • В чем смысл public _ {get;set} в c#?

    Потому что так исторически сложилось.
    1. Очень многие механизмы раньше (а какие-то и сейчас) работают только со свойствами, но не с полями.
    А если они и умеют работать с полями - часто по-умолчанию они с полями не работают.
    (Это относится ко всяким сериализаторам, ORM, и другим штукам, которые работают с объектами через рефлексию, создают прокси)

    2. Даже если ты делаешь автосвойство - ты всё равно можешь делать с ним всё то же самое, что и с обычным свойством: вынести его в интерфейс, сделать виртуальным и переопределить в наследниках, а потом обратиться к нему не на конкретном типе, а на интерфейсе. Это может быть очень полезно, а иногда и необходимо в некоторых случаях

    3. Если ты разрабатываешь какую-то библиотеку, которую будет использовать кто-то ещё, то ты скорее всего хочешь как можно меньше ломающих изменений в новых версиях - тогда имеет смысл превентивно сделать свойство, чтобы потом не переделывать.

    По сути всё.
    Сказки про инкапсуляцию оставим для учебников, так как если мы делаем какую-то тупую DTO-шку, то никакой пользы от обращения через свойства мы не получим.

    Накладных расходов у свойств по сути нет, так как JIT их заинлайнит.
    А раз никаких минусов нет - зачем включать мозг и думать "а понадобится ли мне по какой-то причине тут свойство или можно обойтись полем"? А потом ещё огребать, если ошибся (даже если это редкий случай)
    Единообразие тут скорее благо.

    Те же рекорды (record, record struct) вообще не позволяют тебе объявить поля и при этом скрывают многословность свойств.

    к примеру, не сделать этот int отрицательным

    На самом деле это очень редкий кейс.
    Зачем делать какую-то валидацию, если можно изначально использовать тип, который не допускает отрицательных значений?

    но вот смысл автоматических свойств я так и не могу осознать, хоть убейте

    Смысл автосвойств - чтобы не писать руками { get {return x;} set {x = value;}}.
    А смысл свойств вообще - чтобы можно было вынести в интерфейс, переопределить, итд.

    А ещё у свойства я могу не писать set или вместо set написать init и required, чего я не смогу сделать в классе с полями.
    Да, у поля можно написать readonly и получить по сути то же самое, но тогда его надо будет обязательно через конструктор инициализировать.
    Ответ написан
    3 комментария
  • Какую базу данных нужно использовать для телеграмм бота?

    Видимо вы при выборке товаров в корзине не проверяете, к какому пользователю оно относится, либо вы вообще не предусмотрели колонку для этого.

    Это проблема при проектировании модели данных и заменой sqlite на что-то другое это не исправить.
    Ответ написан
    Комментировать
  • Нужно ли сохранять таймзону в БД при создании колонки в таблице с помощью @CreateDateColumn()?


    что можно явно указать тип timestamptz, чтобы сохранять дату с учётом таймзоны.

    timestamptz не сохраняет таймзону. Он только требует при сохранении явно её указать, чтобы потом внутри привести её к utc. При чтении потом у времени будет стоять таймзона, которая настроена в клиенте.
    (Выставляется через SET TIMEZONE)
    https://www.postgresql.org/docs/current/sql-set.html
    https://www.postgresql.org/docs/current/datatype-d...

    Если твоему приложению нужно явно хранить таймзону (например ты делаешь какой-то календарь с событиями, которые привязаны к местному времени), то тебе нужно завести две колонки: одну со временем (timestamp without tz) и ещё одну колонку для таймзоны.

    Если тебе нужно хранить просто конкретный момент времени, то тогда лучше использовать timestamptz.
    На счёт того что при записи будет указываться разный часовой пояс - не бойся, оно всё равно автоматически будет приведено к utc
    Ответ написан
    Комментировать
  • Как улучшить OCR-парсер билетов на основе Tesseract.js?

    Зачем использовать OCR, если сейчас на практически всех посадочных талонах есть двумерный код, который можно прочитать и распарсить?
    https://www.iata.org/contentassets/1dccc9ed041b4f3...
    Получается нужно просто задетектить один из трёх видов кодов, выровнять его, распознать, а потом разобрать закодированную строку (по идее может различаться у разных авиакомпаний)
    Ответ написан
    3 комментария
  • В чём под Windows писать на Rust'е десктопные приложения?

    vabka
    @vabka Куратор тега Rust
    RustRover или vscode. (Лично я первым пользуюсь из-за того что к intellij привык)
    Про полноценную студию не скажу, тк ни разу не видел, чтобы кто-то в ней работал.

    Все три расширения - это биндинги к rust analyzer, так что концептуально оно не будет сильно лучше vscode.
    Остаётся вопрос только к дебаггеру в студии, но по идее в vscode точно такой же.
    Ответ написан
    Комментировать
  • Насколько часто по вебсокет могут не доходить меседжи до цели?

    Вебсокеты сделаны поверх TCP, так что пока соединение работает - сообщения все должны доходить.
    Но соединение может какое-то время оставаться номинально живым после фактического разрыва, так что для контроля живости стоит через одинаковые промежутки отправлять какие-нибудь пинги / keep alive сообщения.
    Тогда как только они прекратятся - можно будет сразу понять, что кто-то отвалился.

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

    Вот эти #if WINDOWS работают только во время компиляции + как вы сами убедились, дебажить их не очень удобно.
    Лучше вместо них использовать
    using System.Runtime.InteropServices;
    // ...
    if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) {
      // ...
    }


    PS: вот эту галку с Windows ставить не обязательно. По идее оно автоматически должно выставиться, если ты компилируешь под windows.
    А серым может подсвечивать из-за того что VS использует какой-то другой таргет / другие флаги для анализа.
    Ответ написан
  • Этично ли ориентироваться на цену клиента помимо объективного объема работ?

    Вопрос этики оставим философам.
    Некоторые считают, что работать за деньги в принципе не этично.

    Клиент не обязан же соглашаться на твои условия, если он считает их невыгодными?

    Так что вполне можно называть абсолютно любую цену за свою работу, пока это находится в рамках закона (пример незаконный - если ты заранее назвал одну цену, клиент согласился, а после работ ты начинаешь требовать уже больше).

    Но вообще недовольство клиента понять можно - раз его первое слово о бюджете влияет на стоимость услуг (при условии что качество остаётся не изменным), то обидно, что изначально слишком много назвал, ну а раз свою ошибку открыто признавать не хочется - можно переложить вину на исполнителя, который такое практикует.
    Если бы я был на месте клиента, то мне бы хотелось видеть честное объяснение, откуда цена взялась (условно декомпоизцию проекта на этапы/задачи / роадмап. Даже если за это нужно доплатить как за консультацию)
    Ответ написан
    Комментировать
  • F# передача параметров массивом?

    F# у нас язык со статической типизацией.
    Как ты гарантируешь, что массив содержит ровно два элемента?
    Собственно из-за этого нет встроенного оператора.
    Попробуй вот такую функцию и скомбинируй её с уже имеющейся, которая принимает кортеж.
    /// Преобразует массив из двух элементов в кортеж.
    /// Для любых других входных массивов бросает ArgumentException.
    let toPair (arr: 'T[]) : 'T * 'T =
        match arr with
        | [| x; y |] -> x, y
        | _ -> invalidArg "arr" "Array must contain exactly two elements"


    Потом вот так можно будет использовать:
    // parameters
    let args: System.String[] = [|"12:50"; "rica"|]
    
    // function
    let some (time: string, costa: string)=
        "..."
    // вариант раз
    let res = args |> toPair |> some
    // вариант два
    let res = args |> (toPair >> some)
    // вариант три
    let res = some (toPair args)

    Глянь ещё FSharpPlus - возможно там уже есть подходящая стрелочка.
    Ответ написан
    Комментировать
  • Почему SOP не блокирует запросы с разных источников, позволяя воспроизвести CSRF?

    vabka
    @vabka Куратор тега Веб-разработка
    CORS умеет блокировать не только ответы, но и запросы, но только в случае "сложных" запросов.
    (Например POST с Content-Type: application/json будет сложным)
    А банк от csrf-уязвимостей должен защититься при помощи csrf-токенов.

    https://habr.com/ru/companies/macloud/articles/553826/
    Ответ написан
    2 комментария
  • Есть ли gps трекер для человека как Яндекс Такси?

    В телеграме можно поделиться своим местоположением
    Ответ написан
    9 комментариев
  • Безопасно ли запускать Telegram Бота на компьютере?

    Если ты где-то что-то не экранировал, что-то не досмотрел, то да, может быть какая-то уязвимость.
    Ответ написан
    Комментировать
  • Как от бота в тг отправить звёзды/подарки юзеру?

    Удивительно, но для этого существует метод sendGift (но такой подарок нельзя будет в звёзды превратить).
    Почему-то в доке поехала вёрстка и этот метод находится в разделе "updating messages", вместе с остальными новыми методами.

    Звёзды обычный бот отправлять не может, но такое может делать юзер-бот, что будет против ToS и такого "бота" могут заблокировать вместе со всеми звёздами без права на возврат денег.
    Ответ написан
    Комментировать
  • Есть ли возможность скачать браузерные игры?

    vabka
    @vabka Куратор тега Веб-разработка
    В общем случа - нет.
    swf-объекта и не будет.
    Ответ написан
    Комментировать
  • Есть ли рабочий клиент для Exchange?

    Вроде как все кто пытаются как-то с ексченджем работать, используют EWS - это и Р7, и тандербёрд и Evolution.
    Раньше с ексченджем умело работать приложение "Почта" на Windows 10, но его сейчас убили в пользу "Outlook new", который работает теперь только с outlook 365
    Ответ написан
  • Есть ли нейросеть, с функционалом аналогичным программному комплексу Revit?

    Нет и не будет.
    Ответ написан
    Комментировать
  • Какое ПО может посчитать количество страниц PDF документов в папке?

    Ужасно глупо звучит, но такое "решение для организации учёта PDF-документов" умещается в 100 строк на питоне и его даже нейросеть может реализовать:

    #!/usr/bin/env python3
    """
    pdf_report.py
    
    This script recursively scans a given directory for PDF files and generates a report
    listing each PDF's file path, size (in bytes), and page count. The report is printed
    as a table to stdout, and can optionally be saved as an XLSX file.
    
    Usage:
        python pdf_report.py /path/to/folder [--xlsx output.xlsx]
    
    Dependencies:
        - PyPDF2
        - tabulate
        - openpyxl
    
    Install dependencies:
        pip install PyPDF2 tabulate openpyxl
    """
    import os
    import argparse
    from PyPDF2 import PdfReader
    from tabulate import tabulate
    from openpyxl import Workbook
    
    def get_pdf_info(path):
        """
        Given a PDF file path, returns a tuple (size_in_bytes, page_count).
        """
        try:
            size = os.path.getsize(path)
            reader = PdfReader(path)
            pages = len(reader.pages)
            return size, pages
        except Exception:
            # If unreadable or corrupted, return None values
            return None, None
    
    def scan_directory(root_dir):
        """
        Walks through root_dir recursively, finds all .pdf files,
        and collects their path, size, and page count.
        Returns a list of dicts.
        """
        report = []
        for dirpath, _, filenames in os.walk(root_dir):
            for filename in filenames:
                if filename.lower().endswith('.pdf'):
                    full_path = os.path.join(dirpath, filename)
                    size, pages = get_pdf_info(full_path)
                    report.append({
                        'path': full_path,
                        'size_bytes': size,
                        'page_count': pages
                    })
        return report
    
    def print_report(report):
        """
        Prints the report as a formatted table to stdout.
        """
        headers = ['File Path', 'Size (bytes)', 'Pages']
        rows = [(item['path'], item['size_bytes'], item['page_count']) for item in report]
        print(tabulate(rows, headers=headers, tablefmt='github'))
    
    def save_xlsx(report, xlsx_path):
        """
        Saves the report to an XLSX file at xlsx_path.
        """
        wb = Workbook()
        ws = wb.active
        ws.title = "PDF Report"
    
        # Write header
        ws.append(['File Path', 'Size (bytes)', 'Pages'])
    
        # Write data rows
        for item in report:
            ws.append([item['path'], item['size_bytes'], item['page_count']])
    
        wb.save(xlsx_path)
    
    def main():
        parser = argparse.ArgumentParser(description='Generate a PDF report for a directory.')
        parser.add_argument('directory', help='Path to the directory to scan')
        parser.add_argument('--xlsx', dest='xlsx_output', help='Optional XLSX output path')
        args = parser.parse_args()
    
        report = scan_directory(args.directory)
    
        if args.xlsx_output:
            save_xlsx(report, args.xlsx_output)
            print(f"Report saved to XLSX: {args.xlsx_output}")
        else:
            print_report(report)
    
    if __name__ == '__main__':
        main()

    А если нужен гайд, то берите любую книжку по программированию на Python и учитесь)
    Ответ написан
    Комментировать