Обновить
26
0
Дмитрий Святогоров @PnDx

Инженер-конструктор систем массового обслуживания

Отправить сообщение
Действительно, зачем? При том, что до серверов есть SFTP?

Far manager даёт n-кратное ускорение определённых операций именно при работе с локалхоста. За счёт netbox, встроенного редактора с потрясающим UX (+colorer), запоминания последних введённых команд (в данном случае, «cd /path/to/folder») не помню только «из коробки» или через плагин.

Пример из практики. До железки/ВМ есть медленный (потому что далеко) лагающий (e.g. потому что Китай & великий файервол) канал. Что-то нужно посмотреть/подрихтовать «вот прямо сейчас». Потому что площадка новая и всего сразу не задеплоишь.
— Коллеги со 100% linux-бэкграундом: лезут из консоли по ssh и дальше долго и мучительно борются с тем что «то ли ввёл то ли нет». Для такого даже спец. терминал написали, но там 80x24 и другие ограничения.
— Я: переключусь в окно с FAR. Залогинюсь через netbox. Наберу e.g. «cd /etc/». Подожду пока FAR таки получит локальную копию списка (тут мы с коллегой в ±одинаковых условиях). Дальше — alt→(пошёл набирать название). F4 — подождал — имею локальную копию в редакторе. И понеслась… В конце мне тоже может потребоваться терминал. Но — строго по делу, с минимумом негатива от лагов.

Можно так делать в mc/dolphin/pycharm/wtf_else? Да, с поправкой на некоторые «местные особенности». Но есть нюанс: за использование fish (mc,dolphin — точно через это лезут) — неслабый шанс отхватить от безопасников. Потому то что fish вносит ненужное разнообразие в ФС и список процессов на том конце.
На моей грядке rudder 4.x обслуживает несколько сотен «statefull»-хостов. Был выбран (во времена 3.х) как способ «затоптать» порог вхождения в cfengine. Чтобы специалисты (кроме одного «архитектора») оперировали своими понятиями, а не занимались «программированием» на yaml в ansible, ruby в chef etc. В свою очередь, cfengine позволяет тратить на управление предсказуемые ресурсы. Его когда-то спроектировали. Пусть и не без нюансов (а дело-то было в 1980х!). Агент потребляет 10…15 МБ RSS, 1 ядро CPU (≈20 секунд пользовательского времени на отработку около сотни директив из rudder (внутри так и вовсе до полу-тысячи субъектов управления), который та ещё абстракция-над-абстракцией).

Пишут rudder французы из Normation. На Scala, в основном. Несколько лет назад были вполне вменяемые (я помогал им баги фиксить которые мне мешали). С 5.x проект сменил форму монетизации («дайте денег за каждую фичу которая до этого работала за так» и «LTS за доп. плату»), и мы пока решили подождать.
  • Я на самом деле могу выпустить статью с ворохом технических подробностей и разборами «почему там — так». Материалов хватит даже на несколько, т.к. поверх этого ещё и «сетевую модель» построил на их API. Вопрос, насколько это интересно аудитории?

Из наших вики:
В основу решения положена система управления конфигурацией cfengine, оперирующая понятиями теории обещаний. Роль сервера при этом сводится к декларированию (версионирование git, транспорт ssh/http(s), обратная связь syslog) пожеланий к каждому из подписанных на него агентов, установленных на хостах сети.

…И понеслась. Нужно только (слегка?) разбавить формат «редбуков», чтобы читатели зевать не начали.
Вот только RegistrationPage, куда кидает не авторизованных, у них рутится на LoginPage. Так что не видать мне гайда. А корень — вообще «under construction».
Отсюда и подозрения, что второй nutanix (продажи через хайп, мимо тех. экспертизы).
  • «s/nexenta/nutanix/». Проклятый склероз. «Гиперконвергентные» которые. Последнее время они как-то исчезли из «передовиц» новостей, но подача этой вот «конвергентности» хорошо запомнилась. Как и вполне конкретные встречные вопросы по части гарантий сохранения данных в такой схеме.
Чем-то nexenta напомнило (хочется верить, что нет).
Вот захожу я на сайт. Чтобы ознакомиться с тех. документацией.
Продираюсь через маркетинг. И…Это что?
  • Надеюсь, я просто не туда пошёл. Поправьте меня, пожалуйста.
Так я тут вроде и не спорю. Просто подсказал что на GO так не получится.
Но я и не профессиональный программист.
То что я пишу, чаще всего похоже на «разводку схемы» между «большим» софтом и в итоге «просто работает». Работает потому, что чуть ли не 9/10 кода занимается разбором проблем. Такой подход был раньше характерен для качественного «монофункционального» софта на C. И появление golang в ряде случаев упростило жизнь.

А вот профессионал (синьор) на java как-то вполне серьёзно объяснял мне почему исключения таки надо прокидывать. И с ним я тоже не спорил, потому что KPI. Разбор исключений в разы тормозит разработку. То что в определённых ситуациях стектрейсы наматываются вплоть до коллапса его софтины — это проблемы «негров». В основном же работает (и даже через тесты проходит, так тестируют).

