Pull to refresh
4
0
Алексей @Alexey191295

User

Send message

Начинание отличное, но зачем же останавливаться на полпути? 🙃

1. Берём pre-commit.

Да, он написан на питоне, а не на расте, но на что только не пойдёшь ради чистого и собирающегося кода, можно даже переквалифицироваться из питон-разработчка в раст-разработчика.
Делаем pre-commit install - это создаёт хук .git/hooks/pre-commit, который будет впоследствии автоматически запускать pre-commit run на изменённые файлы.
Делаем pre-commit sample-config > .pre-commit-config.yaml - это создаёт конфиг с набором дефолтных хуков, которыми pre-commit "из коробки" готов проверять изменённые файлы:

repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
  rev: v3.2.0
  hooks:
  - id: trailing-whitespace
  - id: end-of-file-fixer
  - id: check-yaml
  - id: check-added-large-files
  • trailing-whitespace будет ругаться на строчки, оканчивающиеся пробелами, и эти пробелы стирать. Полезно, потому что не во всех редакторах это включено по-умолчанию, или вообще присутствует как класс.

  • end-of-line-fixer будет ругаться, если в каком-то файле забыли добавить \n в конец (привет винда!), или наоборот насовали слишком много \n\n\n\n - и тоже добавлять-стирать нужное.

  • check-yaml будет проверять изменённые в коммите YAML-файлы на синтаксическую корректность.

  • check-added-large-files будет давать по шапке за попытку закоммитить в репозиторий бинарный суп на 10+ мегабайт - для такого боги даровали нам Git-LFS, Artifactory, Nexus или простихоспаде файлопомойки вроде SFTP/NFS/SMB.

Если хочется ещё - можно докинуть в список, например, check-merge-conflict - оно не даст случайно добавить в коммит "сломаный" после неудачного мержа файл с кучей >>> === <<<.
Если что-то кажется лишним - можно убрать.

2. Подключаем "плагин" для проверки проектов на Rust.

На изкоробочном функционале далеко не уедешь - да это и не требуется, поскольку pre-commit рассчитан на активное переиспользование чужого кода с гитхаба:

- repo: https://github.com/doublify/pre-commit-rust
  rev: v1.0
  hooks:
  - id: cargo-check
  - id: clippy
  - id: fmt

(содержимое репозитория pre-commit-rust настолько тривиально, что его можно было бы переписать с нуля - но пока более интересна сама возможность с лёгкостью притащить чужое)

