Задать вопрос
  • Какой стек использовать для десктоп приложений в гос.предприятиях в 2023 году?

    Мне удобнее сделать всё на C#, .Net, WPF и в случае появления linux запускать всё под Mono.

    Ты под Mono не сможешь запустить приложение на WPF:)
    Тогда уж сразу лучше писать на Avalonia.
    Это раз.

    Два - если будет Linux, то очень велик шанс, что какой-нибудь особенный российский linux, у которого могут быть проблемы с совместимостью - нужно будет тестировать и как минимум писать инструкции по установке.

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

    У вебвью есть куда больше прав к данным телефона/пользователя, особенно чувствуется на яблоках, которые не поддерживают кучу современных апи, например вибрацию.
    Ответ написан
    Комментировать
  • Laravel excel, как сохранить файл в проект?

    @random362
    Вроде бы в доке есть ответы на все вопросы
    1. Storing Files
    use Illuminate\Support\Facades\Storage;
     
    Storage::put('file.jpg', $contents);
    Storage::put('file.jpg', $resource);

    2. Mail#attachments
    /**
     * Get the attachments for the message.
     *
     * @return array<int, \Illuminate\Mail\Mailables\Attachment>
     */
    public function attachments(): array
    {
        return [
            Attachment::fromStorage('/path/to/file'),
        ];
    }


    такой код, он сразу отправляет файл на загрузку

    Не на загрузку, а на скачивание.
    Ответ написан
    Комментировать
  • Какое регулярное выражение подойдет для проверки номера телефона?

    @kudry
    Тоже столкнулся с проблемой валидизации телефонных номеров.
    Телефоны берутся с участников вебинаров, на которые записываются люди из очень разных стран.
    Соответственно, со всеми предыдущими схемами возникают проблемы:
    1) а что если телефон с Украины (не +7-, а +38-)? А из Казахстана? А США (1-)? А Уганда ( +233-)? (из Уганды, правда, пока слушателей не было, но все впереди).
    2)В разных местностях приняты самые невообразимые способы разбиения телефона на группы цифр:
    8(8888)8-88-88-88 например. или 888(88)88888-888. Да и какие угодно могут возникнуть в будущем.
    Поэтому вариант с "дефолтным разбиением типа "8(888)888-88-88 ну совершенно не катит.

    Соответственно, я придумал следующий валидатор:
    1) В начале могут быть пробелы, после них может быть "+" (а может и не быть)
    2) Дальше должна идти группа цифр в количестве от 10 до 14 (мне нужны номера в международном формате; но если кому-то нужны более короткие - можно исправить диапазон длин).
    3) Поскольку я не знаю, как люди группируют цифры - до и после каждой цифры может быть один из 8 знаков ("-", " ", "_", "(", ")", ":", "=", "+"). Это значит, что между двумя цифрами могут быть любые два из этих знаков.

    В итоге получилось очень коротко и понятно )) :
    /^(\s*)?(\+)?([- _():=+]?\d[- _():=+]?){10,14}(\s*)?$/

    Съедает следующие телефоны:
    +7(903)888-88-88
    8(999)99-999-99
    +380(67)777-7-777
    001-541-754-3010
    +1-541-754-3010
    19-49-89-636-48018
    +233 205599853
    Ответ написан
    1 комментарий
  • Нужен ли отдельный linux user для сайта?

    ValdikSS
    @ValdikSS
    Нужны отдельные unix-пользователи на сервис/проект/сайт, иначе в случае взлома сайта А будет возможность читать и модифицировать файлы сайта Б, т.к. все файлы принадлежат www-data.

    Отдельные пользователи нужны всем сервисам, которые так или иначе взаимодействуют с файлами. В случае PHP это php-fpm (или другой исполнитель) — у каждого сайта должен быть свой пул со своим пользователем. Всё, с чем взаимодействие ведётся только по сети/сокету и имеет правильное разделение привилегий (базы данных), должны работать от своего (стандартного) пользователя.

    В случае веб-сервера также уместно разделить статические данные от кода: картинкам и .js-файлам следует назначить www-data, чтобы веб-сервер мог их прочесть и раздать, а php-код любого сайта при этом не мог эти данные модифицировать. Верно и в обратную сторону — веб-сервер не сможет отдать ваши .php-файлы без их исполнения в случае некорректной настройки веб-сервера.
    Ответ написан
    Комментировать
  • Как можно улучшить организацию дев окружения и деплоя при разработке библиотеки?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Докер.

    Вообще очень странно, что вы так долго могли усидеть на такой неудобной конструкции.
    99% разработчиков тестируют код локально, ничего никуда не "синхронизируя" и не "заливая".

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

    Как вариант - можно попробовать Continuous Integration, который весь этот список от пуша до composer update на удалённом будет выполнять автоматом.
    Ответ написан
    6 комментариев
  • Какой пет проект можно реализовать на Java?

    saboteur_kiev
    @saboteur_kiev
    software engineer
    Я не представляю как можно спрашиваьт у кого-то какой пет проект себе сделать.
    Все равно что спросиьт "каким хобби мне увлечься" и прослушать лекцию что ролики круче прыжков с парашютом, а настолки мастер оф гезеринг и Д&Д вообще разные вселенные.

    Придумайте себе тулзу/сайт/прогу, которая бы лично вам была интересна/полезна и развивайте ее.
    Когда-то таким пет-проектом был собственно линукс
    Ответ написан
    Комментировать
  • Установка пакета paybox без composer?

    Собирай через composer на машине, где он доступен.
    Затем загружай результат вместе с vendor на хост.
    Ответ написан
    4 комментария
  • Какими наводящими вопросами деликатно определить, процветает ли в компании микроменеджмент либо нет?

    php666
    @php666
    PHP-макака
    если фиксированный оклад без премий, и ревью раз в год - тогда врятли люди внутри будут выкладываться. они будут в изоляции от процессов компании, багофиксерами того что спустят свяше, и как следствие - микроменеджмент
    вообще не понятно причем тут ревью, фиксированный оклад и микроменеджмент
    Ответ написан
    1 комментарий
  • Какими наводящими вопросами деликатно определить, процветает ли в компании микроменеджмент либо нет?

    saboteur_kiev
    @saboteur_kiev Куратор тега Карьера в IT
    software engineer
    Прямо спрашиваешь, кто будет давать мне задачи и кто будет контролировать.
    Есть ли почасовой контроль какими-либо инструментами.

    Ваш вопрос про "какая оплата" - ВООБЩЕ не про это.
    Может быть даже, что в компании может быть несколько проектов/команд и на какой-то одном проекте сидит "эффективный" менеджер, который увлекается микроменеджментом.
    Ответ написан
    Комментировать
  • Как в каждый ответ в API добавить данные при выполнении определенных условий?

    @daniel_wesson
    Я бы действительно сделал через middleware типо AttachConfigToResponse
    public function handle(Request $request, Closure $next): Response
    {
        $response = $next($request);
    
        $json = $response->getData();
        $json['config'] = ...;
    
        $response->setData($json);
    
        return $response;
    }
    Ответ написан
    1 комментарий
  • Почему вторая функция выполняется раньше если стоит await?

    Alexandroppolus
    @Alexandroppolus
    кодир
    Скорее всего, внутри changeType ты запускаешь какую-то асинхронную действию, но не ждёшь окончания оной. Без кода непонятно.
    Ответ написан
    2 комментария
  • Laravel. Как тестировать кэширование?

    Если кэшируются не сырые данные из базы, а данные сформированные для ответа - можно добавить кастомный заголовок информирующий о работающем кешировании. Какой-нибудь Age к примеру.

    Это в том числе позволит писать функциональные тесты без необходимости мокать кэш, и при этом понимать работает ли он.
    Ответ написан
    Комментировать
  • Как максимально быстро добавить огромное количество записей в БД без дублей?

    Frostealth
    @Frostealth
    Backend Developer
    Как вариант: отфильтровать `$numbers` на стороне PHP и вставить пачкой.

    // избавляемся от возможных дубликатов
    $numbers = collect($numbers)->unique();
    // pluck('num') вернет нам список значений атрибута num, а не список моделей
    $existingNumbers = Model::query()->whereIn('num', $numbers->toArray())->pluck('num');
    // с помощью diff получаем элементы, которых нет в $existingNumbers
    $newNumbers = $existingNumbers->diff($numbers)->mapWithKeys(function ($value, $key) {
        // ['one', 'two'] => [['num' => 'one'], ['num' => 'two']]
        return [$key => ['num' => $value]];
    });
    
    Model::query()->getConnection()->transaction(function () use ($newNumbers) {
        Model::query()->insert($newNumbers->toArray()); 
    });


    При очень больших данных в БД нужно вытаскивать из БД чанками (пачками определенного размера, например по 500 000), а не сразу все.
    // избавляемся от возможных дубликатов
    $newNumbers = collect($numbers)->unique();
    Model::query()->toBase()->whereIn('num', $numbers->toArray())
          ->chunk(500000, function ($existingNumbers) use (&$newNumbers) {
               // с помощью diff получаем элементы, которых нет в $existingNumbers
              $newNumbers = $newNumbers->diff($existingNumbers);
          });
    
    // ['one', 'two'] => [['num' => 'one'], ['num' => 'two']]
    $newNumbers = $newNumbers->mapWithKeys(function ($value, $key) {
        return [$key => ['num' => $value]];
    });
    
    Model::query()->getConnection()->transaction(function () use ($newNumbers) {
        Model::query()->insert($newNumbers->toArray()); 
    });


    Также можно воспользоваться ON CONFLICT, если СУБД поддерживает подобное. Например, у SQLite - ON CONFLICT DO, у MySQL - INSERT IGNORE. Это позволит избавиться от выгрузки данных из БД, что уменьшит потребление памяти приложением и сократит количество запросов.
    Laravel имеет для этого метод Query::insertOrIgnore(), который будет глушить все ошибки от некоторых БД, но для некоторых не поддерживается. Поддерживаемые БД: MySQL, SQLite, PostreSQL.
    Необходимо, чтобы на атрибут `num` в БД стоял constraint unique, иначе БД просто вставит дубликат.
    $numbers = collect($numbers)->unique()->mapWithKeys(function ($value, $key) {
        return [$key => ['num' => $value]];
    });
    
    Model::query()->getConnection()->transaction(function () use ($numbers) {
        Model::query()->insertOrIgnore($numbers->toArray());
    });


    Индексы и explain изучить не помешает. Размер чанка подобрать по возможностям железа.
    Индекс на num значительно ускорит выборку, но скорость вставки снизится.
    Так же отказ от ORM (Eloquent), объектов и использование голого SQL с PDO ускорит работу.
    На большие данные и нагрузки нужно мощное железо. Может потребоваться масштабирование и т.д.
    Ответ написан
    Комментировать
  • По какой причине выдает ошибка в TypeScript?

    yarkov
    @yarkov
    Помог ответ? Отметь решением.
    А так?
    searhcField: keyof Post
    Ответ написан
    2 комментария
  • Какие порекомендуете сайты с набором элементов UI?

    scoffs
    @scoffs
    Fullstack | C# | Student
    Я бы советовал посмотреть в сторону более современных UI библиотек, например, MUI или Tailwindcss
    Ответ написан
    Комментировать
  • Как получить второй id из url?

    delphinpro
    @delphinpro Куратор тега Laravel
    frontend developer
    Просто добавьте все параметры которые есть в роуте.
    Используйте биндинг, что бы сразу в параметре получить объект.

    public function productPage(Category $category, Product $product){
        // $currentProduct = Product::find($product); это уже не нужно
        // В переменной $product уже будет объект
        return view('product', compact('product'));
    }
    Ответ написан
    Комментировать
  • Какой вариант организации домашней виртуализации выбрать?

    @rPman
    Зачем? очень важный вопрос, зачем платить ресурсами (память, процессор, накладные расходы дает даже паравиртуализация lxc) да еще и устраивать многоуровневые системы для хранения данных?

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

    Вторая неприятность, большие системы виртуализации типа xen могут вообще не давать удобного (т.е. штатного интерфейса) механизмы работы с локальными образами или с образами nbd (т.е. работать можно но только как ручные настройки, т.е. возвращает в ковыряние в конфигах вместо того чтобы в интерфейсе выбрать что либо).

    Как это ни странно, самая удобная система виртуализации для домашнего пользователя (нет кластера и его фишек) - это VirtualBox

    Так же штатный libvirt имеет свой интерфейс и он так же рекомендуется как основной инструмент виртуализации (к нему доустанавливаются поддержка lxc а так же сетевых накопителей и становится совсем неплохо), так же для домашнего использования без кластера и его фишек
    Ответ написан
    Комментировать
  • Как сделать чтобы в приложение заходили только с определенного ip адреса?

    Fragster
    @Fragster
    помогло? отметь решением!
    Оптимальнее всего сделать это либо средствами firewall, если это выделенный сервер, либо с помощью настроек веб сервера, если это сервер с несколькими приложениями. Можно, конечно, и middleware с проверкой ip написать, но только если этот список ip хранится в базе данных.
    Ответ написан
    Комментировать
  • Почему все называют TypeScript компилируемым языком программирования?

    1. Если душнить, то никто не называет TypeScript компилируемым языком.
    Вот например что написано на официальном сайте на самом верху:

    TypeScript is a strongly typed programming language that builds on JavaScript, giving you better tooling at any scale.


    2. У typescript есть компилятор tsc - его называют компилятором, потому что он по определению им является.

    Но стоп, компиляция - это процесс перевода "человеческого" кода в машинный код.

    Нет. Даже если брать определение из википедии, то будет:

    In computing, a compiler is a computer program that translates computer code written in one programming language (the source language) into another language (the target language).

    Никакой речи о "машинном коде" нет, как видишь)

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

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

    2. В англоязычном интернете transpiler наоборот являются подмножеством compiler.
    Compiler - такая программа, которая преобразует код с одного языка на другой, причём из одного файла может получиться N файлов.
    А tanspiler - это такая программа, которая берёт исходный код на одном языке, и преобразует его в исходный код на другом языке, причём 1 файл преобразуется ровно в 1 файл.

    Получается, что tsc - это транслятор/транспайлер, а причислять их к компиляторам или нет - это дискуссионный вопрос.
    Ответ написан
    2 комментария