Вот это, а ещё достаточно низкая энтропия языка приводит к отторжению golang профессионалами с бэкграундом на java/scala/c++/etc.
Мне-то ок, но я-то начинал с asm на всяких микроконтроллерах и basic на самосборном zx-spectrum (с жёсткой адресацией инструкций и циклами через goto, зато прямым доступом к памяти и возможностью легко вклеить кусок на том же asm).
Попробую сформулировать ещё одну не затронутую в комментариях проблему в «открытом» софте. Как она мне представляется.
Консьюмерские (для конечного пользователя) приложения со всеми этими GUI воспринимаются бо́льшей частью как нечто несерьёзное. И труд работающего над GUI оплачивается соответственно.
Есть конечно исключения, но они (вот удивительно) не openSource.
Данная дискриминация выдавливает из области приличных (выросших, сразу такими не бывают) программистов. Для иллюстрации данного тезиса приведу понятие «фронтэндщик» (это ещё политкорректный вариант термина).

Как пример проявления проблемы, рассмотрим состояние моего любимого (именно в части UI/UX) kMail. Поколению next стало скучно возиться с (просто работающим) maildir, и молодые люди придумали новую абстракцию: akonadi. Внизу (по умолчанию) mysql (потому что все знают), в прослойке какой-то ORM. Теперь письмо — это запись в БД (эй, а почему так медленно?!). Но ладно медленно. Какая-то безобидная раньше (на maildir) операция может защёлкнуть deadlock, и мне как пользователю пришлось освоить работу с akonadictl. В временами — вот такое. Ещё доставляет способ реализации групповых операций: запрос «where id in (uuid1, uuid2, …)». Полагаю, большинство технарей догадается к чему приведёт попытка удалить несколько тысяч писем.

Ладно, это всё брюзжание. Пойду я исправлять kmail? Нет, т.к. через пару лет придёт ещё одно поколение и ему станет скучно уже́ с akonadi. Будет какой-нибудь kmail3 без вариантов сохранить старый. Я умею пропихнуть желаемый патч куда-нибудь в ядро или asterisk, но тут другой уровень проблемы. Старое решение регулярно выбрасывается «потому что надоело».

«Рыночных» способов удерживать опенсорсное GUI на приемлемом для пользователя уровне я в связи с вышеизложенным тупо не вижу. С моей точки зрения, проблемы с UI/UX являются частным случаем выдавливания квалифицированных кадров в более интересные/мотивирующие области деятельности. Кто хорошо разобрался с GUI — тех разбирают большие софтверные компании и им уже́ просто некогда. Остальные реализуют себя как-то ещё, им в этой песочнице тоже скучно.

«Вопрос в том, что делать с проблемой которая решений не имеет» (неточная цитата).
Если мы говорим про Go, то там «сложные» ошибки как-то не прижились. Или я слишком туп чтобы такое изготавливать самому.
«Там строка и тут строка. До свидания, пока.» Как-то так на Go выходит функция. (Чаще всего. Некоторым знакомым удаётся писать даже подобие дженериков на гошных интерфейсах, но читать такое тяжко.)
  • И да, пробрасывать ошибки наверх через весь код в Go затруднительно, т.к. «ошибка» — это обычное значение какого-то типа (использовать для этого «error» просто договорились). Меня не напрягает т.к. в основном делаю что-то низкоуровневое и концепции из ООП туда плохо заходят. А профессиональные «прикладники» с бэкграундом в java/C++/etc. заслуженно кидают в Go помидоры. Но нужен ли он им?
Возвращать и ошибку и значение удобно в парсерах.
«Вот в этом куске (значение) случилась (ошибка) разбора». Плюс, «лобовой» способ избежать «побочных эффектов» любителям функционального стиля.
Потому что демон?
Понимаю, сейчас это не модно. Но бывают случаи, когда нужно как можно скромнее потреблять ресурсы. Для этого когда-то был придуман двухкратный форк самого себя. С избавлением от всего лишнего, включая tty*.
Модель «simple» предполагает что «каким родился — таким и пригодился», а тут вообще всё меняется (кроме ppid).
  • Для подобных штук придумали ещё фокус с сигнализацией (STOP самому себе и CONT от поймавшего сигнал супервизора). Но как-то он популярности не получил. Судя по всему, архитектор systemd про это вообще не знал и сделал свой велосипед через dbus.
Но есть нюанс: данный олдскульный хак (как результат, всего один fd у демонизированного процесса, если ему других файлов не надо) при запуске посредством unit-файла в экосистеме одного известного not-a-bug'а приводит к ругани в syslogjournald.
Судя по всему, происходит так:
  1. Вызываем flock() на будущий pid-файл. Понятно что сначала блокировка, может уже́ инстанс был запущен. Он создаётся.
  2. В systemd прилетает inotify, он бросается читать pid (а его ещё нету).
  3. Ругань про невозможность прочитать pid (а тем временем процесс отфоркался, написал в pid что получилось и на следующем заходе всё хорошо).
