• Автосохранение VS Code в другую директорию.?

    Lobotomist
    @Lobotomist
    Software Developer
    Полагаю, вам подойдет расширение sync-rsync
    Ответ написан
    Комментировать
  • Сколько дней в пересечении двух дат?

    Lobotomist
    @Lobotomist
    Software Developer
    Пересечение двух диапазонов дат получить довольно просто - это разница между самым поздним началом и самым ранним концом этих периодов.

    /**
     * Предполагается, что dateStart <= dateEnd. Если это не гарантируется, нужно их привести к такому виду внутри функции.
     */
    function getIntersectDays(DateTime $dateStart1, DateTime $dateEnd1, DateTime $dateStart2, DateTime $dateEnd2) : int {
        $intersectionEnd = min($dateEnd1, $dateEnd2);
        $intersectionStart = max($dateStart1, $dateStart2);
    
        if ($intersectionStart >= $intersectionEnd) return 0;
    
        return (int)$intersectionStart->diff($intersectionEnd)->format('%a');
    }
    Ответ написан
    1 комментарий
  • Как привести массив в более читабельный вид?

    Lobotomist
    @Lobotomist
    Software Developer
    Например, заменить
    array_push($result,key($r));

    на

    // $r тут - номер слова в исходном массиве $words
    $word = $words[$r];
    $result[$word] = key($r);
    Ответ написан
    Комментировать
  • Как на гитхабе найти коммит с исправлением узявимости?

    Lobotomist
    @Lobotomist
    Software Developer
    Как я понимаю, проблема ваша в том, что вы ищете не в том репозитории =) Это репозиторий libssh2.
    Вот новость об исправлении уязвимости на оф. сайте libssh. Оттуда мы можем получить ссылку на клонирование репозитория:
    git clone https://git.libssh.org/projects/libssh.git libssh


    Кроме того, доступен просмотр через веб интерфейс. Можно найти там тег libssh-0.8.4 и посмотреть соответствующие коммиты: https://git.libssh.org/projects/libssh.git/log/?h=...
    Ответ написан
    Комментировать
  • Как обновлять код в двух репозиториях?

    Lobotomist
    @Lobotomist
    Software Developer
    В таком случае стоит вынести бэкенд в отдельный репозиторий и подключать его как зависимость. Нормальных вариантов решать это через git мне не известно и я очень сомневаюсь что они есть по той простой причине, что git для решения таких задач не предназначен. По сути у вас получается три продукта, связанных между собой разными связями. Две версии фронтэнда (два продукта) связаны между собой общей "основой" (кодом), то есть это аналогично "наследованию" в ООП от общего базового класса. А от бэкенда они "зависят". Причем, могут зависеть от разных его версий (скорее всего будут, рано или поздно). То есть это больше похоже на "композицию" в терминах ООП. Так вот git - он не призван решать проблему зависимостей одного проекта от другого. Для этого нужно использовать менеджер зависимостей. Не знаю, на чем у вас написан проект, но для php это будет composer, для nodejs - npm, для python - pip(pyenv, poetry) и т.п.

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

    Например. Имеем по репозиторию (или ветке/несколько веток) для каждого проекта. При изменении кода бэкенда в одном из проектов сливаем его с кодом другого проекта, игнорируя при этом все изменения не бэкенда. Практическая реализация этого зависит от структуры кода и вообще вашего workflow. Но история проекта будет не красивой - все эти слияния, в которых еще и игнорируются изменения фронтэнд части... Это будет работать, но... это ужасно.
    Ответ написан
    1 комментарий
  • Как исключить корневой .gitignore файл из git репозитория, если он уже присутствует в индексе git?

    Lobotomist
    @Lobotomist
    Software Developer
    Также как и любой другой файл: git rm .gitignore

    Просто прописать в файле .git/info/exclude .gitignore не помогает.


    Это потому, что игнорирование распространяется только на еще не отслеживаемые файлы. Это касается любого файла, не только .gitignore. Поэтому добавление его в игнор постфактум не срабатывает.

    Вообще, возможно у нас тут xy problem. Так что может быть вам стоит описать для чего вы хотите удалить .gitignore.
    Ответ написан
    Комментировать
  • Как поместить папку в игнор, но при этом она была привязана к проекту?

    Lobotomist
    @Lobotomist
    Software Developer
    Насколько я понимаю, проблема возникает из-за того, что по умолчанию при чекауте ветки игнорируемые и просто неотслеживаемые (untracked) файлы не удаляются из рабочей директории.

    Преамбула

    Вы написали, что файлы нового проекта у вас добавлены в .gitignore. Это не сомнительная идея:
    • Получается, что у вас в коде старого проекта есть игнорирование файлов нового проекта. В ветке старого кода не должно быть того, что относится к новому.
    • Если вы игнорируете файлы нового проекта - тогда чтобы их удалить вам нужно либо явно указывать какие файлы нужно удалить либо удалять все игнорируемые файлы. А среди них могут быть такие, которые вам нужны, например, код сторонних дидлиотек, если он у вас есть или локальные конфиги и т.п.


    Вы можете убрать из .gitignore старого проекта все, что относится к новому и просто удалять все untracked файлы и папки при чекауте с помощью команды git clean -fd. Но это не очень удобно потому, что
    • При переключении между ветками будет создаваться и удаляться большое количество файлов, а это лишняя нагрузка на ФС и время
    • Вводить данные команды руками скорее всего лениво (правда, можно написать alias для их автоматизации)

    Решение

    Скорее всего в вашем случае наиболее адекватным решением будет иметь две рабочие директории - для текущей версии проекта и для новой. А в редких случаях, когда у вас так получается, что вы делаете переключение между этими версиями в рамках одной рабочей директории выполнять git clean -fd
    Ответ написан
    Комментировать
  • Как в git локально заигнорить папку так чтобы при ее последующем изменении она больше не попадала в индекс?

    Lobotomist
    @Lobotomist
    Software Developer
    Вообще ситуация выглядит странно и node_modules скорее всего из репозитория надо убирать. Далее по сути вопроса.

    Для того, чтобы новые модули не отслеживались гитом самый простой вариант добавить их игнорирование для конкретного репозитория (будет работать только для вашего локального репозитория) в файл .git/info/exclude написать:
    node_modules/*

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

    Сложнее в случае, если вы изменяете уже отслеживаемые гитом файлы модулей. Чтобы ваши изменения не отслеживались гитом можно сказать ему, чтобы он игнорировал изменения в них. Для этого есть команда git update-index --skip-worktree <path>. Можно выполнить ее сразу для всех файлов в папке node_modules, а можно выборочно только для тех которые фактически изменены.

    # для всех
    git ls-files node_modules | xargs git update-index --skip-worktree
    # для измененных
    git ls-files -m node_modules | xargs git update-index --skip-worktree

    git ls-files node_modules - выводит список файлов, отслеживаемых гитом в папке node_modules, с ключом -m только те, которые модифицированы.
    xargs - выполняет соответствующую команду для каждого из этих файлов.
    Ответ написан
    Комментировать
  • Как установить sublime text на arch linux?

    Lobotomist
    @Lobotomist
    Software Developer
    На данный момент рекомендованный способ - установка через pacman из репозитория разработчика:

    Установка GPG ключа:
    curl -O https://download.sublimetext.com/sublimehq-pub.gpg && sudo pacman-key --add sublimehq-pub.gpg && sudo pacman-key --lsign-key 8A8F901A && rm sublimehq-pub.gpg

    Добавление репозитория Sublime Text:
    echo -e "\n[sublime-text]\nServer = https://download.sublimetext.com/arch/stable/x86_64" | sudo tee -a /etc/pacman.conf

    Установка Sublime Text:
    sudo pacman -Syu sublime-text
    Ответ написан
    Комментировать
  • Как следить за процессом работы потока в %?

    Lobotomist
    @Lobotomist
    Software Developer
    Попробуйте модуль progress-stream
    Ответ написан
    Комментировать
  • Есть ли какой-нибудь плагин Sublime для отображения текущего branch of git?

    Lobotomist
    @Lobotomist
    Software Developer
    Как вариант, плагин SublimeGit, в том числе отображает текущую ветку в панели статуса.
    Выглядит это так: qTn6cFk.jpg
    Ответ написан
    Комментировать
  • Как запустить два процесса одновременно?

    Lobotomist
    @Lobotomist
    Software Developer
    Такое ощущение, что вы пытаетесь придумать свой конвейер (pipe). Возможно, я вас не так понял, но думаю, что проще всего, чтобы у вас было две программы:
    1. Producer, генерит какие-то данные в stdout
    2. Consumer, принимает данные из stdin
    И запускаете их таким макаром:

    Producer | Consumer
    Ответ написан
    9 комментариев
  • Как узнать timestamp полуночи после смены часового пояса?

    Lobotomist
    @Lobotomist
    Software Developer
    Дело в том, что ->modify("midnight") не устанавливает время в начало суток. В документации такого модификатора нету. Для того, чтобы установить начало дня можно использовать ->startOfDay().

    То есть ваш код принимает такой вид:
    $initial = Carbon::createFromTimestamp(1485943200);
    $moscow_midnight = $initial->copy()->timezone('Europe/Moscow')->startOfDay()->getTimestamp();
    $samara_midnight = $initial->copy()->timezone('Europe/Samara')->startOfDay()->getTimestamp();


    Еще нужно понимать, что в том коде что у вас под "этим днем" подразумевается день в часовом поясе UTC. Если вас интересует день в другом часовом поясе, нужно делать по-другому.

    Я бы советовал заменить createFromTimestamp на createFromTimestampUtc - так поведение скрипта будет более прозрачно/очевидно. Хотя, фактически оно не изменится, но если, допустим, кто-то будет дебажить его может получиться "странная" ситуация. Если запустить код в phpio.net/tools/carbon

    echo '<br />';require 'Carbon/Carbon.php';
    use Carbon\Carbon;
    
    $initial = Carbon::createFromTimestamp(0);
    echo "{$initial} {$initial->tzName}<br />";
    $samara = $initial->copy()->timezone('Europe/Samara')->startOfDay();
    echo "{$samara} {$samara->tzName}<br />";
    
    $initial = Carbon::createFromTimestampUtc(0);
    echo "{$initial} {$initial->tzName}<br />";
    $samara = $initial->copy()->timezone('Europe/Samara')->startOfDay();
    echo "{$samara} {$samara->tzName}<br />";


    его вывод будет таким:


    1969-12-31 18:00:00 US/Central
    1970-01-01 00:00:00 Europe/Samara
    1970-01-01 00:00:00 +00:00
    1970-01-01 00:00:00 Europe/Samara


    И если бы выводилось только время, без часового пояса, оно могло бы смутить в первом случае, так как даты не совпадают.
    Ответ написан
    4 комментария
  • Есть ли приложение/программа аналог MyLifeOrganized с функцией древовидных задач?

    Lobotomist
    @Lobotomist
    Software Developer
    Попробуйте ToDoList - десктопное приложение с функцией учета времени.
    Ответ написан
    Комментировать
  • Почему composer создает папку .git?

    Lobotomist
    @Lobotomist
    Software Developer
    Это описано в документации composer install:

    Есть два способа скачивания пакета - source и dist. По умолчанию, используется dist для стабильных версий и source для остальных. Так как вы устанавливаете из репозитория - используется способ source.
    Попробуйте аргумент --prefer-dist
    Ответ написан
    Комментировать
  • MongoDB GridFS PHP - как прочитать пример?

    Lobotomist
    @Lobotomist
    Software Developer
    Команду можно разделить на части, чтобы проще было разбираться.

    Получаем объект коннекта к базе (MongoDB\Client)
    $connection = new MongoDB\Client;

    Получаем объект MongoDB\Database для работы с конкретной БД. Тут используется магический метод __get, в документации написано:
    Selects a database on the server. This magic method is an alias for the selectDatabase() method.

    То есть следующие команды делают одно и тоже.
    $database = $connection->example;
    $database = $connection->selectDatabase("example");


    Ну и теперь получаем объект MongoDB\GridFS\Bucket для работы с хранилищем файлов в базе $database
    $bucket = $database->selectGridFSBucket();

    Возможно, я как-то не так понял, в чем ваша проблема - так что задавайте доп. вопросы в комментариях
    Ответ написан
    1 комментарий
  • Как реализовать обработку результатов foreach в PHP?

    Lobotomist
    @Lobotomist
    Software Developer
    Вам стоило бы посмотреть, чему у вас равны переменные на каждом этапе обработки. И тогда вы бы заметили, что $matches[0] хранит в себе строки, а не массивы. И вместо $one[0] вам нужно обращаться к $one.

    preg_match_all( "/(?<=<code>).*?(?=<\/code>)/uis", $content, $matches );
    foreach($matches[0] as $one) {
    	$obr = htmlspecialchars( $one, ENT_QUOTES, 'UTF-8' );
    	$content = str_replace( $one, $obr, $content);
    }
    //</code>


    Еще можно использовать preg_replace_callback. Мне кажется это более логичным.

    $replaceFunc = function($matches) {
    	return htmlspecialchars($matches[0], ENT_QUOTES, 'UTF-8');
    };
    $content = preg_replace_callback("/(?<=<code>).*?(?=<\/code>)/uis", $replaceFunc, $content);
    //</code>


    В конце блоков кода присутствует "< /code>" - похоже, это глюк парсера тостера. Видимо, в связи с < code> внутри регэкспа.

    UPD:
    Ну вот, я только что заметил, что веду себя как некрофил =(
    Ответ написан
    Комментировать
  • Выйти из внутреннего и внешнего цикла на php?

    Lobotomist
    @Lobotomist
    Software Developer
    Если отвечать конкрено на вопрос по выходу из цикла - нужно использовать конструкцию break
    break 2

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

    1. Создал бы ассоциативный массив, где в кач-ве ключей будут почтовые ящики
    2. Прошелся бы по всем файлам, просто устанавливая соответствующим элементам массива какое-нибудь значение, например true.
    3. Записал бы полученную информацию в файл.

    Что-то типа этого (пишу без тестирования - просто чтобы показать принцип)
    // Список файлов для обработки. Получить ты его можешь как угодно, например scandir.
    $files = ['/file1.txt', '/file2.txt'];
    
    $uniqueEmails = [];
    
    foreach ($files as $filePath) {
        $emails = file($filePath);
        foreach($emails as $email) {
            $email = trim($email);
            $uniqueEmails[$email] = true;
        }
    }
    
    $uniqueEmails = array_keys($uniqueEmails);
    $uniqueEmails = implode("\n", $uniqueEmails);
    file_put_contents('/out.txt', $uniqueEmails);
    Ответ написан
    3 комментария
  • Сравнение времени в строковых переменных на JS?

    Lobotomist
    @Lobotomist
    Software Developer
    Ну суть такая: Создать одинаковые объекты даты, установить каждому требуемое время, посчитать дифф.
    Топорный вариант без использования сторонних библиотек:

    var date1 =  new Date();
    date1 = date1.setHours.apply(date1, "18:20".split(":"));
    var date2 =  new Date();
    date2 = date2.setHours.apply(date2, "20:21".split(":"));
    var diff = date2 - date1;
    Ответ написан
    Комментировать
  • Как выбрать строку до определенных символов?

    Lobotomist
    @Lobotomist
    Software Developer
    Нужную последовательность нужно сгруппировать с помощью скобок. Конструкция (?=) означает, что то, что в скобках не будет являться частью найденного совпадения.
    ^.+(?=\s\w)

    Можно сделать так:
    ^(.+)\s\w
    Но в этом случае интересующая вас часть строки будет в первой группе, а полное совпадение будет вместе с пробелом и буквой на конце.

    Рекомендую два сервиса, в которых удобно проверять регулярные выражения:
    * pcre.ru (пример для вашего случая)
    * regex101.com
    Ответ написан
    Комментировать