При чём здесь тесты, я говорю про код самой ф-и. По спеке от него или будет требоваться валидация входной строки или нет. Если не будет, то не надо сравнивать код на Perl без валидации с кодом на Rust, делающим валидацию. Иначе я на Rust напишу без валидации let total = price.unsafe_parse() * quantity.unsafe_parse() (если уж хочется принимать строку, а не сразу принять int и быть свободным от перлопроблем) и скажу что Rust не сильно и длиннее. Если требуется валидация, то как я уже сказал на стороне перла в споре будет участвовать далеко не однострочник.
Да, только результатом такого превращения обычно становится код, обложенный велосипедами для валидации. И вы возвращаетесь к исходной задаче с Perl vs Rust, только со стороны перла у вас теперь не однострочник, а уже код гм побольше.
Адепты динамической типизации обычно куда-то пропадают, когда речь заходит о:
Больших проектах на миллионы строк со сложной логикой. Отличный пример с $price * $quantity кстати. Сегодня всё работает нормально, завтра вы уволились и никто больше не знает что одна из кор библиотек делает небезопасное умножение строк как чисел, а послезавтра разработчик кода 2 уровнями логики выше (и 10 уровнями выше по стеку вызовов) допустит, нет, не поминаемую вами ошибку типизации с передачей строки вместо инта. Просто ошибку. Но в результате этой ошибки в вашу функцию в качестве $quantity придёт пустая строка, которую Perl спокойно интерпретирует как 0 и вернёт 0. И пустая строка будет приходить не гарантированно, а в определённой фазе луны и в ситуации, не покрытой тестами. Удачи с отладкой.
Разработке библиотек, т.е. о ситуации где вы не знаете в каких условиях будет применяться ваш код и у вас не будет права делать предположения о важности или неважности некорректной работы вашей программы на некорректных входных данных.
То есть вы считаете нормальным пренебрегать функциональной корректностью ради читаемости? Спасибо, это всё, что я хотел знать о динамически типизированных ЯП и неявной типизации.
Да, одна из лучших книг по продвинутому C++... У книги есть неофициальный алиас под которым её и знают (ubbook). Можно сказать критерий успеха, подобно dragonbook итд. Также стиль изложения просто огонь:
Был теплый весенний денек. Попивая чай, я медленно и лениво пролистывал студенческие работы. Я бы мог сказать, что ничего не предвещало беды, но, увы, работы были выполнены на C++.
Это общее название программ для переназначения клавиш софтверным методом. Они более высокоуровневые чем клавиатурный firmware (QMK) и являются прослойкой между драйвером клавиатуры и GUI окном. За другие ОС не скажу, в Linux штатный клавиатурный компонент X.org (XKB) сам умеет переназначать клавиши без помощи стороннего софта, хотя можно и поставить сторонний ремаппер. Именно благодаря XKB нажатие Z печатает или Z или Я - сканкод один и тот же, состояние XKB (активный язык) разное.
Пользоваться примерно так (для простоты делаю ремап только английской раскладки):
PS: Пока копался в конфигах Xorg нашёл там некую русскую раскладку под названием "unipunct" (/usr/share/X11/xkb/symbols/ru) - похоже всё-таки кто-то придумал конфиг с совпадающей пунктуацией ru/en, можете попробовать.
Не понимаю при чём здесь коды клавиш. Ремаперы позволяют задавать печать любого заданного символа для любой тройки <язык, состояние модификаторов, сканкод>. Хотите чтобы у вас в англ. раскладке по Shift+3 печатался № а не # - без проблем, сконфигурируйте в ремапере. Проблема как я уже сказал в том что вы не сможете написать консистентный конфиг, если хотите остаться только в пределах 2 слоёв, основного и Shift, и чтобы позиции всех не буквенных знаков совпадали.
Новый слой как раз эту задачу решит. Сделайте новый модификатор, активирующий этот слой, скажем на Alt+Alt. И в этом новом слое на клавишу 3 ставьте например №, в обеих раскладках. Т.е. в любой раскладке нажать Alt+Alt+3 напечатает №.
чтобы вне зависимости от раскладки клавиатуры можно было вводить, например, № и #
Создайте собственный слой в русской и английской раскладке (один и тот же для обеих раскладок), кладите туда какие хотите символы. Красивого решения (модификация QWERTY и ЙЦУКЕН так, чтобы было 100% совпадение по знакам препинания и не буквенно-цифровым символам на основном и Shift слое) имхо не существует - в QWERTY и ЙЦУКЕН отличаются позиции знаков препинания в буквенной части клавиатуры, таких как точка и запятая, и мне не известно никаких авторитетных раскладок, решающих эту проблему.
Мизинец (точнее, его мясистая обвязка в предплечье) это же просто мышца, её можно накачать и тогда не будет болеть
Если бы всё было так просто, все разработчики и в особенности любители Emacs были бы монстрами с перекачанными запястьями (как у айкидошников) и сильными мизинцами. На деле же имеем RSI, Carpal tunnel syndrome и Emacs pinky syndrome как профзаболевание.
В эргораскладках мизинец для частых действий, повторяющихся действий или зажимания клавиши - это строгое НЕТ.
Так сделал, например, мой приятель: одновременно перешел на раскладку Halmak и добавил два новых слоя, которые назвал RED и BLUE. Вот его проект с ремаппингами для Линукс RedBlue.
Зовите приятеля на хабр тоже писать статьи по эргораскладкам :) По ссылке одна из лучших кастомных модальных раскладок что я видел. Продумана частотность команд, типичные цепочки команд (чтобы они не занимали конфликтующие пальцы), взаимодействие с DE и инструментарием.
Главная проблема - модификаторы не симметричны и по большей части расположены неудобно. Например зелёный модификатор есть только под правую руку - как вы вводите зелёные символы с правой части клавиатуры? "нажатии right cmd стрелочками становились hjkl" - та же проблема, держать модификатор справа от пробела например большим пальцем одноимённой руки и остальными пальцами дотягиваться до hjkl - очень быстро заноет рука
Может уже модальное редактирование? :) Без модальности у вас все действия кроме печатания символов будут делаться в 2 нажатия (модификатор + клавиша).
Что такое синяя команда Vi?
Стрелки жёлтого слоя не согласуются со стрелками красного (или у вас опечатка)
На жёлтом слое нет нуля
Не вижу команд прокрутки (PgUp/PgDn в удобной позиции)
Сила перла не в том что на нём что-то короче, а в том что он использует более-менее идиоматичный C-подобный синтаксис и синтаксис регекспов, и код на нём понятнее чем экзотический синтаксис Awk, который забывается через день после последнего использования. Плюс бесконечное расширение плагинами.
Ну и не сильно длиннее, например взятие 2 столбцов из примера выше:
while (<>) {
chomp;
my @fields = split(/ /);
printf("%s %s\n", $fields[1], $fields[3]);
}
С того, что автору нужен был тип, не владеющий ссылкой, а лишь использующий её для вывода типов? Я показал как сделать вспомогательный тип для этого. Это может быть тип с другим именем, не WakerSlot.
Как всегда 90% времени занимает эпическая битва с борроучекером))
Ох, дофига всего комментировать, но то, что сходу бросается в глаза:
Если вы представите, что WakerSlot содержит ссылку на WakerList, то никогда не сможете создать &mut WakerList где-либо ещё, поскольку основное правило времени жизни в Rust гласит, что у вас может быть либо одна мутабельная ссылка, либо множество иммутабельных, но не то и другое одновременно.
Надеюсь, что такое всё же возможно, и кто-нибудь напишет об этом в комментариях.
А у вас сборка проекта на индивидуальных машинах всегда полная? Каждый пересобирает себе все 27 тыс файлов? Не думали зашарить например на команду дневные бинарные билды и пусть разработчики качают их себе и пересобирают локально только свои компоненты?
Эм я правильно понимаю что эта VM способна выполнять только свои опкоды и не может вызвать например библиотечную ф-ю через POSIX ABI, тк для этого придётся потерять контроль над регистрами и стеком?
При чём здесь тесты, я говорю про код самой ф-и. По спеке от него или будет требоваться валидация входной строки или нет. Если не будет, то не надо сравнивать код на Perl без валидации с кодом на Rust, делающим валидацию. Иначе я на Rust напишу без валидации let total = price.unsafe_parse() * quantity.unsafe_parse() (если уж хочется принимать строку, а не сразу принять int и быть свободным от перлопроблем) и скажу что Rust не сильно и длиннее. Если требуется валидация, то как я уже сказал на стороне перла в споре будет участвовать далеко не однострочник.
Да, только результатом такого превращения обычно становится код, обложенный велосипедами для валидации. И вы возвращаетесь к исходной задаче с Perl vs Rust, только со стороны перла у вас теперь не однострочник, а уже код гм побольше.
Адепты динамической типизации обычно куда-то пропадают, когда речь заходит о:
Больших проектах на миллионы строк со сложной логикой. Отличный пример с $price * $quantity кстати. Сегодня всё работает нормально, завтра вы уволились и никто больше не знает что одна из кор библиотек делает небезопасное умножение строк как чисел, а послезавтра разработчик кода 2 уровнями логики выше (и 10 уровнями выше по стеку вызовов) допустит, нет, не поминаемую вами ошибку типизации с передачей строки вместо инта. Просто ошибку. Но в результате этой ошибки в вашу функцию в качестве $quantity придёт пустая строка, которую Perl спокойно интерпретирует как 0 и вернёт 0. И пустая строка будет приходить не гарантированно, а в определённой фазе луны и в ситуации, не покрытой тестами. Удачи с отладкой.
Разработке библиотек, т.е. о ситуации где вы не знаете в каких условиях будет применяться ваш код и у вас не будет права делать предположения о важности или неважности некорректной работы вашей программы на некорректных входных данных.
То есть вы считаете нормальным пренебрегать функциональной корректностью ради читаемости?
Спасибо, это всё, что я хотел знать о динамически типизированных ЯП и неявной типизации.
Да, одна из лучших книг по продвинутому C++... У книги есть неофициальный алиас под которым её и знают (ubbook). Можно сказать критерий успеха, подобно dragonbook итд.
Также стиль изложения просто огонь:
https://github.com/Nekrolm/ubbook/blob/master/lifetime/unexpected_mutability.md
Где-то в недрах кода o3:
Это общее название программ для переназначения клавиш софтверным методом. Они более высокоуровневые чем клавиатурный firmware (QMK) и являются прослойкой между драйвером клавиатуры и GUI окном. За другие ОС не скажу, в Linux штатный клавиатурный компонент X.org (XKB) сам умеет переназначать клавиши без помощи стороннего софта, хотя можно и поставить сторонний ремаппер. Именно благодаря XKB нажатие Z печатает или Z или Я - сканкод один и тот же, состояние XKB (активный язык) разное.
Пользоваться примерно так (для простоты делаю ремап только английской раскладки):
После этого:
-Как перезабить в английской раскладке Shift+3 с # на №:
-Как создать в англ. раскладке третий слой на Alt+Alt и привязать символ № к клавише "3" на этом слое:
И так далее.
PS: Пока копался в конфигах Xorg нашёл там некую русскую раскладку под названием "unipunct" (/usr/share/X11/xkb/symbols/ru) - похоже всё-таки кто-то придумал конфиг с совпадающей пунктуацией ru/en, можете попробовать.
Не понимаю при чём здесь коды клавиш. Ремаперы позволяют задавать печать любого заданного символа для любой тройки <язык, состояние модификаторов, сканкод>. Хотите чтобы у вас в англ. раскладке по Shift+3 печатался № а не # - без проблем, сконфигурируйте в ремапере. Проблема как я уже сказал в том что вы не сможете написать консистентный конфиг, если хотите остаться только в пределах 2 слоёв, основного и Shift, и чтобы позиции всех не буквенных знаков совпадали.
Новый слой как раз эту задачу решит. Сделайте новый модификатор, активирующий этот слой, скажем на Alt+Alt. И в этом новом слое на клавишу 3 ставьте например №, в обеих раскладках. Т.е. в любой раскладке нажать Alt+Alt+3 напечатает №.
Создайте собственный слой в русской и английской раскладке (один и тот же для обеих раскладок), кладите туда какие хотите символы.
Красивого решения (модификация QWERTY и ЙЦУКЕН так, чтобы было 100% совпадение по знакам препинания и не буквенно-цифровым символам на основном и Shift слое) имхо не существует - в QWERTY и ЙЦУКЕН отличаются позиции знаков препинания в буквенной части клавиатуры, таких как точка и запятая, и мне не известно никаких авторитетных раскладок, решающих эту проблему.
В целом да, положение cmd более эргономично чем ctrl, тк она нажимается большим пальцем а не мизинцем.
Если бы всё было так просто, все разработчики и в особенности любители Emacs были бы монстрами с перекачанными запястьями (как у айкидошников) и сильными мизинцами. На деле же имеем RSI, Carpal tunnel syndrome и Emacs pinky syndrome как профзаболевание.
В эргораскладках мизинец для частых действий, повторяющихся действий или зажимания клавиши - это строгое НЕТ.
Зовите приятеля на хабр тоже писать статьи по эргораскладкам :) По ссылке одна из лучших кастомных модальных раскладок что я видел. Продумана частотность команд, типичные цепочки команд (чтобы они не занимали конфликтующие пальцы), взаимодействие с DE и инструментарием.
Неплохо, но есть куда расти:
Главная проблема - модификаторы не симметричны и по большей части расположены неудобно. Например зелёный модификатор есть только под правую руку - как вы вводите зелёные символы с правой части клавиатуры? "нажатии right cmd стрелочками становились hjkl" - та же проблема, держать модификатор справа от пробела например большим пальцем одноимённой руки и остальными пальцами дотягиваться до hjkl - очень быстро заноет рука
Может уже модальное редактирование? :) Без модальности у вас все действия кроме печатания символов будут делаться в 2 нажатия (модификатор + клавиша).
Что такое синяя команда Vi?
Стрелки жёлтого слоя не согласуются со стрелками красного (или у вас опечатка)
На жёлтом слое нет нуля
Не вижу команд прокрутки (PgUp/PgDn в удобной позиции)
Ящетаю надо также отменить некое известное аниме, где глава титульного государства именуется не много не мало "Fuhrer".
Сила перла не в том что на нём что-то короче, а в том что он использует более-менее идиоматичный C-подобный синтаксис и синтаксис регекспов, и код на нём понятнее чем экзотический синтаксис Awk, который забывается через день после последнего использования. Плюс бесконечное расширение плагинами.
Ну и не сильно длиннее, например взятие 2 столбцов из примера выше:
Я слышал прогрессивная молодёжь нынче на модный аналог sed/awk перешла, называется Perl!
С того, что автору нужен был тип, не владеющий ссылкой, а лишь использующий её для вывода типов? Я показал как сделать вспомогательный тип для этого. Это может быть тип с другим именем, не WakerSlot.
Как всегда 90% времени занимает эпическая битва с борроучекером))
Ох, дофига всего комментировать, но то, что сходу бросается в глаза:
Это же в точности std::marker::PhantomData?
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=0275d214fee10f4c7b3bf1077d89c143
А у вас сборка проекта на индивидуальных машинах всегда полная? Каждый пересобирает себе все 27 тыс файлов? Не думали зашарить например на команду дневные бинарные билды и пусть разработчики качают их себе и пересобирают локально только свои компоненты?
Эм я правильно понимаю что эта VM способна выполнять только свои опкоды и не может вызвать например библиотечную ф-ю через POSIX ABI, тк для этого придётся потерять контроль над регистрами и стеком?