Чем это отличается от описанного в статье (помимо отсутствия cargo test)? Тремя важными нюансами:

  • pre-commit работает только с изменениями, претендующими на коммит. Если часть изменений в main.rs добавлена в staged, а часть нет - из-за интерактивного git add, или вы просто дописали в файл что-то новенькое после стейджа - pre-commit автоматически спрячет "лишнее" через git stash. Это позволяет избежать дурацких ситуаций, когда текущий файл сам по себе норм - но в стейдж например забыли добавить блок с новой функцией.

  • Автор в хуке делает леденящее cargo fmt && git add ., которое не только похерит возможность использования git add --interactive (как уже писали выше), но и будет добавлять в коммит остальные файлы из рабочей директории, даже если вы их не помечали через git add. В свою очередь, pre-commit после git stash считает хук провалившимся как если он вернул ненулевой код, так и если после работы хука в репозитории появились not staged файлы - это именно то, что мы имеем с cargo fmt.

  • Большая часть хуков в pre-commit срабатывают только на изменённые файлы определённого типа. Так, хук fmt дёргает cargo fmt -- <changed rust files>: это означает, что во-первых, если форматирование поехало где-то в другой части проекта, ложно-положительных ошибок мы не получим, а во-вторых, если в коммите не трогается код на расте (а например редактируется сугубо README.md - то и растовские хуки срабатывать не будут. Справедливости ради, cargo check и cargo clippy не имеют режима анализа только одного файла - так что с ними проверка будет "полная".

3. Добавляем в pre-commit собственные хуки.

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

- repo: local
  hooks:
  - id: cargo-test
    name: run Rust tests
    description: Why not?
    entry: cargo test
    language: system
    types: [rust]
    pass_filenames: false

Хоп, и теперь он будет вызывать содержимое entry как обычный процесс (благодаря language=system) всякий раз, когда в потенциальном коммите изменяются rust-файлы. Вместо types: [rust] можно также указать files: <regex>.
По умолчанию pre-commmit передаёт в хук пути до изменённых файлов - но в нашем случае cargo test some/changed/file.rs просто скажет, что running 0 tests, test result: ok. 0 passed; 0 failed; 3 filtered out; поэтому мы велим вызывать команду как она есть, не скармливая в неё файлы.
Аналогично можно будет запускать какой-нибудь самописный tools/linter.sh, который припасён у вас в репозитории.

Большинство плагинов для pre-commit пишутся из расчёта на то, чтобы вызываться pre, собственно, commit - но сама тулза поддерживает ещё и pre-rebase, pre-push и так далее. Если у вас слишком много тестов, их можно вызывать только перед пушем - для этого в описание хука надо добавить stages: [push] (работает и для изкоробочных, и для сторонних, и для локальных хуков), а в самое начало конфига рядом с repos: - добавить default_install_hook_types: [pre-commit, pre-push] и вызвать pre-commit install ещё разок.

4. Добавляем pre-commit в CI.

Хуки в гите работают на доверии и добровольческой основе. Любой зашедший с улицы Васян после git clone получит чистую папку .git/hooks/ и сможет радостно коммитить несобирающийся код с лишними пробелами и переносами строк. И даже если пан Васян соизволят вызвать у себя pre-commit install для инициализации .git/hooks/pre-commit, это не помешает им позже сказать "у меня лапки!" и сделать git commit --no-verify, послав далеко и надолго простыню непонятных ошибок. Едиинственное, что остановит Васяна - разработка через пулл-реквесты и правильно настроенная система Continuous Integration.

Самый простой вариант - иметь один и тот же набор проверок и "на клиенте" и "на сервере". Благо pre-commit может запускаться не только на списке файлов из staged, но и на всех файлах целиком pre-commit run --all-files), и даже на изменённых файлах из указанного промежутка между коммитами (pre-commit run --from-ref=... --to-ref=....
На условном Github Actions это можно сделать так:

name: pre-commit

on:
  push:
    branches: [ "main" ]
  pull_request:
    branches: [ "main" ]

env:
  CARGO_TERM_COLOR: always

jobs:
  lint:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
    - name: pre-commit linters
      run: |
        set -ex
        pip install pre-commit
        # github does not have branch names, but BASE_REF is a name, not a commit SHA
        git fetch
        if [ -n "$GITHUB_BASE_REF" ]; then
          # this is a PR - check only changed files
          pre-commit run \
            --verbose \
            --show-diff-on-failure \
            --from-ref=${{ github.event.pull_request.base.sha }} \
            --to-ref=${{ github.event.pull_request.head.sha }}
        else
          # this is a push to main - check everything
          pre-commit run \
            --verbose \
            --show-diff-on-failure \
            --all-files
        fi

Это не значит, что ваш CI всегда должен плясать от pre-commit; о "правильной настройке" CI, особенно на больших проектах, можно вообще писать статьи и книги. Просто любая автоматизация проверок будет лучше, чем никакой автоматизации.

думаю, там тупо экономили:
низкосортного строительного песка

У песка невысокая теплоёмкость, впятеро ниже, чем у воды. Потому приходится на то же количество тепла нагревать его до больших температур, а потери, как известно, нелинейны…
Попробуйте менее известную игру Opus Magnum (есть в стиме, вроде бесплатно)
Заголовок спойлера
image


Это не командная, но тоже вполне даже на логику. Есть задачки на быстро, есть задачки и на пару дней.
Лучше уж тогда все игры от Зактроников. Хотя зависит от языка программирования.

Интересно было бы сравнить с решением на основе NeRF-W — судя по всему, это как раз задача, которую NeRF решает легко.

Typescript + React + MobX с самого начала и будет вам счастье и масштабирование до бесконечности без головной боли. Причем React надо использовать тупо как View слой, т.е. не использовать его встроенные возможности по управлению состоянием.
Тогда разработка будет доставлять удовольствие, а не боль, страдание и разочарование и ярое желание каждый день переписать всё с нуля или свалить на другой проект, где не было допущено фатальных ошибок в закладывании архитектуры.
Такое впечатление, что на видео интерфейс терминала из Фаллаута.

The external tools we used for this demo are:

cool-retro-term (Filippo Scognamiglio)
[github.com/Swordfish90/cool-retro-term]

no-more-secrets (Brian Barto)
[github.com/bartobri/no-more-secrets]

We thank the authors of these tools for the awesome work.
Ну, руцентр — он давно замечено, что странный.
Когда ICANN увеличил цену на услугу за делегирование домена на 0,5$, руцентр у себя увеличил на 5$.
Всем известная и окончившаяся ничем для руцентра мошенническая (подберите другое слово, если сможете) акция при открытии регистрации домена в зоне.рф — всем, оставившим заявку, пришло письмо с уведомлением о другом претенденте и необходимости повысить оплату для участия в аукционе. Было много шума, но руцентр отделался снижением рейтинга, так и не вернув полученные деньги пользователям.
Последняя фишка, уже позитивная: я им отписался в ноябре, что мне домен.рф не нужен по 900р/год, я собираюсь от них уйти — после чего они тут же снизили цену вдвое. То есть все-таки начало их припекать.

Я ценю Ваш юмор.
В рамках Вашей логики все ДТП с мотоциклистом "в междурядье" по факту наблюдения автоматически доказывают вину мотоциклиста из-за несоблюдения безопасного бокового интервала (столкновение-то произошло).
А если серьезно — то даже если ДТП не было, то не значит, что безопасный интервал соблюден. Соблюден безаварийный интервал, который позволил избежать ДТП при опасной манере езды.
Мне хотелось бы, чтобы все мотоциклисты поняли одну простую вещь: с той степенью защиты, которая у них есть, им противопоказано нарушать ПДД. А еще лучше вести себя как пешеходы: даже если водитель авто неправ, нужно уметь избегать опасности. Ибо живым быть лучше, чем правым, но калекой или мертвым.
Если на авто не следовать правилу ДДД, то можно не вылезать из ремонтов.

Лично мне не жалко конечно, но что если нужно прикинуть ensi для поддомена? Делать ещё один поддомен поддомена с типом txt? А если хочешь иметь поддомен ensi.example.com, тогда делать txt для ensi.ensi.example.com? Тогда TXT ensi.example.com должен будет отвечать за example.com, а ensi.ensi за ensi.example.com, и со стороны выглядит как костыль.
Он обрабатывается. Девушка-психологиня написала просто «замкнутый-неконтактный тип, презирающий окружащих. Не рекомендую к взятию». У меня в школе был такой тест ))), классе в 7-8. Но кто такой тест придумал для взрослых людей при приеме на работу… ему самому нужно тест с кубиками-шарами-пирамидками пройти

