Pull to refresh
-14
0.4
Андрей@Octagon77

User

Send message

Если разработчик претендует на лычку мидл+, но не чувствует себя свободно хотя бы в основных пяти парадигмах, — это напыщенный дурак, гоните его в шею.

Есть ли ситуации, где этот совет полезен? Очевидно да, даже не вспоминая про сломанные часы. А вот на сколько это верно - совсем другой вопрос. Ну чувствует человек себя свободно в основных пяти парадигмах (кстати, спиок не приведён) - и что? А ведь ничего...

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

Претензия формулировалась так:

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

Тогда решение не в знании парадигм, а в умении не пользоваться неподходящей парадигмой. А тем, чего не знаешь, и не воспользуешься (just saying). В просторечии - и последние станут первыми, типа.

А как можно получить свободу в пяти парадигмах? Проще всего - заниматься разными задачами. Чтобы быстрее позаниматься разными задачами, удобно побыстрее потерпеть неудачу в каждой. По этой причине в своё время потерпела крах серебрянная пуля "бригада ведущего программиста", примерно современницв бума ООП, предъявлявшая к ведущему программисту требования идентичные знанию пяти парадигм.

Следующий тезис я пересказываю в собственном переводе по памяти о речениях наших западных партнёров.

Если есть три способа, значит ни одного хорошего нет.

Повеселившись, перейдём к инструментам. Автор сам пишет

Но попытка написать на Prolog веб-сервер будет выглядеть как попытка заколотить крота микроскопом.

но, к счастью,

На самом деле, в современном мире все взрослые языки давно стали мультипарадигменными.

Что приводит к мысли, что владние парадигмами эквивалентно полному владению языком программирования, ключевое слово - полному. В мире, где существуют курсы по основам, антониму полноты, Python - пропаганда и того и другого бессмысленна.

Если кто вместо броска к парадигмам потратит часть остатка праздников на то, чтобы просто перечитать доки по своему языку программирования от начала и до конца сосредоточившись на "почему" и "зачем", комментировать стоило. Если язык программирования Go, Dart или Rust - и перечитать проще не бывает, и вообще, Вы уже на правильном пути.

Действительно, почему?

Why some Linux users do not like systemd?

Спросил у Гугла и ИИ его сказал

Key reasons for the opposition include:

  • Violation of the UNIX Philosophy: The traditional UNIX approach favors small, simple tools that "do one thing and do it well" and can be easily chained together. Critics argue that systemd is a large, monolithic, and complex suite of around 70 interconnected binaries that takes on too many responsibilities, from network management (networkd) to logging (journald) and login management (logind), which previously were handled by separate, replaceable utilities.

  • Complexity and Learning Curve: The shift to systemd requires system administrators and power users to learn a completely new set of tools, commands (like journalctl and systemctl), and configuration files (declarative units). This deprecates decades of accumulated knowledge and scripts based on older systems like SysVinit or Upstart.

  • Binary Logging Format: systemd uses a binary format for its logs (the journal) instead of plain text files. This is a major point of contention because traditional text-processing tools like grep, awk, and sed cannot be used directly. Users must rely on the specialized journalctl utility to read logs, which some view as a move away from the transparent, file-based nature of UNIX systems.

  • Invasive and All-or-Nothing Approach: Due to its deep integration into the system and its dependencies, replacing individual systemd components with alternative software is difficult, and many desktop environments and projects have come to depend on it. This reduces user choice and flexibility, creating an "all-in-one bundle" that is hard to customize.

  • Compatibility and Standardization Concerns: systemd is Linux-specific, rather than POSIX compliant, which makes it harder to port software between Linux and other Unix-like systems (like BSDs).

  • Developer Dislike and Community Dynamics: A significant, though less technical, aspect of the controversy includes personal dislike for the key developers of systemd, with some critics citing a lack of openness to community feedback and an "inflexible by design" attitude. 

