Ярослав
@darviarush
User
Information
- Rating
- Does not participate
- Location
- Санкт-Петербург, Санкт-Петербург и область, Россия
- Registered
- Activity
Specialization
Software Developer, Fullstack Developer
Middle
Perl
Python
Node.js
JavaScript
Coffeescript
HTML
CSS
Mojolicious
MySQL
PostgreSQL
До git и прочих систем контроля версий использовали набор команд: diff, patch и прочее. Вместо докера и lxd/lxc – chroot. Всё это дело наворачивали самописными скриптами, которые у каждого были свои. git и docker имеют так же сайты для развёртки проектов: github и hub.docker.com. Так что на крупных проектах и раньше часть времени уходило тупо на поддержку разработки, а не на программирование.
Исключение: сайты на php. Там каждый программист имел свой каталог и сам выкладывал изменённые файлики из него на прод через ftp. При такой схеме каждый программист работал отдельно и ресурсов на поддержку команды не тратилось (не нужны были ПМ-ы, аналитики, девопсы и ведущие программисты, а зачастую и тестировщики с QA-инженерами).
Что касается чат-жпт, то мне удобнее погуглить и просмотреть первых 3 ссылки, чем задавать наводящие вопросы чат-жпт. Но тут уж кто к чему привык )
Ну а докер не я настраиваю, иначе ставлю туда mc сразу )
Тормознутость и прожорливость к памяти IntellijIDEA - вот что должно вызывать тоску )
Для меня heidisql более удобен (по комбинациям клавиш, например), чем DataGrip, ведь это и отдельное приложение и интерфейс у него приятнее. Опять же, функциональность вся нужная мне, у heidisql в наличии )
С файлами heidisql тоже справляется - не жалуюсь )
Для работы erswitcher нужны иксы. В открытом в них терминале обычно уже настроена комбинация Ctrl+v, если нет - нужно будет настроить
В статье предлагается заходить на виртуальные машины по ssh
В разделе статьи "Как erswitcher вставляет текст" указывается, что он эмулирует нажатие клавишь. Но символы юникода через клавиатуру не вставишь и поэтому пришлось использовать буфер обмена
Ещё раз просмотрел coq и не нашёл никаких признаков логического языка. Вот как на нём написать предикат append/3, из примера в этой статье, и запустить его так, чтобы получить все комбинации двух списков, которые приводят к образованию 3-го (комбинации так же указаны в статье)?
Синтаксис у них, как у ML, собственно, почти все функциональные языки являются его диалектами, исключая разве что lisp.
У vscode я ставил плагин для пролога - тоже ошибки синтаксиса подчёркивает и по библиотекам перемещается, если с Ctrl щёлкнуть )
Можно вопрос? Как вы отличаете живые и мёртвые библиотеки?
Как я упоминал в статье, есть пролог на js для выполнения в браузере. Mercury компилируется в байт-код. А вот coq и irdis могут из под perl-а выполнятся, как пролог из примера в этой статье? )
А чем лучше? Эти языки программирования — функциональные. То есть не смогут найти все варианты доказательств, если вы решите на них доказывать теоремы. А логические языки — могут ;)
Ну, линковать ничего не надо: всё делает модуль Tcl: и функции tcl из perl-a вызывает и регистрирует в tcl функции perl-a, чтобы вызванные перелом функции tcl могли вызвать перловые ;)
А зачем? На tcl написано множество библиотек для поддержки виджетов tk. То есть можно, если у тебя есть наработки на tcl, интегрировать их с perl-ом, вот как в этом проекте, например: https://github.com/darviarush/ninja. А конкретней, в этих модулях: https://github.com/darviarush/ninja/blob/master/lib/Ninja/MainWindow.pm и https://github.com/darviarush/ninja/blob/master/lib/Ninja/tk/main-window.tcl
Пример с tcl, как и с lua был сделан просто для того, чтобы показать, что другие встраиваемые в perl языки могут вызывать функции perl из себя. А встроенный в perl prolog этого не может -/
Живее всех живых: уже 6 лет им пользуюсь довольно регулярно )
Просто это апи из perl убрали, но Марк Лехман - создатель Coro - тогда выпустил свой форк perl-а. Я его перекомпиливал, помню, и менял на фрюхах )
А потом до кодеовнеров официального perl дошло, что их perl никто не скачивает и им пришлось апи вернуть )
Ну, чтобы утверждать, что AnyEvent быстрее Coro, нужно показать нагрузочные тесты )
Ну и что нагрузочные тесты будут тестировать? У Coro есть только хандлер для работы с сокетами. А так Coro - это просто менеджер легковесных процессов. У него просто есть их табличка и он переключается с одного на другой по событию, которое возникает в EnyEvent, IO::AIO или любой другой библиотеке которую ему укажешь (так DB::Mysql умеет быть асинхронным сам по себе, остаётся его только подключить к Coro - и вуаля) ).
События удобны для GUI, где события возникают на виджетах на действия пользователя. Но использовать их чтобы считать файл... Ну это просто увеличивает объём кода с одной строки до 50 - вот и всё )
Глобальные переменные, в которые регулярки записывают разультаты — жутко удобные, так как экономят объём кода и делают поэтому его более читабельным, а программиста — более продуктивным. Ну и опытному программисту на perl они нисколько не мешают, т.к. просто нужно обернуть выражение в блок:
"abc" =~ /(b)/; { "xyz" =~ /(y)/; print $1 } print $1
Получится:yb
.Прагмы программисты на perl не используют (ну максимум use common::sense, который включает use utf8; и удобные стрикты и варнинги, а те, что мешают разработке — нет). Поэтому новые расширения языка создаются для программистов переходящих из python в perl, пока они не научатся таки в perl )
Конечно никто на колбеках (AnyEvent, POE) и не программирует. Программируют на Coro — это легковесные процессы (волокна (fibers) или зелёные потоки (green threads)), которые выполняются внутри одного процесса. Вы, кстати, не разобравшись приписали его к AnyEvent, хотя он может подчинить её событийную машину через Coro::rose_cb и Coro::rose_wait. Там фишка в том, что при создании нового легковесного процесса нужно сразу обернуть код в нём в eval {}, чтобы перехватывать исключения внутри потока и не допустить остановку всей программы. Ну и Coro в perl так же удобен, как легковесные процессы в Erlang, Haskell или Go (один в один просто) )
eval на perl просто прекрасен, а конструкция try ... catch несколько громоздка, как по мне )
Взглянул на передачу параметров в python. def fn(a, b, c=10): а потом: fn(5, c=20, b=30) — удобно. Но, опять же, perl тоже удобен: можно манипулировать всеми параметрами в массиве @_, можно вернуть что-то через параметр: $_[0] = 5.
element in array. Ничего со смартматчингом не наворотили. Используется он легко и просто: 5 ~~ [1,5], ну или с переменными: $element ~~ \@array.
Что касается дат, то каждый может подобрать себе библиотеку по вкусу. Вроде в этом и мощь библиотек _)
Вообще-то тут массив приводится к скаляру, в результате чего получается его размер. В других языках программирования есть только скаляры, поэтому идею массивов сложно понять. Тем не менее их использование очень удобно. Например, чтобы узнать размер массива не нужна функция len )
Ну и аналогично на python:
scalar @arr; ⇒ len(arr)
@arr + 0; ⇒ len(arr) + 0
@arr . ''; ⇒ str(len(arr)) + ''
$#arr + 1; ⇒ len(arr)-1 + 1
push(@arr, 1) - 1; ⇒ arr.append(1); len(arr) - 1
unshift(@arr, 1) - 1; ⇒ arr[:0] = 1; len(arr) - 1
my $i = 0; $i++ foreach @arr; return $i; ⇒
i = 0
for a in arr:
i += 1
return i
@arr = (1) x @arr; return length join('', @arr); ⇒ arr = ["1"] * len(arr); return len("".join(a))
О, так для сообщества это не проблемы )
После Moose/Moo/Mo классы выглядят... Да никак, собственно )
Ларри Уолл знал, что нужно языку. Новые пёрловнеры, похоже, решили повторить путь PL/1, который развивал не библиотеки, а постоянно модифицировал синтаксис. Впрочем их пока спасет
use feature
)Опять же —
defer
дублируетuse Guard qw/guard/;.
А дляgoto
давно нужно было сделать, чтобы он прыгал внутрь функций ;) А не только на её началоgoto &fn;
Зачем придумали странный синтаксис
try ... catch ... finally
, если в perl естьeval
? Ну и убогий синтаксисsub x ($a, $b) {}
, когда есть вся мощь@_
. Для людей, которые в perl c python переходят, надо полагать )Вместо %{^HOOK} лучше бы доделали замену суперглобальных функций через CORE::GLOBAL::require = sub { ... };
Чем помешал " ' " — тоже не понятно. Если у вас одного аллергия на кошек, то это не значит, что нужно извести всех кошек )
Резонное замечание. Поправил введение.
О(1) это же когда можно за один шаг получить элемент хранилища. То есть у массивов. А в хеше делается crc-сумма ключа, берётся от неё модуль по количеству элементов (индекс) и проверяется: есть ли там этот ключ или другая crc-сумма. Если другая, то алгоритм пробует то же с предыдущей ячейкой и т. д., пока не найдёт или не порадётся незаполненная ячейка. То есть при самом неблагоприятном случае мы можем обойти весь хеш в поисках ключа (О(n)).
Но такой случай маловероятен, поэтому, округляя будет О(1) в среднем... Опять же, если массив с элементами хеша будет заполнен не более чем на 80%.
Ещё есть реализация хеша, когда ячейка занята, то за ней прикрепляется список, чтобы добавлять другие элементы с ключами с одинаковым индексом: index(key)=crc32(key) % length_hash.
Ну это так: к слову. На самом деле в веб-программировании 99% времени уходит на получение данных, поэтому важнее оптимизировать базу и кеши, чем, например, переписывать приложение с языка сверхвысокого уровня (perl, python, php, ruby, groovy или node) на язык высокого (c#, java, julia, d) или среднего уровня (c++, go).
Когда будет время - пройдусь по разным БД: уверен, что не все поменяют запрос местами. Есть же Sqlite, Sphinxql и т. д. Наверняка разработчики какой-то прогуляли лекции по предикатам в дискретной математике. )
Действительно, мускул оптимизировал запрос и поменял операнды AND местами:
Paging и pagination - синонимы, да ещё и однокоренные. Так что их вполне можно назвать одним словом. )
Как видите, вложенный SELECT сработал только для 3 4 и 5, а 1 и 2 были отброшены условием product.id >= 3 и во вложенный SELECT интерпретатор мускула просто не зашёл.
Что до хеша. Хеш - это реализация ассоциативного массива, но так как она очень распространена из-за того что кушает меньше памяти, чем, например, красно-чёрные деревья, то программисты часто называют хешами ассоциативные массивы. Хеши в PHP и Python, сохраняют порядок в котором были добавлены ключи:
В JavaScript порядок не сохраняется, а при переборе ключи хеша выдаются в алфавитном порядке:
В Perl-е порядок не сохраняется, а при переборе ключи выдаются в том порядке в котором расположились внутри хеша. То есть при 2-м запуске одного и того же скрипта порядок перебора ключей скорее всего будет разным:
Соответственно если важен порядок ключей хеша при переборе, то пэхапешники и питонисты используют встроенную возможность не задумываясь. )
P.S. Замерил скорость через HeidiSQL:
SELECT * FROM t1 WHERE id IN (SELECT id FROM t2) limit 1000000 -> 3,203 сек.
SELECT DISTINCT t1.* FROM t1, t2 WHERE t1.id=t2.id -> 7,078 сек.
SELECT t1.id FROM t1, t2 WHERE t1.id=t2.id -> 4,312 сек.
Программирование - это практика и у вас будут требовать, чтобы ваши SQL-запросы выполнялись быстро. Вряд ли вашего заказчика удовлетворит ответ: "А в декларативном программировании нет времени". )