По моему мнению, это ужасная рекомендация.


От себя бы для избавления от акцента я бы рекомендовал "матричный метод замяткина".
Схема такая — берете короткий аудио диалог носителей языка (без музыки и посторонних шумов) и очень долго слушаете его на повторе. Часами. Нужное количество дней подряд.
До тех пор, пока не услышите там все звуки и не сможете громко произнести эти звуки точно так же как в записи.
Вначале вам мозг будет отфильтровывать часть звуков, которых нет в родном вам языке, иногда они буду звучать как какой то шум случайно попавший в запись, но потом вы поймете этот звук как часть слова.


К тому моменту как я про него узнал, ангийский у меня был уже из фильмов загружен, но таки пару звуков новых я услышал.


Матрицы в mp3 можно на рутрекере скачать, ну или даже купить у автора оригинальные.


В гугле спрашивать "матрица английского языка по методу замяткина"

И клон какой классики Factorio, например?
This War of Mine — кого копирует?
Anno — клон чего кроме самого Anno ранних версий?
FTL?
Plague Inc?
Если в лаборатории нет кофемашины, сгодится и такой метод.

От перечисленных выше отличается высоким качеством получаемого напитка :)

И еще


Не надо много тысяч слов для чтения в оригинале. Не выбирайте британских классиков, читайте Чака Паланика или Дрю Карпишина.

После одной книги, адаптированной по методу Ильи Франка (оригинал + перевод с небольшими пояснениями), я теперь читаю художественную литературу спокойно. На неё я убил, правда почти два месяца, потому что Джером К. Джером, как раз один из британских классиков, но словарный запас пополнился очень мощно.
До этого прочитал пару книг неадаптированных, было тяжело из-за необходимости лазить в словарь по N раз на странице. Но даже этот тяжёлый формат сильно практичнее повлиял на расширение словарного запаса, чем заучивание слов.
Кстати, ряд слов я научился воспринимать и понимать не переводя, просто по контексту (he nodded, he shook his head..). А с некоторых пор стал использовать толковый словарь для ряда слов, особенно если не спешу. Потому что корректный перевод не всегда возможен.

Заучивание слов (использовал карточки, мобильные приложения и Lingua Leo) — самый бесполезный и непродуктивный вариант освоения языка. 90% забывается ввиду неиспользования и отрыва от контекста. И как тут уже не раз заметили в комментариях, заучивание слов по карточкам почти не помогает распознавать их в речи и использовать при письме (потому что не дают представления о грамматике и формах использования). Я уж молчу про всякие «Every now and then» и «fooling around»

В своё время изложил свой опыт изучения английского в статье "Как выучить английский если вы интроверт"
Еще была такая мозговыносительная игра: Stunt Car Racer.

Stunt Car Racer — видео-игра автосимулятор 4-го поколения, разработанная Geoff Crammond и опубликованная компанией MicroStyle в 1989 году. Гоночная трасса выполнена в простой 3D-графике.

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

Видео

UFO landed and left these words here

Information

Rating
Does not participate
Location
Серов, Свердловская обл., Россия
Date of birth
Registered
Activity