И это дивно совпало с моими личными ощущениями - systemd работает хорошо и удобно, но является злом которое вредит мне так тонко и замаскировано, что я этого не замечаю. В точности то же самое относится и к wayland. Со злом я, впрочем, не борюсь если можно примкнуть к нему, в данном случае - EndeavourOS называется.

Автор, 🧍‍♀️🐩, убери статью и про приватность пиши только одно - ой, мама, совсем нету, ничего не работает. На крайняк - как с этим обстоит дело в скрепной ОС Роса.

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

Do sd cards refresh data when connected to power?

Спросил я у Гугла и АИ его сказал - чаще нет чем да, зависит от того, куда карта вставлена, и от профессиональности карты, но полное чтение есть один из способов обновления заряда в ячейках. Вроде сиё объясняет почему на дешёвой карте исчез провал скорости и кому под хвост пошёл эксперимент.

Увы, я не профессор и таланта к обучению не имею.

Первый недостаток Go -- это отсутствие перечислений (enum).

Поэтому объявляют специализированный тип и набор констант через iota и не парятся. Или используют кодогенератор и не парятся. Или используют пакет enum и его дженерики и снова не парятся.

Важная особенность состоит в том, что компилятор принуждает программиста либо обработать все возможные варианты, либо создать ветку, которая будет обрабатывать все варианты, не подпавшие под какой-либо шаблон:

А если ни то ни другое не нужно? Это, кстати, философски значимо - компилятор для программиста или программист для компилятора? Или даже так - что первично, процесс работы или её результат? Можно сказать, что Go помогает программисту автоматически создавая ветку по умолчанию которая не делает ничего.

А ситуацию когда есть набор вариантов из которых нужно выбрать ровно один на Go можно оформить массой способов - в Go функции are first class citizens.

Почему эта задача плохо решается с помощью Go. В Go для этой задачи придётся использовать обычный int

Не "придётся использовать", а "я не могу придумать ничего кроме".

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

Согласен, то, что об этом можно не думать - большое достижение авторов языка.

Можно было бы сказать, что это просто особенность Go -- что там более высокоуровневая модель памяти. Но так как он позиционируется как язык, на котором можно писать высоконагруженные системы, то это я считаю минусом

Некоторе системы требуют писать без выделения и освобождения памяти, но это к слову. Сама же идея интересная - кем позиционируется? Где? Когда? Зачем? Я вижу что про языки программирования несут чушь на уровне торгашей базарных и пропагандистов продажных, но не понимаю кто заказывает эту музыку.

Писать высоконагруженные (то есть с фиксированным временем реакции, что-ли?) системы на Go точно можно, но что для Go, что для Rust точно найдутся такие, что их проще писать на другом языке. Elixir не даст соврать... И чё?

Много неудобств доставляет ограничение, запрещающее генерики в методах структур.

Это долгая история. Просто выясните когда в Go появились дженерики и почему не появлялись раньше. И осторожнее - Rust вообще весь состоит из неудобств, и ничего.

Таким образом, Go подталкивает нас к использованию интерфейсов

Ну вот... понимают если захотят.

Из-за того, что кортежи -- это не настоящий тип, мы не можем их использовать в генериках:

Не "не можем", а "не должны". Извращаться можно где угодно, но зачем? Кортеж - собранные вместе несколько значений. Ничего не напоминает? А их возвращение из функции - синтаксический сахар, полезность которого доказана обработкой ошибок. Как и := оператора...

Сделаю небольшую ремарку про злоупотребление интерфейсом any -- плохая практика, которая встречается не так уж редко.

Да, у Go есть история.

Это полный трэш и по сути игнорирование строгой типизации языка.

Философия языка для программиста или наоборот? Это хорошо понимали профессионалы которые делали Go, и весьма недооценённый Dart из той же конюшни, кстати. Поэтому any никогда не была трешем... разве что ловушкой для любителей.

В подходе, который в Go выбран для обработки ошибок, мне нравятся две вещи: передача ошибок через возвращаемое значение функций (по сравнению с исключениями в C++, Java) и возврат ошибки как отдельного значения (по сравнению с использованием "особых значений" как в C).

