Pull to refresh
40
0
Павлов Николай Александрович @ZyXI

Инженер

Send message
ReST без sphinx рассматривать смысла не имеет. Sphinx же имеет множество возможностей, включая конвертацию форматов, и очень расширяем: вы вполне можете даже добавить поддержку не-ReST формата, если очень нужно (к примеру, есть дополнения для взятия информации из XML файла от DOxygen), или немного подправить результат, выдаваемый autodoc. Я сам писал код, который делает man странички из кода, использующего argparse.

Правда, значительная часть встроенных возможностей заточена под Python, но из-за расширяемости можно приспособить sphinx для чего угодно.
Проблемы при изменении порядка запуска тестов никак не относятся к свойству повторяемости, они относятся к свойству независимости.
Интересно, а кому пришла в голову идея, что пользователям не нужно писать более одной строчки в «What did you expect to happen» и «What actually happened»? Для описания этой конкретной проблемы мне нужно запихать во второе поле несколько строчек с ошибкой, а приходится писать всё в «Describe (in steps) how to reproduce the bug».
А я устанавливаю Vivaldi из portage, и получаю вот такую ошибку:
!!! Fetched file: Vivaldi_TP2_1.0.94.2_amd64.deb VERIFY FAILED!
!!! Reason: Filesize does not match recorded size
!!! Got:      40983162
!!! Expected: 40985784


Насколько я понимаю, это означает, что вы изменили загружаемый файл после того, как maintainer vivaldi ebuild его прохэшировал. Не делайте так.
По поводу «где они могут быть изменены» всё правильно. Но куча не участвует в деле в любом случае. Так что не «наоборот», но поправить нужно.
Ну и там не просто чудо‐синтаксис. В fish нет встроенной математики (кроме test с -eq и пр., но на этом далеко не уедешь) (math использует bc), поэтому я даже не пытался сконструировать что‐то вроде for (( I=0; I < 1000000; I++ )).

Кстати, чудо‐синтаксис zsh:
zsh -c '() for i { [[ "$1" = "123" ]] && echo ok } $(seq 10)'  0,00s user 0,00s system 0% cpu 0,010 total
zsh -c '() for i { [[ "$1" = "123" ]] && echo ok } $(seq 100)'  0,00s user 0,00s system 0% cpu 0,013 total
zsh -c '() for i { [[ "$1" = "123" ]] && echo ok } $(seq 1000)'  0,00s user 0,00s system 0% cpu 0,011 total
zsh -c '() for i { [[ "$1" = "123" ]] && echo ok } $(seq 10000)'  0,14s user 0,00s system 94% cpu 0,149 total
zsh -c '() for i { [[ "$1" = "123" ]] && echo ok } $(seq 100000)'  10,96s user 0,02s system 99% cpu 10,985 total
zsh -c '() for i { [[ "$1" = "123" ]] && echo ok } $(seq 125000)'  21,10s user 0,04s system 99% cpu 21,164 total
zsh -c '() for i { [[ "$1" = "123" ]] && echo ok } $(seq 150000)'  32,82s user 0,02s system 100% cpu 32,831 total
zsh -c '() for i { [[ "$1" = "123" ]] && echo ok } $(seq 175000)'  43,93s user 0,16s system 99% cpu 44,128 total
zsh -c '() for i { [[ "$1" = "123" ]] && echo ok } $(seq 200000)'  70,21s user 0,14s system 100% cpu 1:10,35 total


