Задать вопрос
  • Как сделать автокоммит текстового файла в git при сохранении в Notepad++?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    Можно сделать прямо внутри Notepad++ через плагин PythonScript.

    У PythonScript есть событие NOTIFICATION.FILESAVED, на которое можно повесить git add и git commit. Отдельный watcher или NppExec для этого не нужен.

    Проверил у себя — работает.

    Установка и настройка

    1. Открыть Plugins → Plugins Admin....
    2. Найти PythonScript, отметить его и нажать Install. Notepad++ после установки перезапустится.
    3. Открыть Plugins → PythonScript → Configuration....
    4. Для Initialisation выбрать ATSTARTUP. Заодно полезно включить Automatically open console on error, чтобы ошибки скрипта сразу были видны.
    5. Открыть Plugins → PythonScript → Scripts и startup (User). Если пользовательского startup.py ещё нет — создать через Plugins → PythonScript → New Script файл с именем startup.py.
    6. Вставить в него следующий код и сохранить:


    from Npp import notepad, NOTIFICATION
    import os
    import subprocess
    import datetime
    
    
    def on_save(args):
        filename = notepad.getBufferFilename(args["bufferID"])
        file_dir = os.path.dirname(filename)
    
        try:
            repo = subprocess.check_output([
                "git", "-C", file_dir,
                "rev-parse", "--show-toplevel"
            ]).strip()
        except subprocess.CalledProcessError:
            return
    
        rel_file = os.path.relpath(filename, repo)
    
        subprocess.call([
            "git", "-C", repo,
            "add", "--", rel_file
        ])
    
        changed = subprocess.call([
            "git", "-C", repo,
            "diff", "--cached", "--quiet",
            "--", rel_file
        ])
    
        if changed != 0:
            message = "autosave " + datetime.datetime.now().strftime(
                "%Y-%m-%d %H:%M:%S"
            )
    
            subprocess.call([
                "git", "-C", repo,
                "commit",
                "-m", message,
                "--", rel_file
            ])
    
    
    notepad.callback(on_save, [NOTIFICATION.FILESAVED])


    После перезапуска Notepad++ обработчик будет регистрироваться автоматически.

    При каждом сохранении файла скрипт:

    1. получает путь сохранённого файла;
    2. через git rev-parse --show-toplevel определяет его Git-репозиторий;
    3. добавляет в индекс только этот файл;
    4. создаёт commit, только если содержимое действительно изменилось.


    Если открытый файл находится не в Git-репозитории, ничего не происходит.

    Разумеется, git должен быть установлен и доступен через PATH, а файл должен находиться внутри уже созданного Git-репозитория.

    Есть только один нюанс: стабильная версия PythonScript, устанавливаемая через Plugins Admin, всё ещё использует встроенный Python 2.7. Поэтому скрипт написан без конструкций современных версий Python.

    Если Git нужен только ради истории изменений одного текстового файла, то есть ещё более простой вариант — встроенный в Notepad++:

    Settings → Preferences → Backup → Backup on save → Verbose backup


    Он сохраняет отдельную предыдущую версию файла при каждом сохранении.

    И ещё: локальный Git без push — это история версий, но не полноценный backup. При потере диска вместе с рабочей папкой пропадёт и каталог .git. Если нужна именно резервная копия, репозиторий надо периодически отправлять во внешнее хранилище.
    Ответ написан
    3 комментария
  • Windows 11 - Telegram notifications & sounds, КАК?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Если вы не умеете пользоваться клиентом telegram, то блокировки тут не при чём.
    Проблем с форматированием у официального клиента нет.
    69a1a2f37ae39917722788.png
    Попапы и звуковой сигнал настраиваются для каждого респондента (канала). По умолчанию они включены, так что если не выводятся, то, видимо, вы их выключили.
    Ответ написан
    1 комментарий
  • Куда двигаться дальше senior разработчику? Новый язык, технологии, opensource, стартап?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Java
    Седой и строгий
    Как вы это делаете?! За 17 лет работы в ИТ у меня ни разу не возникало вопроса "Куда двигаться?", только "Где взять времени на освоение всего этого бесконечного изобилия технологий, углублённого изучения уже знакомого и реализацию множества идей?"
    Ответ написан
    4 комментария
  • Как отдавать боту 200 если файла нет?

    Mike_Ro
    @Mike_Ro Куратор тега Поисковая оптимизация
    Python, JS, WordPress, SEO, Bots, Adversting
    Моя проблема в том что если я сбилдил новую версию, у меня новая .cssка и соответственно бот получает 404 на нее, я бы хотел этого избежать.

    Подскажите решения для этого?

    Решение - не страдать хернёй. 404 ошибка по js и css файлам не ухудшает, а 301 редиректы - не улучшает ранжирование.
    Ответ написан
    5 комментариев
  • Где найти драйвера USB 3.0 для Windows 7?

    VoidVolker
    @VoidVolker Куратор тега Windows
    Dark side eye. А у нас печеньки! А у вас?
    Диспетчер устройств -> USB контроллёр -> Свойства -> Сведения -> ИД оборудования / Код экземпляра устройства -> Копировать -> Найти производителя устройства и нужный драйвер в гугле
    Ответ написан
    Комментировать
  • Есть ли в VBA что то похожее на списки python?

    Krasnoarmeec
    @Krasnoarmeec
    Тяжело, наверное умному и красивому, когда в Гугле забанили?
    Вторая ссылка ведёт на Excel VBA Dictionary – A Complete Guide. Со списками - тоже самое - ищите и обрящете.
    Ответ написан
    Комментировать
  • Решил попробовать в написание бота для TG, выходит ошибка RuntimeError?

    Vindicar
    @Vindicar
    RTFM!
    Без агрессии нельзя, это же интернет. Если тут не посылают, значит, что-то стряслось. =)

    Основой асинхронной программы является рабочий цикл (event loop). Он должен быть строго один. Я подозреваю, что у тебя создаётся более одного рабочего цикла, так как ты делаешь несколько вызовов get_event_loop() в придачу к asyncio.run().

    Я бы изменил код следующим образом: пусть класс базы данных принимает пул соединений как параметр конструктора. Аналогично, создай в основном файле глобальную переменную, которая будет хранить экземпляр этого класса. При создании присвой переменной None.

    А вот внутри main() уже делай всё остальное: создай экземпляр пула соединений, создать экземпляр класса БД (и закинь его в глобальную переменную), а потом запускай бота. Тогда у тебя все асинхронные операции будут происходить в рамках одного вызова main(), а значит, гарантированно в одном рабочем цикле.
    Ответ написан
    Комментировать
  • Как правильно сделать привязку данных к динамически созданному элементу в Vue?

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    Если работаешь с vue - тебе не нужно трогать dom руками и наоборот.
    v-html только для статических каких-то данных.

    Вот это вот <b class="aaakjhij" data="hk">jjj!!!!</b> должно быть уже в шаблоне. Если надо по условию - то использовать v-if или v-for если несколько.
    Примерно так:
    <script>
    export default {
      data() {
        return {
          data: 'hk',
          text: 'jjj!!!!',
          show: false
        }
      },
      methods: {
        _jjj(){
          this.show = true
          this.data = 'hk';
          this.text = 'jjj!!!!';
        },
       _kkk(){
          this.data = 'ooooooooooo';
          this.text = 'ha-ha-haaaa!!!'
        }
      }
    }
    </script>
    
    <template>
      <div>
        <b v-if="show" :data="data">{{text}}</b>
      </div>
      <button @click="_jjj">11</button>
      <button @click="_kkk">12</button>
    </template>

    Тебе надо перестать мыслить в jquery и начать мыслить в vue.

    Если всё ещё остаются проблемы - опиши конкретную конечную цель, которой ты хочешь добиться, не в виде кода, а в виде результата и условий.
    Ответ написан
    3 комментария
  • VUE3 option api CDN - почему при загрузке страницы мне пишет сначала {{name}} и только потом имя, как сделать чтобы сразу имя писал?

    Fragster
    @Fragster
    помогло? отметь решением!
    Это потому что сначала грузится html, потом js и потом js исполняется, заменяя шаблоны на значения.
    Можно обойти, пример, с помощью https://vuejs.org/api/built-in-directives#v-cloak
    https://codepen.io/FragsterAt/pen/MWMRGxm

    Еще можно запихнуть всё в в компоненты, в теги <template id="component-id"> в качестве источника шаблона компонента, а уже компоненты поместить в корень приложения (<div id="app"> или что-то подобное) https://codepen.io/FragsterAt/pen/gONyzdJ
    Ответ написан
  • Как реализовать подкомпоненты во vue?

    0xD34F
    @0xD34F Куратор тега Vue.js
    В верхнем компоненте хранится текущее состояние, которое вместе с методом его обновления через provide / inject предоставляется ниже расположенным компонентам. Например.
    Ответ написан
    1 комментарий
  • Vue3 как показать скрыть элемент внутри v-for?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Показываем не более одного - добавляем в компонент свойство, которое будет содержать id, индекс или ещё что-то уникальное для каждого из элементов данных (да хоть бы и ссылку на сам элемент). Показываем скрытое в зависимости от равенства значения этого свойства тому, что доступно в текущей итерации v-for.

    Или, показываем несколько сразу - создаём отдельный компонент, в экземпляры которого будут передаваться элементы данных. Внутри компонента свойство, в зависимости от значения которого (истина-ложь) показываем или скрываем чего там надо.
    Ответ написан
    Комментировать
  • Не могу настроить сетку Bootstrap 5. Где ошибка?

    delphinpro
    @delphinpro
    frontend developer
    Зачем привязка к бутстрапу, если на css вам хватит двух-трех строк кода для описания желаемого?

    мобильники - вообще ничего не делаете. Блоки и так уже идут в столбик.

    Дальше простой запрос

    @media (min-width: 768px) /* ширина по вашему хотению */ {
      .block {  
        display: grid;
        grid-template-columns: repeat(3, 1fr);
      }
      .yellow {
        grid-column: span 3;
      }
    }
    Ответ написан
    Комментировать
  • Как подключиться к WIFI из сайта?

    @deliro
    Напомнило баян с башорга про "драйвера для cd-rom находятся на диске"
    Ответ написан
    Комментировать
  • Как реализовать фильтрацию на vue.js по нескольким параметрам одновременно?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Сделаем описания столбцов, по которым допускается фильтрация, и способов фильтрации - имя, русифицированный вариант имени (чтобы показывать его в select'ах), и, у столбцов, тип данных:

    data: () => ({
      filterColumns: [
        [     'name',        'имя', 'string' ],
        [    'count', 'количество', 'number' ],
        [ 'distance', 'расстояние', 'number' ],
      ],
      operations: [
        [    'equal',    'равно' ],
        [ 'contains', 'содержит' ],
        [  'greater',   'больше' ],
        [     'less',   'меньше' ],
      ],
      ...

    Тип данных указываем потому, что значения различных типов сравниваются по-разному. Кстати, определим, как именно:

    data: () => ({
      types: {
        string: {
          equal: (a, b) => a.toLowerCase() === b,
          contains: (a, b) => a.toLowerCase().includes(b),
          greater: (a, b) => a.toLowerCase() > b,
          less: (a, b) => a.toLowerCase() < b,
        },
        number: {
          equal: (a, b) => a === +b,
          contains: (a, b) => `${a}`.includes(b),
          greater: (a, b) => a > +b,
          less: (a, b) => a < +b,
        },
      },
      ...

    На основе описаний столбцов и способов фильтрации создадим select'ы:

    <select v-model="column">
      <option v-for="n in filterColumns" :value="n[0]">{{ n[1] }}</option>
    </select>
    <select v-model="operation">
      <option v-for="n in operations" :value="n[0]">{{ n[1] }}</option>
    </select>

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

    computed: {
      filteredItems() {
        const { items, column } = this;
        const type = this.filterColumns.find(n => n[0] === column)?.[2];
        const filterFn = this.types[type]?.[this.operation];
        const filterVal = this.filterVal.toLowerCase();
    
        return filterFn && filterVal
          ? items.filter(n => filterFn(n[column], filterVal))
          : items;
      },
      ...

    https://jsfiddle.net/8df3z1un/1/
    Ответ написан
    Комментировать
  • Почему у практически идентичных условий разная скорость проверки?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Могу предположить, что интерпретатор питона не пересчитывает во внутреннем цикле значение target - nums[i], поскольку оно во внутреннем цикле не меняется.
    А значение nums[i] + nums[j] надо пересчитывать каждый раз.
    Ответ написан
    1 комментарий
  • Как правильно составить SQL запрос?

    freeExec
    @freeExec
    Участник OpenStreetMap
    SELECT id, (SELECT SUM(pen.time) FROM penalty WHERE id = penalty.id GROUP BY penalty.id LIMIT 1) AS sum_pen
    FROM user
    Ответ написан
    1 комментарий
  • Пишет два сообщения вместо одного. Что делать?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Запись вида:

    if xxx == ('a' or 'b' or 'c'):

    свидетельствует о полном незнании языка Python. Соответственно, не зная языка, ничего хорошего написать не получится. Великое счастье, что этот код хотя бы не управляет ядерными боеголовками. Начинать надо с азов.
    Ответ написан
    2 комментария
  • Как выбрать все элементы, кроме первого и последнего?

    0xD34F
    @0xD34F Куратор тега CSS
    li:not(:first-child, :last-child)

    или

    li:not(:first-child):not(:last-child)

    или

    li {
      /* тут стили для всех элементов */
    }
    li:first-child,
    li:last-child {
      /* здесь сбрасываете стили, установленные выше */
    }

    https://jsfiddle.net/6zxdwear/
    Ответ написан
    Комментировать
  • Куда выгрузить телеграмм бота?

    DevMan
    @DevMan
    в Гугле забанили да?
    heroku, aws, azure и ещё куча вариантов.
    а если немного "разориться", вариантов вообще охулиард.
    Ответ написан
    Комментировать