Ну не надо такое писать, дурно пахнет. Да, все так пишут, запах только усиливается. В Go перехватывается panic...

Первая проблема с таким подходом в том, что по сигнатуре функции нельзя понять, какие ошибки внутри неё могут возникнуть.

Это уже зашкаливает. Используйте другой тип и всё. Если Rust создаёт выученную беспомощность заставляющую использовать только то, что есть в стандартной библиотеке, без изменения, пусть и не всех (на меня вот не подействовало), то это проблема Rust.

И это приводит к проблемам -- так как ошибки в Go обычно имеют тип error, то каждая новая ошибка будет присваивать значение всё в ту же переменную:

То же самое опять. "Обычно" не значит "всегда".

И у вас появляется переменная, существующая на протяжении всей функции, которую можно случайно использовать.

Давно решено. См. := оператор.

Сложно не упомянуть о синтаксическом сахаре в виде ?.

Спасибо что упомянули. Это как раз то, что было сознательно отвергеуто в Go. Упрощает и без того тривиальное ценой усложнения и так нетривиального.

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

Отличное наблюдение. Действительно, в Go возможность ошибки - последний приоритет. Пытаюсь догадаться почему так - потому, что у каждой ошибки есть причина, и проще и лучше устранять причины, чем бороться со следствиями, особенно бороться запретами (вне программирования эту мысль прошу не думать). Но что думали авторы Go - не знаю.

Непонятно, что мешало за столько лет существования языка добавить банальное:

Да, в Go есть история и изначально в конструкциях языка была некоторая магия. Что лучше, append или .Push - не очевидно, это разные вещи потому, что append добавляет элемент не в массив, а в slice.

Видите баг? Мы создали массив, в котором уже есть 10 элементов.

Не вижу. Создали массив из 10 элементов. Молодцы. Не хватает фантазии сообразить когда это нужно?

Непонятно, что мешало сделать для массива пустого и массива заполненного два отдельных конструктора.

Я бы первым делом заподозрил array literal.

Начнём с того, что посылающая и принимающая сторона выражена одним и тем же типом:

Не понимаю. У канала нет принимающей и посылающей стороны, есть чтение из канала и запись в канал. И, как мне кажется и, конечно, не более того, именно каналы сделали все навороты Rust о которых любят петь как о fearless concurrency просто ненужными.

В Go присутствует такая эзотерическая конструкция, как теги на полях структур.

Да, и судя по предложениям по поводу в статье по соседству, её авторы переоценили уровень своих пользователей. Это весьма печально, особенно если задуматься о том, что рост популярности автоматом снижает тот самый уровень.

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

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

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

И не должны мочь. По определению родительский модуль использует дочерний.

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

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

Существуют //go:build тэги, возможность явно перечислить файлы в коммандах run и build, ссылки в файловой системе, файл go.work. Вместе вот это всё позволяет раскладывать файлы по папкам крайне кучерявым образом, но я не могу придумать когда такое действительно нужно. Может быть для генераторов кода? Может быть тогда эта избыточность понадобится. А может просто избыточность введена для того, чтобы было проще обмениваться файлами по почте? Не знаю...

Про Go любят говорить, что его философия -- это простота (а также любят говорить, что каждая новая концепция, добавляемая в язык, лишает его простоты). Но в чём смысл этой простоты, если она делает инструмент негибким, неудобным для применения?

Ещё раз, мало ли что и из каких соображений врут говорят. Возьмём два slice (среза?) от одного массива и начнём их изменять - ничего от простоты Go не останется. Напишем горутины и сравним работу кода на десктопе и в Web Assembly - результат тот же. И далее везде.

Я бы мог согласиться с тем, что Go прост, если бы из контекста следовало, что он идеологически прост. Это не означает ни низкого порога входа, ни удобства для не понимающих сути языка, что Вы и описали. Как пример - Scheme и того идеологически проще... И ещё более охотно я бы согласился с тем, что Go идеологически прост и практичен.