Где‐то в обработке функций (чудо‐синтаксис представляет из себя анонимную функцию с одной командой (циклом for, записанным в сокращённой форме) и аргументами) явно забыли что‐то плохое.
[ ] у меня работает стабильно не быстрее во всех оболочках. Впрочем, я не люблю и предпочитаю не использовать ни [[ ]], ни [ ].
% for sh in bb posh dash zsh bash mksh ksh ; do eval time $sh -c '''for i in $(seq 1000000); do [ "$1" = "123" ] && echo ok ; done''' ; done
bb -c 'for i in $(seq 1000000); do [ "$1" = "123" ] && echo ok ; done'  2,85s user 0,23s system 104% cpu 2,942 total
posh -c 'for i in $(seq 1000000); do [ "$1" = "123" ] && echo ok ; done'  2,69s user 0,10s system 100% cpu 2,782 total
dash -c 'for i in $(seq 1000000); do [ "$1" = "123" ] && echo ok ; done'  1,76s user 0,05s system 100% cpu 1,807 total
zsh -c 'for i in $(seq 1000000); do [ "$1" = "123" ] && echo ok ; done'  11,66s user 0,60s system 100% cpu 12,244 total
bash -c 'for i in $(seq 1000000); do [ "$1" = "123" ] && echo ok ; done'  7,02s user 0,53s system 100% cpu 7,539 total
mksh -c 'for i in $(seq 1000000); do [ "$1" = "123" ] && echo ok ; done'  3,12s user 0,06s system 100% cpu 3,174 total
ksh -c 'for i in $(seq 1000000); do [ "$1" = "123" ] && echo ok ; done'  1,05s user 0,05s system 99% cpu 1,105 total
При использовании seq ksh быстрее всех:
% for sh in bb posh dash zsh bash mksh ksh ; do eval time $sh -c '''for i in $(seq 1000000); do test "$1" = "123" && echo ok ; done''' ; done
bb -c 'for i in $(seq 1000000); do test "$1" = "123" && echo ok ; done'  2,80s user 0,17s system 105% cpu 2,818 total
posh -c 'for i in $(seq 1000000); do test "$1" = "123" && echo ok ; done'  2,51s user 0,19s system 100% cpu 2,689 total
dash -c 'for i in $(seq 1000000); do test "$1" = "123" && echo ok ; done'  1,39s user 0,09s system 100% cpu 1,470 total
zsh -c 'for i in $(seq 1000000); do test "$1" = "123" && echo ok ; done'  11,39s user 0,64s system 100% cpu 12,020 total
bash -c 'for i in $(seq 1000000); do test "$1" = "123" && echo ok ; done'  6,87s user 0,28s system 100% cpu 7,144 total
mksh -c 'for i in $(seq 1000000); do test "$1" = "123" && echo ok ; done'  2,40s user 0,01s system 100% cpu 2,403 total
ksh -c 'for i in $(seq 1000000); do test "$1" = "123" && echo ok ; done'  1,02s user 0,07s system 99% cpu 1,092 total


При использовании {N..M} ksh почему‐то медленнее, но всё равно быстрее всех:
% for sh in ksh zsh bash ; do eval time $sh -c '''for i in {1..1000000}; do test "$1" = "123" && echo ok ; done'''; done
ksh -c 'for i in {1..1000000}; do test "$1" = "123" && echo ok ; done'  2,53s user 0,08s system 99% cpu 2,621 total
zsh -c 'for i in {1..1000000}; do test "$1" = "123" && echo ok ; done'  4,20s user 0,38s system 99% cpu 4,589 total
bash -c 'for i in {1..1000000}; do test "$1" = "123" && echo ok ; done'  6,42s user 0,42s system 99% cpu 6,850 total
, тогда как остальные быстрее, чем с seq.

А вот с {N..M} и [[ ]] у всех выигрывает zsh:
for sh in ksh zsh bash ; do eval time $sh -c '''for i in {1..1000000}; do [[ "$1" = "123" ]] && echo ok ; done'''; done
ksh -c 'for i in {1..1000000}; do [[ "$1" = "123" ]] && echo ok ; done'  1,95s user 0,14s system 99% cpu 2,104 total
zsh -c 'for i in {1..1000000}; do [[ "$1" = "123" ]] && echo ok ; done'  1,47s user 0,03s system 99% cpu 1,510 total
bash -c 'for i in {1..1000000}; do [[ "$1" = "123" ]] && echo ok ; done'  3,78s user 0,08s system 99% cpu 3,866 total
А ksh всё равно, test там или [[ ]].

