Pull to refresh
20
0
Ярослав @darviarush

User

Send message

До git и прочих систем контроля версий использовали набор команд: diff, patch и прочее. Вместо докера и lxd/lxc – chroot. Всё это дело наворачивали самописными скриптами, которые у каждого были свои. git и docker имеют так же сайты для развёртки проектов: github и hub.docker.com. Так что на крупных проектах и раньше часть времени уходило тупо на поддержку разработки, а не на программирование.

Исключение: сайты на php. Там каждый программист имел свой каталог и сам выкладывал изменённые файлики из него на прод через ftp. При такой схеме каждый программист работал отдельно и ресурсов на поддержку команды не тратилось (не нужны были ПМ-ы, аналитики, девопсы и ведущие программисты, а зачастую и тестировщики с QA-инженерами).

Что касается чат-жпт, то мне удобнее погуглить и просмотреть первых 3 ссылки, чем задавать наводящие вопросы чат-жпт. Но тут уж кто к чему привык )

Ну а докер не я настраиваю, иначе ставлю туда mc сразу )

Тормознутость и прожорливость к памяти IntellijIDEA - вот что должно вызывать тоску )

Для меня heidisql более удобен (по комбинациям клавиш, например), чем DataGrip, ведь это и отдельное приложение и интерфейс у него приятнее. Опять же, функциональность вся нужная мне, у heidisql в наличии )

С файлами heidisql тоже справляется - не жалуюсь )

  1. Для работы erswitcher нужны иксы. В открытом в них терминале обычно уже настроена комбинация Ctrl+v, если нет - нужно будет настроить

  2. В статье предлагается заходить на виртуальные машины по ssh

  3. В разделе статьи "Как 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(s):

* scalar @arr;
* @arr + 0;
* @arr . '';
* $#arr + 1;
* push(@arr, 1) - 1;
* unshift(@arr, 1) - 1;
* my $i = 0; $i++ foreach @arr; return $i;
* @arr = (1) x @arr; return length join('', @arr);

Вообще-то тут массив приводится к скаляру, в результате чего получается его размер. В других языках программирования есть только скаляры, поэтому идею массивов сложно понять. Тем не менее их использование очень удобно. Например, чтобы узнать размер массива не нужна функция 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 местами:

set @a:='';

select product.id
from product
WHERE 
(
	SELECT @a:=concat(@a, ' ', product_id)
	FROM stock WHERE product_id=product.id LIMIT 1
)
AND product.id >= 3;
	
SELECT @a; # -> 3 4 5

Paging и pagination - синонимы, да ещё и однокоренные. Так что их вполне можно назвать одним словом. )

CREATE TABLE product (
  id int unsigned PRIMARY KEY AUTO_INCREMENT
) ENGINE=InnoDB COMMENT='Товар.';

create table stock(
id int unsigned primary key AUTO_INCREMENT,
product_id int unsigned NOT NULL COMMENT 'Ссылка на товар.'
) ENGINE=InnoDB COMMENT='Склад.'

insert into product(id) values (1), (2), (3), (4), (5);
insert into stock(id, product_id) values (1, 1), (2, 2), (3, 3), (4, 4), (5, 5);

set @a:='';

select product.id
from product
WHERE product.id >= 3
AND (
	SELECT @a:=concat(@a, ' ', product_id)
	FROM stock WHERE product_id=product.id LIMIT 1);
	
SELECT @a; --> ' 3 4 5'

Как видите, вложенный SELECT сработал только для 3 4 и 5, а 1 и 2 были отброшены условием product.id >= 3 и во вложенный SELECT интерпретатор мускула просто не зашёл.

Что до хеша. Хеш - это реализация ассоциативного массива, но так как она очень распространена из-за того что кушает меньше памяти, чем, например, красно-чёрные деревья, то программисты часто называют хешами ассоциативные массивы. Хеши в PHP и Python, сохраняют порядок в котором были добавлены ключи:

hash = {4:1, 5:1, 3:1, 1:1, 2:1}
for i in hash:
  print(i)
# -> 4 5 3 1 2

В JavaScript порядок не сохраняется, а при переборе ключи хеша выдаются в алфавитном порядке:

hash = {4:1, 5:1, 3:1, 1:1, 2:1}
for(i in hash) console.log(i)
// -> 1 2 3 4 5

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

$ perl -e '%hash = map { $_=>1 } 1..5; 
  print "$k "while ($k, $v) = each %hash'
2 1 4 3 5
$ perl -e '%hash = map { $_=>1 } 1..5; 
  print "$k "while ($k, $v) = each %hash'
5 1 2 4 3

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

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-запросы выполнялись быстро. Вряд ли вашего заказчика удовлетворит ответ: "А в декларативном программировании нет времени". )

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