• Как автоматически проставлять группу пользователя при создании файла через winscp?

    saboteur_kiev
    @saboteur_kiev Куратор тега Linux
    software engineer
    Тут системно надо подходить к вопросу. Много неясностей.

    1. Если все пользователи пишут в одну и ту же папку (типа upload), можно просто проставить SUID и SGID флаги на папку, и все файлы в ней будут создаваться от юзера/группы владельца upload/

    2. Также почему все кидают файлы от своего имени? Можно сделать специального пользователя, попросить всех юзеров сгенерировать ssh ключи и добавить в этого пользователя. Каждый будет логиниться со своим ssh ключом, но юзер будет один и тот же

    3. Добавить всех пользователей в одну группу и проверить чтобы umask был 0002
    Ответ написан
    Комментировать
  • Как автоматически проставлять группу пользователя при создании файла через winscp?

    ky0
    @ky0
    Миллиардер, филантроп, патологический лгун
    Делаете нужную группу основной у пользователей - и она начинает проставляться при создании файлов.
    Ответ написан
    Комментировать
  • Почему Laravel + NGINX - отдаёт файлы с кодом ответа 404?

    @dyus1 Автор вопроса
    // TODO
    Никто так и не ответил, но проблема была вот в этом кусочке конфига:
    location ~* ^.+\.(?:css(\.map)?|js(\.map)?|jpe?g|png|gif|ico|cur|heic|webp|tiff?|mp3|m4a|aac|ogg|midi?|wav|mp4|mov|webm|mpe?g|avi|ogv|flv|wmv|svgz?|ttf|ttc|otf|eot|woff2?)$ {
            expires 1d;
            access_log off;
    }

    почему то, при наличии данного куска конфига, nginx плевался ошибкой 404, так как файл отдавался через контроллер и физически не существовал по заданному пути. Странно, почему при отсутствие файла по конкретному пути, сервер не передавал управление на корневой index.php, так как это было указанно в "try_files"? Благо, закомментировав этот кусок кода, всё заработало!
    Ответ написан
    Комментировать
  • Как скачать сайт полностью на компьютер?

    @lirostin
    Чтобы скачать сайт целиком с помощью wget нужно выполнить команду:
    wget -r -k -l 7 -p -E -nc http://site.com/

    -r — указывает на то, что нужно рекурсивно переходить по ссылкам на сайте, чтобы скачивать страницы.
    -k — используется для того, чтобы wget преобразовал все ссылки в скаченных файлах таким образом, чтобы по ним можно было переходить на локальном компьютере (в автономном режиме).
    -p — указывает на то, что нужно загрузить все файлы, которые требуются для отображения страниц (изображения, css и т.д.).
    -l — определяет максимальную глубину вложенности страниц, которые wget должен скачать (по умолчанию значение равно 5, в примере мы установили 7). В большинстве случаев сайты имеют страницы с большой степенью вложенности и wget может просто «закопаться», скачивая новые страницы. Чтобы этого не произошло можно использовать параметр -l.
    -E — добавлять к загруженным файлам расширение .html.
    -nc — при использовании данного параметра существующие файлы не будут перезаписаны. Это удобно, когда нужно продолжить загрузку сайта, прерванную в предыдущий раз.
    Ответ написан
    Комментировать
  • Как спроектировать многоролевое api на laravel 9?

    vfreelancer
    @vfreelancer
    php
    возьмите https://spatie.be/docs/laravel-permission/v5/intro... и изучите))
    Ответ написан
    Комментировать
  • Как убрать крашнутые картинки?

    @GrayHorse
    Используй onerror у img элемента.

    <img src="not-loading-image.jpg" onerror="this.remove();">
    <img src="https://hsto.org/webt/62/a8/df/62a8df7d29053796257182.png" onload="console.log(this);">
    Ответ написан
    1 комментарий
  • Какое изменение могло привести к неработоспособности плагина?

    OtshelnikFm
    @OtshelnikFm Куратор тега WordPress
    Обо мне расскажет yawncato.com
    У него есть автор. У него есть техподдержка. Если баг - автор исправит. А мы нет.
    Спроси автора. Такие вопросы тут не решают.
    Ответ написан
    2 комментария
  • Как сделать автозапуск видео на сайте?

    vgluhov
    @vgluhov
    .exe
    playlist=MMi6mUmihpo
    и, укажите еще один параметр mute=1
    Ответ написан
    Комментировать
  • В чём роль потоков (Stream) и как они работают в передаче данных по локальной сети (через Socket)?

    petermzg
    @petermzg
    Самый лучший программист
    Stream это просто удобный абстрактный класс для работы с потоками данных.
    Класс TcpClient на его базе реализует свой класс, который можно получить так
    stream = tcpClient.GetStream();
    И теперь все байты, что пишутся в данный stream, через переопределенные методы Write, WriteAsync, WriteByte, BeginWrite отсылаются по установленному сетевому соединению.

    PS: Любой файл это изначально набор байт, так что преобразований, как у вас в примере, не требуется.
    Ответ написан
    3 комментария
  • Как рассчитать надежнось пароля?

    Число перестановок N элементов = N! (N-факториал)
    Ответ написан
    Комментировать
  • Как создать такой плагин в WordPress?

    Берите любой учебник по созданию плагинов для wp и изучайте.
    Неужели Вы думаете , что Вам здесь напечатают учебник по Вашему плану
    Ответ написан
    3 комментария
  • Как лучше реализовать главную страницу на Wordpress?

    iamd503
    @iamd503
    Верстальщик
    https://www.advancedcustomfields.com
    или другие аналоги
    Ответ написан
    Комментировать
  • WordPress режет ссылки?

    azerphoenix
    @azerphoenix
    Java Software Engineer
    Могу сказать, что ВП по умолчанию не режет ссылки.
    Ищите конфликт плагинов или функцию обрезки ссылок в плагинах.
    Ответ написан
    1 комментарий
  • Куда поступать на программиста в Новосибирске после 9 или лучше после 11?

    kawabanga
    @kawabanga
    Есть неплохой шанс потерять мотивацию после 9го класса. Поэтому я все таки рекомендую закончить 11 класс.
    В 9 классе вы еще молоды, и многие ваши действия я бы отдал под контроль родителей. Опять же, колледж будет перенасыщен людьми, которые просто не смогли пойти в 10 класс. А это очень опасное окружение, которое может негативно сыграть на ваше будущее.

    А вот в 10-11 классе вы можете пойти в школы подготовки, вроде как они есть у нас тут в НСК. И уже к концу 11 класса будете иметь представление о том, куда вы планируете развиваться.

    Английский учите. Без вариантов. Впрочем, за 2 года вызубрить ЕГЭ - не думаю что это проблема.
    Ответ написан
    5 комментариев
  • Как хранить бизнес и бухгалтерские правила?

    opium
    @opium
    Просто люблю качественно работать
    Именно поэтому 1с захватил рынок
    Разработка очень мутная
    Ответ написан
    Комментировать
  • Как парсить текст в CSV формате игнорируя запятые внутри кавычек и без сторонних библиотек?

    @Sumor
    По мотивам ответа mefutu
    Примерное решение на конечном автомате:
    using System;
    using System.Text;
    using System.Collections.Generic;
    					
    public class Program
    {
    	public static void Main()
    	{
    		Console.WriteLine(string.Join("|", Parse("Мама,\"мыла, блин\", раму,\"мама, мыла \"\"раму\"\"\",конец")));
    	}
    	
    	public enum StateEnum{Start, StartQuot, Inline, InlineQuot}
    	
    	public static IEnumerable<string> Parse(string str)
    	{
    		var state = StateEnum.Start;
    		var sb = new StringBuilder();
    		foreach(var ch in str)
    		{
    			switch(ch)
    			{
    				case '"':
    					switch(state)
    					{
    						case StateEnum.Start:
    							state = StateEnum.StartQuot;
    							continue;
    						case StateEnum.StartQuot:
    						case StateEnum.InlineQuot:
    							state = StateEnum.Inline;
    							sb.Append('"');
    							continue;
    						case StateEnum.Inline:
    							state = StateEnum.InlineQuot;
    							continue;
    					}
    					break;
    				case ',':
    					switch(state)
    					{
    						case StateEnum.Start:
    						case StateEnum.InlineQuot:
    							yield return sb.ToString();
    							sb.Clear();				
    							state = StateEnum.Start;
    							continue;
    						case StateEnum.StartQuot:
    						case StateEnum.Inline:
    							sb.Append(',');
    							state = StateEnum.Inline;
    							continue;						
    					}
    					goto default;
    				default:
    					sb.Append(ch);
    					break;
    			}
    		}
    		yield return sb.ToString();
    	}
    }
    Ответ написан
    Комментировать
  • Как правильно написать этот код/как оптимизировать это "код"?

    @Free_ze
    Пишу комментарии в комментарии, а не в ответы
    Первое, что нужно сделать - определить доменные сущности, с которыми будет работать программа. В вашем случае это:
    • тест, который состоит из вопросов;
    • вопрос, который состоит из текста и ответов (упорядоченные по индексам);
    • ответ, котрый состоит из текста и признака правильности.
    Код
    public class Test
    {
        public IList<Question> Questions { get; set; }
    }
    
    public class Question
    {
        public string Text { get; set; }
        public IList<Answer> Answers { get; set; }
    }
    
    public class Answer
    {
        public string Text { get; set; }
        public bool IsRight { get; set; }
    }



    Необходимо декомпозировать задачу на атомарные подзадачи. Каждую подзадачу можно унести в отдельную функцию, чтобы ограничить сферы ответственности кода (в духе SOLID в общем и SRP в частности), чтобы обезопасить себя от "эффекта бабочки", когда небольшое изменение отдого кусочка кода в одной части приложения рушит остальную работу в другой части. Да и читать код будет проще, не путаясь в деталях реализации из огромной портянки неразрывного кода с неочевидными связями переменных. Получается примерно так:

    1. логика "главного меню";
    2. логика теста:
      1. создание контента теста;
      2. прохождение теста:
        1. распечатка вопроса;
        2. получение ввода пользователя;
        3. проверка ответа;
        4. подсчет и вывод статистики.



    Затем необходимо сформировать структуру теста. Для этого можно создать функцию-фабрику, которая возвращает новый объект теста (данные хардкодятся как здесь, читаются из базы, ходят за ними в интернет... whatever, нас интересует само тестирование):
    Код
    public static Test CreateTest()
    {
        return new Test
        {
            Questions = new List<Question>
            {
                new Question
                {
                    Text = "Какая команда выводит текст в консоль?",
                    Answers = new List<Answer>
                    {
                        new Answer { Text = "if/else" },
                        new Answer { Text = "System.out.println();" },
                        new Answer { Text = "Console.WriteLine();", IsRight = true },
                        new Answer { Text = "int x = 10;" }
                    }
                },
                new Question
                {
                    Text = "Какой тип из списка целочисленный?",
                    Answers = new List<Answer>
                    {
                        new Answer { Text = "char" },
                        new Answer { Text = "int", IsRight = true },
                        new Answer { Text = "float" },
                        new Answer { Text = "double" }
                    }
                }
                //,...
            }
        };
    }


    Пусть программа, как у вас, приветствует пользователя, а затем, пока он не введет какой-то из двух корректных выводов (регистронезависимо (...IngoreCase)), будет показывать приглашение с подсказкой. Если Go - вызываем создание теста и заходим в игру. Если игра завершилась или пользователь изначально ввел Exit - печатаем знаменитое Press any key... и выходим из программы.
    Код
    public static void Main()
    {
        Console.WriteLine("Всем привет! И это моя первая мини-программа для проверки ваших знаний языка программирования C#");
        string input;
        
        do
        {
            Console.WriteLine("Если готовы пройти тест напишите Go, а если хотите выйти напишите Exit.");
            input = Console.ReadLine();
    
            if (input.Equals("Go", StringComparison.InvariantCultureIgnoreCase))
            {
                var test = CreateTest();
                PlayGame(test); // <----- Логика тестирования находится здесь
            }
        } while (   !input.Equals("Go", StringComparison.InvariantCultureIgnoreCase)
                 && !input.Equals("Exit", StringComparison.InvariantCultureIgnoreCase));
    
        Console.WriteLine("Для выхода нажмите любую клавишу...");
        Console.ReadKey();
    }


    Для игры нам потребуется массив с номерами "проваленных" вопросов (которые пригодятся для статистики в конце - CalculateResult). Мы обходим все вопросы из теста, сначала выводя их текст с вариантами на экран (PrintQuestion), затем спрашивая юзера его выбор (GetUserChoice). Затем ответ проверяется (IsCorrectAnswer), если он неверен - добавляем номер ответа (i - это индекс массива с нуля, поэтому +1) в массив ошибок. После всех вопросов - подсчитываем и выводим статистику.
    Код
    private static void PlayGame(Test test)
    {
        var mistakes = new List<int>();
        for (int i = 0; i < test.Questions.Count; ++i)
        {
            var question = test.Questions[i];
            PrintQuestion(question, i);
    
            int choice = GetUserChoice(question.Answers.Count);
    
            if (!IsCorrectAnswer(choice, question.Answers))
            {
                mistakes.Add(i + 1);
            }
        }
    
        CalculateResults(test.Questions.Count, mistakes);
    }


    Вопрос распечатывается элементарно: сначала его текст, затем варианты ответов, перед которыми ставиться табуляция (\t), чтобы сформировался отступ списка:

    Код
    private static void PrintQuestion(Question question, int questionIndex)
    {
        Console.WriteLine($"{questionIndex + 1}. {question.Text}");
    
        for (int i = 0; i < question.Answers.Count; ++i)
        {
            Console.WriteLine($"\t{i + 1}. {question.Answers[i].Text}");
        }
    }


    Получение варинта юзера делается циклом аналогичным вводу Go/Exit в начале. Его завершением управляет переменная isCorrectInput, которая ставится равной true только в самом конце, когда значение успешно спарсится и пройдет проверку на валидность номера ответа (от 1 до максимального номера ответа):
    Код
    private static int GetUserChoice(int answersCount)
    {
        bool isCorrectInput = false;
        int choice = -1;
        do
        {
            try
            {
                Console.WriteLine("Введите номер ответа:");
                string input = Console.ReadLine();
                choice = Convert.ToInt32(input);
                if (choice >= 1 && choice <= answersCount) isCorrectInput = true;
            }
            catch (Exception ex)
            {
                Console.WriteLine("Неправильный формат ввода");
            }
        } while (!isCorrectInput);
    
        return choice;
    }


    Для проверки правильности сначала выделяем правильные ответы вопроса (rightAnswers), а потом сравниваем их порядковые индексы с выбранным пользователем индексом. Если хоть один ответ совпал (да, их может быть несколько) - вернется true:
    Код
    private static bool IsCorrectAnswer(int choice, IList<Answer> answers)
    {
        var rightAnswers = answers.Where(x => x.IsRight);
        int chosenAnswerIndex = choice - 1;
        return rightAnswers.Any(x => answers.IndexOf(x) == chosenAnswerIndex);
    }


    Ну и вишенка - распечатка результатов. Если ошибок нет - все гуд, 100% решений. Если ошибки есть, то мы решаем простую пропорцию, вычисляя сколько процентов ошибочных ответов было дано, а затем вычитаем их из 100%, получая процент успеха.
    Код
    private static void CalculateResults(int questionsCount, IList<int> mistakes)
    {
        if (mistakes.Count == 0)
        {
            Console.WriteLine("Вы на все вопросы ответили правильно! Тест пройден на 100%! ");
        }
        else
        {
            string invalidQuestionsString = string.Join(", ", mistakes.Select(x => $"#{x}"));
            int progressPercentage = 100 - (int)Math.Ceiling(100 * (double)mistakes.Count / questionsCount);
            Console.WriteLine($"Среди ваших ответов есть неправильные ({mistakes.Count}: {invalidQuestionsString})). Тест пройден на {progressPercentage}% ");
        }
    }



    ЗЫ Вы можете поиграть с кодом, попробовать добавить больше вопросов, принудительное прерывание после первого неправильного ответа, обработку множественных корректных ответов (добавлять или баллы за частичное угадывание), разнообразить типы вопросов и прочее.

    Полный листинг на ideone
    Ответ написан
    Комментировать
  • Как отфильтровать массив с объектами?

    var filtered = content.Where(x=>(decimal) x["date"] >= 100 &&(decimal) x["a"] < (decimal) x["b"] );
    Ответ написан
    Комментировать
  • LINQ или foreach?

    @EvgeniiR
    https://github.com/EvgeniiR
    1. Такая ситуация складывается от того что бизнесу обычно нужно чтобы было готово ещё вчера, и плевать ему какие костыли при этом будут в коде, в худшем случае он не подумает даже о сложности поддержки всего этого.

    2.
    Программист, как мне кажется, это прежде всего инженер, а инженерный подход предусматривает создание оптимального, с точки зрения экономики, решения.

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

    https://habr.com/company/badoo/blog/430722/ - хорошая статья от badoo, с выводами на счёт целесообразности оптимизировать код / добавлять сервера
    Ответ написан
    Комментировать