Ну и последний вариант, где ksh всех бьёт: seq и [[ ]]:
% for sh in mksh ksh zsh bash ; do eval time $sh -c '''for i in $(seq 1000000); do [[ "$1" = "123" ]] && echo ok ; done'''; done
mksh -c 'for i in $(seq 1000000); do [[ "$1" = "123" ]] && echo ok ; done'  1,47s user 0,02s system 100% cpu 1,481 total
ksh -c 'for i in $(seq 1000000); do [[ "$1" = "123" ]] && echo ok ; done'  0,69s user 0,05s system 97% cpu 0,759 total
zsh -c 'for i in $(seq 1000000); do [[ "$1" = "123" ]] && echo ok ; done'  8,89s user 0,16s system 100% cpu 9,041 total
bash -c 'for i in $(seq 1000000); do [[ "$1" = "123" ]] && echo ok ; done'  4,25s user 0,10s system 100% cpu 4,343 total


Если что, то bb — это то же самое, что busybox ash. (Кстати, у busybox есть и другой вариант оболочки — hush. Последний раз, когда я её пробовал, она валилась при попытке совместного использования с powerline. Я не знаю, есть ли hush в релизе, но у меня в системном busybox её нет точно.)
Медленнее может быть из-за seq (внешняя команда).
Я специально сделал отдельной строкой time fish -c "set s (seq 1000000)": именно затем, чтобы вы не считали, что здесь виноват seq.
Кстати, в fish эти операции медленнее на порядок, хотя вроде test тоже builtin (но вот ни математики, ни {N..M} нету):
% time fish -c 'for i in (seq 1000000) ; test "$1" = "123" ; and echo ok ; end'
fish -c 'for i in (seq 1000000) ; test "$1" = "123" ; and echo ok ; end'  40,67s user 2,16s system 99% cpu 42,964 total
% time fish -c "set s (seq 1000000)"
fish -c "set s (seq 1000000)"  3,25s user 0,26s system 97% cpu 3,616 total
.

Замечу, что time ( for i in {1..1000000}; do /usr/bin/\[ "$1" = "123" \] && echo ok; done ), запущенная в zsh во время написания предыдущего комментария, до сих пор не завершилась.
В zsh примерно то же самое, но хуже:
% time ( for i in {1..10000}; do [[ "$1" = "123" ]] && echo ok; done )
( for i in {1..10000}; do; [[ "$1" = "123" ]] && echo ok; done; )  0,01s user 0,00s system 54% cpu 0,018 total
% # ^^^^^^ Слишком быстро, нужно увеличить число итераций
% time ( for i in {1..1000000}; do [[ "$1" = "123" ]] && echo ok; done )
( for i in {1..1000000}; do; [[ "$1" = "123" ]] && echo ok; done; )  1,48s user 0,01s system 99% cpu 1,500 total
% time ( for i in {1..1000000}; do [ "$1" = "123" ] && echo ok; done )
( for i in {1..1000000}; do; [ "$1" = "123" ] && echo ok; done; )  4,13s user 0,64s system 99% cpu 4,785 total
% time ( for i in {1..1000000}; do test "$1" = "123" && echo ok; done )
( for i in {1..1000000}; do; test "$1" = "123" && echo ok; done; )  4,43s user 0,33s system 99% cpu 4,767 total


: разница в четыре раза. Но работает zsh в целом быстрее: худшее время zsh (сравнивается первая цифра от zsh и real от bash) соответствует лучшему времени bash:
# time for i in {1..1000000}; do [ "$1" = "123" ] && echo ok; done

real    0m7.674s
user    0m7.310s
sys     0m0.370s
# time for i in {1..1000000}; do [[ "$1" = "123" ]] && echo ok; done

real    0m4.187s
user    0m4.130s
sys     0m0.060s
# time for i in {1..1000000}; do test "$1" = "123" && echo ok; done