Смысл, как мне кажется, в том, что простота упрощает эволюцию языка, что исключительно важно если хотеть чтобы Go был надолго, и облегчает изучение языка. Да, я считаю что знание языка программирования бинарно - либо есть либо нет, если не знаешь чего-то, значит не знаешь ничего, а рассуждения про уровень джуниора и сеньора, базовые и продвинутые функции - тяжёлый бред.

Негибкости и неудобства я пока в Go не почуствовал. Наоборот, с Go приятней работать чем с чем-либо ещё. Следующий за Go вариант - сладкая парочка JavaScript + Dart. Rust мне тоже нравится, наличие архитектурных ошибок странностей не особо мешает, но пользовать его можно только если время ожидания окончания компиляции хорошо оплачивается.

После некоторых колебаний решил таки отредактировать пост и добавить - Rust представляется мне хорошей заменой C++, к сожалению идущей дорогой C++.

Чем мне нравится Go, так это взрослым подходом свойственным профессионалам. Это не Rust какой-нибудь, где авторы выглядят как способные, может быть даже талантливые, дети. Как пример - дженерики. 12 лет их не было потому, что было не понятно как их сделать нормально. Такой же подход был, отчасти и есть, у Эппл. Например, если нет достойного iOS калькулятора - значит в iOS калькулятора не будет.

О тегах начну с предполагаемых причин. Кому-то было неудобно парсить JSON и он придумал теги - из шкурных интересов решил нагадить всем. Как называется такая личность? Правильно, сволочь она называется.

Почему нагадить? Потому, что это значит городить второй язык поверх Go. Вот с этим делом и проблемы, дотпространств имён докатились. Это безумие, как бы кому ни казалось что лично ему профит выйдет.

Почему сейчас не ужас? А упомянутый выше профессионализм (пока) спас, думается мне. Тэги как они есть - не мешают никому, ну есть и есть. Более того, чтобы узнать, есть ли от них польза, другого способа чем попробывать - нету. Попробывали, есть польза, вот JSON парсить приспособили - теперь лучше понимаем как его парсить, положительный результат достигнут.

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

И ещё раз, для верности. Стандартизация и прочая дурь вокруг тегов а) смешивает концепты и б) мешает другим способом использовать тэги чтобы разобраться ещё с чем нибудь ограничивая свободу их использования.

Пример аналогичного этим предложениям, как по мне весьма, безумия из Rust - времена жизни в определении процедуры. Процедура не может интересоваться временами жизни что параметров, что возвращаемого значения - это автономная сущность. Если нужно обязательно делать ещё одну проверку не дождавшись пока компилятор поумнеет достаточно для того, чтобы её можно было реализовать нормально - пишите свои времена жизни там, где они не выглядят творением школьного кружка, при вызове функции, например. Или при объявлении переменной...

Премного я опечалился сию статью прочитав. Линуса на вас нет...

Мне как-то кажется, что случай не новый. Ибо вроде как общеизвестно, что

Осёл, поработавший в тени, больше никогда не будет работать на солнце.

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

Ослы, вкусившие административного ресурса, ...

Я (чуть) заглянул в Вашу книгу. В надежде что если я таки это прочту, то неконец то буду понимать что как бывать по русски, а то все источники почему-то англоязычные попадаются.

Регулярно актуализировать - это подвиг, не отнимешь.

Лицензия не только читаема, что уже поразительно, но и приемлема. Есть мелкие, однако, вопросики. Вот "любому использованию" уделена масса внимания, а "любое не использование" почему-то обойдено стороной.

воспроизведение Произведения (полностью или частично) на бумаге путем распечатки с помощью принтера в одном экземпляре

А не на бумаге? А без принтера? А разве два экземпляра частичного воспроизведения не могут оказаться тождественны одному экземпляру? История с Хираньякашипу подталкивает к более общему стилю написания лицензий...

в том числе экземпляров, содержащих какую-либо часть произведения