Железобетонного пруфа не дам, но где-то в недрах этого форума. AFAIR.
Высказывание в том духе что «свободное время закончилось». А если формально «не первый автор а последний соавтор» — мне от этого не легче.

Лично меня добила невозможность завести xneur в моих последних системах (до этого как-то получалось, хотя коллеги с debian «приплыли» годом ранее).
Гм. Померить коэффициент поглощения на длине волны подручного лазера и погреть затем в вакууме до потери формы? (А ещё лучше в динамике мерить отраженную мощность.) Подведённая энергия известна, теплоёмкость уж наверное тоже.
Судя по тому что так не делали, есть какой-то существенный нюанс?
Сейчас работает то что захардкожено в первой части.
Здесь я расписал проект «интерфейса» под финальную реализацию. Теперь — как в бородатом анекдоте про самолёт с бассейнами и т.п…
Т.е. нужно или подождать пока у меня дойдут руки всё это запилить. Или самостоятельно влезть в код и переписать «хоткеи» как удобно. Т.к. код на golang безо всяких «гениальных изысков», влезть и поправить по мелочам — вполне доступно даже для начинающего.
  • Про «всю строку» я пока не делал, т.к. это не типовая для слепого набора проблема. А для «выделить строку и перепечатать в другой раскладке» есть вполне рабочие скрипты. См. ссылки в комментариях к предыдущей части.
  • Но т.к. подобных вопросов довольно много, родилась другая мысль: менять раскладку «последнего набитого». Т.е., добавить опцию «группировать ввод по метке времени» — при слепой печати у некоторых коллег реально получается «пулемёт» из нескольких слов. И только затем настигает осознание что «что-то пошло не так»…
Выше в комментариях приводили ссылку на сборник скриптов.
Или распишите, что конкретно хочется. По Вашей ссылке — куча C++ кода под винду и отсутствие руководства по эксплуатации. Я такое не осилю.
Вот этого?
Навскидку вижу тьюринг-полный язык под винду. С другой стороны, базовая абстракция «что нажимали» не описывает состояние (up|down|повтор).
Такое ощущение что под linux решаемые AutoHotKey проблемы просто не актуальны. Своих полно.
Сейчас фокусная задача — правильно ловить паттерны (не исключая описанную в комментариях к «прошлой серии» экзотику типа «Shift+Caps»). Дальше:
  • Во-первых, перенабор только что введённого в нужной раскладке. Эта задача осталась без решения в linux в 2019 году. И подвигла-таки меня заняться непривычным делом.
  • Прицепить хуки/плагины удобным образом. Раз уж всё равно взялся писать, это получится почти бесплатно. Зато позволит кому надо сразу решать задачу в предметной области, не разбираясь самому в исковой «лапше».

Пока надеюсь обойтись «декларацией блок-схемы». Полных по Тьюрингу языков в *nix и так «выше крыши».
Отличная мысль.
А чтобы запускалось «из коробки», линковать дефолтные конфиги в ресурсы. Лишнюю пару кб в статически слинкованном бинаре вообще не видно.
Насколько я в курсе, golang данному фокусу обучен. Надо попробовать.
Вроде бы наоборот. Но без xneur, действительно, «котлеты подгорели».
Вкручивать автопереключение я лично не планирую, но (как обычно) есть минимум два выхода:
  • Взять имеющийся код и приделать свою функцию проверки. Или из xneur вытащить библиотеку. Но есть нюанс: xswitcher прямо сейчас включен уровнем ниже, и скен-коды от клавиатуры — совсем не то же что события из иксов. Будет желание — могу поделиться кусочком где я к иксам попробовал привернуть. «Много букв», на C.
  • Поучаствовать во второй части. И предложить приемлемый интерфейс для прикручивания «плагинов». Я совсем не против, но пока просто не знаю «как». Будет интерфейс (API) и желающие — появятся и плагины.

Да, иксы должны знать про обе раскладки (за номером 0 и 1). Потому что переключалка идёт к ним и требует «поставь локаль №n». А как её поставить, если нет в списке?
  • Не понятно как оно по Alt+Shift переключает. Где-то пропущен нюанс.

В похожую ситуацию я влипал когда пробовал прикрутить доморощенные скрипты.
Типа вот такого вредного совета.
  • Наверное, для подобных случаев надо прикрутить возможность запускать внешние скрипты вместо встроенного «дёрни за иксы». +Опция «дождаться завершения».
Опишите подробнее, что Вы ожидаете.
Я закладывал свой кейс: «2 основных языка (0 и 1 локали) и ещё какие-то (e.g. китайский) редко».
Возможно, для Вашего случая есть вариант настроить хоткей для перекидывания порядка. Например, (en, ru, ua) vs (en, ua, ru).
Если (зачем-то) надо гонять именно по кольцу, это несложно устроить. Но предложите как это должно управляться.
Я, как закончу собирать «хотелки» — попробую сделать второй «подход к снаряду».

Информация

В рейтинге
Не участвует
Откуда
Санкт-Петербург и область, Россия
Зарегистрирован
Активность