real    0m7.515s
user    0m7.240s
sys     0m0.280s
А можно ли поддержать XDG base directory specification полностью? А то я вижу в ~/.config/vivaldi какие‐то socket’ы и что‐то ещё явно для предотвращения повторного запуска браузера (Sigletone*), а это явно должно быть в $XDG_RUNTIME_DIR с чем‐то вроде ~/.run или /tmp/vivaldi-{username} по‐умолчанию (к сожалению, XDG BDS говорит только о том, что вы должны использовать каталог со схожими свойствами без конкретных указаний на его расположение, но с указанием, что вы должны выводить предупреждение).

Старая Opera, кстати, удаляла мою символическую ссылку на ~/.cache/opera, что мне не нравилось. А у вас уже cache в правильном месте. Вот только GPUCache (~/.config/vivaldi/Default/GPUCache) — нет.
Я в старой Opera пользовался
  • заметками;
  • RSS‐читалкой;
  • отдельными настройками Proxy для отдельных сайтов;
  • блокировщиком рекламы;
  • выделением ссылок;
  • умным Esc (я имею ввиду, что значение Esc менялось в зависимости от контекста, и это было довольно логично);
  • однокнопочными клавиатурными сочетаниями;
  • жестами, работающими практически везде.

Надеюсь, в Vivaldi всё это будет.
Zsh-syntax-highlighting довольно нетороплив (очень заметно, если вам зачем‐то нужно использовать echo long-pasted-string | …) и дюже неточен. Если вы найдёте описание грамматики zsh для pygments, то можно использовать bitbucket.org/ZyX_I/zsh-pygments-highlighting вместе с bitbucket.org/ZyX_I/zpython. Работает намного быстрее, но без грамматики будет работать только пока вы пишете bash‐совместимые команды.
Так статья всё же не реклама Powerline. Снимки экрана есть на github по первой ссылке. Добавил ещё один в статью для пояснения, что же такое rewrite prompt.

Надо бы, кстати, в README добавить снимков экрана, не относящихся к Vim.
При использовании /dev/urandom энтропия ничем не гарантируется. Для гарантий уберите u, получите ГСЧ (без П) (в идеале, реальность зависит от железа и реализации).
Разработчики явно говорят, что оболочка не должна быть настраиваемой: в zsh вы можете иметь эту возможность, а можете не иметь. В fish вы либо будете иметь её всегда, либо не будете иметь никогда, но чего точно не будет, так это настройки CHASE_LINKS.
Кажется, dash — это самая ограниченная из POSIX‐совместимых оболочек. Именно от неё я узнал, что ${var//pat/repl} в POSIX нету: среди busybox ash, ksh, mksh, bash, zsh она единственная кажет Bad substitution на эту конструкцию. Также она единственная, кто не поддерживает $RANDOM.
1. Синтаксис мне тоже не нравиться. Но это не самая большая проблема.
2. В bash и zsh тоже можно настроить всё так, чтобы нужно было экранировать. И лучше так и сделать: иначе вам всегда нужно помнить, что находится в текущем каталоге.

Я его смотрел, но fish слишком ограничен. Часто хочу какую-нибудь возможность из zsh, ан нет её. Даже нельзя сделать $COMMAND args, нужен eval или env. Хотя fish красивый.
Почему взрыв мозга? Такая возможность есть в любом языке, где «всё объект» и «переменные глобальны по-умолчанию». Такое можно и в Python сделать, только вам придётся явно указать в функции foo, что foo — глобальная переменная. Превозмогая трудности (в основном связанные не с тем, как это сделать, а с тем, как спрятать реализацию), можно даже и в C устроить (только лучше не нужно — как минимум, получите отключение ряда оптимизаций).

Главное здесь понимать, что определение функции есть лишь синтаксический сахар для присваивания. И никакого взрыва мозга не будет. Хотя я бы всё же не сказал, что язык с таким количеством разных тонкостей подходит для обучения. В Python 3 такого меньше (в Python 2 вас поприветствуют новые и старые классы и неявные преобразования строк).

Information

Rating
5,645-th
Location
Москва, Москва и Московская обл., Россия
Date of birth
Registered
Activity