Это невыполнимое условие ибо запрещает, в частности, писать

void main() {

Формат epub выглядит серой нечитаемой простынью по сравнениию с pdf, который тоже не блещет изысками форматирования. Надо бы по тексту предупредить - epub, по возможности, не качайте.

Сразу, после заглядывания в случайное место, в глаза бросилось

// base_url/part_2/2.2/ex_1.dart
void main() {
// Dart 2
final myList = [1, 2];
var a = myList[0];
var b = myList[1];
print('a: $a, b: $b'); // a: 1, b: 2

// Dart 3
var [a1, b1] = myList; // или final [a1, b1] = myList;
print('a1: $a1, b1: $b1'); // a1: 1, b2: 2
}

разве немного иначе не было бы понятнее:

// base_url/part_2/2.2/ex_1.dart
void main() {
final myList = [1, 2];

// Dart 2
var a = myList[0];
var b = myList[1];

// Dart 3
var [a1, b1] = myList; // или final [a1, b1] = myList;

// with the same result
print('a1: $a1, b1: $b1'); // a1: 1, b2: 2
}

Сама идея бесплатной книги по Dart кажется мне великолепной, особенно когда основная цель - продвижение Flutter, что самого по себе, что курсов или ещё чего по нему. Стандартный подход - вот великий Flutter но и про неизбывный Dart тоже поговорим, - не работает потому, что как раз Dart и есть главное психологическое препятствие на пути к Flutter.

Моя предварительная оценка - 129 из 137.

Нету в Rust никакой безопасности, а раз так, нету и никакого её обмена на эффективность - Rust быстр на уровне С. Есть, как и везде, ложь, полуправда, политика и шкурные интересы.

В Rust реализованы, если угодно - доведены до абсурда, некие интересные сами по себе идеи, для удобства назовём их парадигмой, заставившие меня понять - парадигмы могут быть разные (Scheme пытался но не смог) и чем очевиднее, что где-то никакой парадигмы то и нету, тем разрушительнее её неизбежное наличие. Как пример - borrow checker продают как безопасность, которая, в зависимости от точки зрения, либо отсутствует либо преждевременна и, следовательно, не нужна в лучшем случае, но не продают как способ облегчить чтение и понимание программы, хотя про отсутствие второй модифицирующей ссылки можно повторить всё когда-то сказанное про отсутствие go to.

У Rust хороший тулинг, я бы сказал - отличный кабы у Go тулинг не был бы на том же уровне, хорошая интеграция с С, разве что у Zig и того лучше, и отличная, в смысле непревзойдённая, документация на сайте. Я не знаю, достаточно ли этого чтобы объяснить движуху вокруг Rust, но поветрие "перепишем на Rust" породило много интересного, а набор крейтов Rust, уступая числом но, вроде как, возрастая быстрее, превосходит набор пакетов Go разнообразием, то есть Rust выглядит поуниверсальнее.

Как Rust ложится на (безумную) схему "джун - сеньор - тестер" я не знаю, но знаю - это важно. Но и без этого движ вокруг Раста не удивителен, а в истории смысл точно есть.

Забыл, придётся отредактировать пост. У Rust отвратительно медленный компилятор, но его как раз сейчас переделывают.

Все .go файлы в одной директории должны объявлять один и тот же package. Они видят друг друга полностью, как если бы были одним файлом.

В такой форме это путает новичка. Если все файлы должны иметь одну и ту же строку, то зачем она вообще нужна? Ну, может быть если файлы вдруг перескочат из одного каталога в другой...

Если бы написать чуть полнее, скажем про go.work, go.mod и то, когда имена пакета и директории могут не совпадать - будет понятно, что обязательный package не 100% исторически сложившееся уродство, а в нём есть и некоторая логика и некий потенциал на мало ли что в будущем. Мне кажется, что в статье изложено меньше чем квант.

Про "видят друг друга полностью" - неверно. Файлы друг друга не видят вообще, их видит команда go. Поэтому в одном каталоге может быть несколько .go файлов в каждом из которых есть и "package main" и "func main" и команды типа "go run m_v3.go p1.go p2.go" и "go run m_v1.go p1.go p2.go" будут работать, а комманда "go run ." - нет.

Такие мелочи важны как раз для начинающих, у них и main может быть в разных вариантах, и раскладка по модулям плавать.

Объявляет и инициализирует переменную одновременно

Тут я бы непременно вставил слово "новую", как минимум. Иначе это тоже запутывает новичка. А про "новую" он, даже читая по верхам, точно вспомнит как только слева от := окажется больше одной переменной.

В JavaScript два пустых значения: undefined и null. Тони Хоар назвал null "ошибкой на миллиард долларов". JS решил эту проблему... удвоив её.

Он не удвоил, он именно решил... для случая когда возможны ровно три состояния - известно, неизвестно, не спрашивали. Так нередко и бывает, поэтому в комментариях некоторые и пишут что получилось хорошо. Как только состояний больше - JS требует задуматься, а весь огород вокруг undefined и nil только мешает. В Go такого нет, да.

То же самое относится и к обработке ошибок. Пока состояний два - получилось и упс, try да ? работают идеально. Как только задача не столь тривиальна - метод Go удобнее чем баян который можно нагородить вокруг типов исключений и отметки мест откуда они.

Главная проблема новичка сейчас это старые учебники. Классический «Effective Go» писали в 2009-м, там нет ни модулей, ни дженериков. Учить по нему Go всё равно что учить JS по учебникам времен ES3.

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

Effective Go из 2009 - это действительно перебор, но почему бы не взять Mastering Go? Четвёртое издание - Go 1.22, на дворе - 1.25. Нужно только прочитать 3 release notes, и все проблемы с несовременностью решены. Автор там, кстати, пишет - предыдущие идания не устарели, за исключением первого. То есть учебник по Go 2018 года устарел, а 2019 года - ещё нет.

Как по мне, учить по тому, где чего-то нету, не страшно - об отсутствующем можно узнать потом, всех издержек - будешь знать как обойтись без тех самых, например, дженериков и редко пользоваться этим знанием. Неприятно учить о том, чего уже нет, тут выученное действительно вредит и печалит при выбрасывании, но как раз Go явно гарантирует отсутствие таких случаев. Go Compatibility Promise называется. На уровне best effort гарантирует, естественно, и у меня есть ровно один пример - всё, что кто-то постиг про core types изучая спецификацию языка - псу под хвост, это оказалась плохая идея.

Первое, что нужно забыть, это GOPATH. В прошлом Go требовал, чтобы весь ваш код находился в одной глобальной директории $GOPATH. Эта эра закончилась. Начиная с Go 1.14, Модули Go (go.mod) являются стандартом. Теперь вы можете создавать проект в любой папке, точно так же, как вы это делаете с npm init.

Зачем забывать про GOPATH? Она никуда не делась и бесценна для тех новичков, что предпочитают учиться путём дурацких экспериментов. Кстати, лучшая структура для новичков - go.mod, и то опционально, в корне и всё остальное разбросанное по папкам в художественном беспорядке - в go run можно просто перечислить нужные файлы с единственным ограничением нахождения их в одном каталоге, что легко обходится ссылками. И если обращаться именно к новичку, то рассказывать про go.work нужно раньше, чем про go.mod...

Основная проблема новичка в Go в том, что он не может понять границы того, что вознамерился изучать. На сколько хороши Андроид приложения на Go? Можно ли сделать сайт на Go без знания JavaScript? Какие игры можно делать на Go? Ставить Code или настраивать Neovim или пользовать Helix что работает с gopls из коробки? Вот это всё, чтобы не было ни "где же я был, раньше надо было учить" ни "лучше бы я Rust учил". А вспомогательная - манера сайта go.dev устроить множество точек входа в примерно два текста, из-за чего у новичка глаза разбегаются.

Напишу как я это понял, вдруг кому интересно.

  • Является ли вид страницы в браузере функцией от данных? Очевидно да.

  • Значит ли это что можно написать фронтенд средствами функционального программирования? Разумеется.

  • Как будет себя вести такой фронтенд? Перерисовываться при малейшем изменении данных.

  • Это что/как? Задница/внезапно.

Не огорчайтесь. Цель мер - повысить курс доллара с целью избежания убыточности нефтегазового сектора и, одновременно, улучшения наполнения бюджета. Ваш крайне несчастный фрилансер станет ещё и фрирайдером въехав в Рай на горбе нефтянки.

Ну и спорт: три раза в неделю — оптимальный объем, меньше — и получаем негативный эффект на оценки ребенка.

Я смотрю на график и самая высокая точка - больше трёх раз в неделю. Я неправильно смотрю на график? И это я могу понять - больше трёх занятий спортом в неделю требует то ли дисциплины то ли организованности, это автоматом повышает балл, особенно сейчас, когда высокая школьная оценка не требует ни ума ни фантазии.

Посмотрите на линии: они имеют нисходящую динамику, то есть эффект негативный. Тем не менее p-value 0,089, что значит, имеется некоторый тренд, но не статистически значимый результат[^5].

Я смотрю на линии и недоумеваю. Зачем они идут там, где нет данных? Кто тот мастер смартфона с 24 часами экранного времени в день на выходных который не спит по две ночи подряд? При переходе от 5 к 10 часам... я вижу явное положительное влияние.

При этом обратная картина, если смотреть, как количество сна влияет на оценки, — буквально развернутый

Тут я решительно отказываюсь видеть смотреть на прямую. Сон - физиологический параметр. Для каждой группы больных - он свой. Девочки спящие по 6 часов, как и мальчики спящие по 7 - это проблема, возвращающая к вопросу о том, что нужно для хороших школьных оценок. С учётом ЕГЭ - а вдруг может быть полезно подавить несколько ограничить способность к мышлению вообще.

И что занятно - ниже Автор сам описывает почему прямая абсолютно неуместна...

На протяжении всего эссе я использую слово “влияет”, однако я соглашусь с критикой, что это не в полной мере так. Уместнее сказать, что “связано”, а вот природу связи еще предстоит выяснить при дальнейших исследованиях.

Это очень верно, но почему бы не пойти дальше? Не понимая природу связи бессмысленно рисовать прямую - в ней нет смысла. С другой стороны - прямая существует сама по себе, почему бы её не привести? И действительно - почему бы и нет, но тогда разве не славно привести и параболу?

Зачем я вообще всё это пишу? В надежде что меньше людей придёт к мысли, что если ограничить экранное время, то успеваемость возрастёт. Это не обязательно неверно, но можно ограничить экранное время отобрав смартфон (YouTube, X, Whatsapp...), а можно повысив эффективность его использования. Купите неконец ребёнку планшет.

Я бы сказал, что статья - хорошая работа продажника, но не скажу. Потому что не понимаю кто будет конечным бенефициаром если она таки продаст мне Rust. Поэтому просто скажу, что все штампы по поводу Rust, равно как и по другим языкам - чисто маркетинговые сказки, серьёзно такое обсуждать...

Но что, если я скажу вам, что существует почти идеальный язык?

Ну да, очевидно существует. А "почти" - почти всемогущее лингвологическое волшебство.

Это Rust.

Ну да, конечно, он входит в группу почти идеальных языков вместе с, как минимум, Go и Dart. Ну и чё?

Как вышло вот это вот поколение хайповых языков, так я написал наивный тест - числа Фибоначчи. Так посчитать, сяк, большие целые надо откуда-то взять - библиотеки пощупать, GUI да TUI прикрутить, в Termux запустить, APK собрать... ну и на язык посмотреть.

Rust ничем меня не порадовал - ни соразмерностью частей, ни окончательным решением хоть какой-то проблемы, ни особым удобством работы (Cargo по сравнению с СMake - песня, но по сравнению с Go - ровня). И не порадовал компилятором - ну не быстро, в Termux жалуется что не может какие-то ссылки создать, копировать мол приходится...

А Go соразмерностью частей порадовал, дженерики например, по скорости Go то в два раза медленнее то в два раза быстрее (это может быть модуль больших целых, поди знай), но главное - только с ним все эксперименты прошли как по маслу (иными словами, дебилы, о которых пишет выше cupraer, успешно нейтрализованы). Вторым по небесячести, к слову, был JavaScript.

А вот то, что вот эти два способа

func frp(n int, a *big.Int, b *big.Int) *big.Int {
	if n < 2 {
		return b
	}
	return frp(n-1, b, a.Add(a, b))
}

func frt(n int) (*big.Int, *big.Int) {
	if n < 2 {
		return big.NewInt(0), big.NewInt(1)
	}
	a, b := frt(n - 1)
	return b, a.Add(a, b)
}

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

В Go нужно понять - не надо всё время писать if err != nil {return err}, а в Rust - не надо плодить ссылки. Как по мне - паритет. В Go объекты не надо бездумно создавать, в Rust их не нужно бездумно копировать - паритет, особенно учитывая, что по настящему критический код всё равно попросят написать без выделения или освобождения памяти.

Так что да, в Rust всё нормально, но не до таких восторгов. А можно иначе - либо нормально, но не всё, либо над Rust трудятся зря.

Вот как эти труды описывает ИИ Гугла

Key areas of work

  • Performance: The compiler performance group is working on a roadmap to improve compilation speed, and progress has already doubled the performance over the past few years. A 2025 survey identified linking as a major bottleneck, and the default linker for the popular x86_64-unknown-linux-gnu target is switching to the faster LLD linker.

  • Refactoring and modernizing: There are ongoing projects to redesign and re-implement parts of the compiler for better semantics and to prevent bugs. One example is the need for a redesign of "unsized locals" because the current implementation lacks a proper operational semantics, making its interaction with optimizations unpredictable.

  • Team and project structure: The compiler team structure has been reorganized to better focus on specific areas, and the overall project is tracking progress towards a slate of 40 project goals, including many flagship initiatives.

  • Language and feature stabilization: Regular new versions of Rust are released (like 1.85.0, 1.88.0, and 1.90.0), which include new stable language features and improvements to Cargo, the package manager. 

Blender - с большой вероятностью плохой пример, распаковал архив да двинул blender.desktop. И со многим так же, причём чем дальше тем больше - Go, Julia, Rust... даже Python... и далее программы на них. И пишут же - flatpack, всё не снап, хотя хрен редьки...

На этом не точка, если точка - значит хвост виляет собакой. Способов перекодировать fb2 в epub очень много. Например, https://github.com/rupor-github/fb2converter прост и (у меня) прекрасно работает, в дереве папок с разными файлами добавит ко всем fb2 одноимённые epub одной командой.

Является консольным приложением, написан на Go - можно взять с Github релиз, хоть под Винду хоть под Termux, а можно и собрать самому где угодно, хоть на смартфоне через тот же Termux, на всё максимальный расход - три команды. Только что на Хабре была статья про кросс компиляцию - прекрасное дополнение к ней ибо можно не нагружать телефон и собрать для Termux на любом компе. Но ещё раз - есть релиз, собирать не обязательно.

К слову, на Arch со товарищи - в AUR.

В общем да, так.Но после этого вопроса я начинаю за Вас волноваться... Я tview рекомендовал хоть и искренне, но немного игриво - в предположении что дефот для TUI в виде github.com/charmbracelet/bubbletea (и его окружение типа github.com/charmbracelet/lipgloss да github.com/charmbracelet/bubbles/*) вполне известны. Они тоже добавляют мало, может меньше чем на пол мега больше.

1
23 ...

Information

Rating
2,159-th
Registered
Activity

Specialization

Разработчик игр, разгильдяй
Средний
From 1,000,000 ₽
JavaScript
TypeScript
Node.js
React Native