LINUX.ORG.RU

Сообщения wandrien

 

shell-script, у тебя всё хорошо?

 

То есть

Если ты про руби, то у тебя куча ошибок в слове «всратые»

— не нарушает никаких правил форума.

А ответ

Типичный фанатик. Кроме сортирных, других мыслей в голове нет.

— это 4.3.

З.Ы. Ну раз сайт требует поставить тэг, то пусть будет швим.

wandrien
()

Ну что, почалося? BrВИМ!

 ,

Помоги перенести скрипт bash -> sh

Сообщение удалено bryak по причине 4.3 Провокация flame (-1)

Почему бы не переписать скрипт на Python?

Или тебе принципиально хочется пострадать?

EXL ★★★★★ (05.03.21 13:53:43)

Сообщение удалено bryak по причине 4.1 Offtopic (0)

Ответ на: комментарий от EXL 05.03.21 13:53:43

Ему даже bash запрещают. А ты python предлагаешь.

wandrien (05.03.21 13:54:58)

Тебе заняться больше нечем??

wandrien
()

«Простой» синтаксис

 ,

Небольшая задача. Вот так — не работает:

Ext_Ajax_promise = async function(options) {
    return new Promise(function(resolve, reject) {
        options.callback = function(options, success, response) {
            let result = {
                response: response,
                options: options
            }
            (success ? resolve : reject)(result);
        }
        Ext.Ajax.request(options);
    });
}

Кто за 2 секунды понял, почему, — тот молодец и гуру джаваскрипта. А я не молодец, я ломал голову минут 10.

Если кто-то не догадался, где ошибка, то смотрите историю правок поста — там скрыта рабочая версия.

Мораль простая: не слушайте адептов «простого синтаксиса» и всегда шарашьте точки с запятой.

Задавайте ваши ответы.

wandrien
()

Выбор встраиваемого интерпретатора

 , ,

Привет! Поделитесь опытом внедрения разных встраиваемых реализаций.

Есть идея для одного приложения. Планирую, что оно будет поставляться в двух вариантах:

  • Как обычное веб-приложение для развёртывания и запуска на сервере.
  • Как статический бинарь (appimage?) со всем кодом внутри. «Запустил и работает», для локалхоста.

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

В связи с этим встал вопрос о выборе встраиваемого интерпретатора и соответственно языка. Пока работа над основным кодом не начата, и у меня есть только небольшой прототип на Ruby, еще не поздно сменить язык.

Вспомнились такие встройки:

  • Для Ruby: mruby
  • Для Python: micropython
  • Для JS: quickjs, duktape, десятки их

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

Мой вопрос в том, какой инструмент выбрать. Взяв какой язык и какой встраиваемый интерпретатор я поимею наименьшее количество проблем по поддержанию совместимости кода приложения одновременно с мейнстримовым интерпретатором и со встраиваемым?

P.S.:

Жирный V8 в appimage тащить не хочу. Электрон не предлагать.

wandrien
()

Добавление столбцов

 ,

Есть ли разница, добавлять новые столбцы в таблицу после последнего столбца или где-нибудь в середине списка?

Разница по производительности работы таблицы или еще какие-то подводные камни?

wandrien
()

Как мне в питоне включить отладочный лог для единственного модуля?

 ,

Извините, но я прочитал https://docs.python.org/3/library/logging.html и нихрена не понял.

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

Что они курили и что курить теперь мне?

UPD:

В качестве решения сделал модуль для манки-патчинга дефолтного логгера. См. в комментариях.

wandrien
()

list comprehensions

 , ,

В очередной раз при правке кода на питоне у меня пригорело от list comprehensions.

А вот что пишут настоящие живые люди, которых никто не заставляет под дулом пистолета:

I find the list comprehension much clearer than filter+lambda

Или:

Personally I find list comprehensions easier to read. It is more explicit what is happening from the expression [i for i in list if i.attribute == value] as all the behaviour is on the surface not inside the filter function.

Ну давайте посмотрим, как этот much clearer way выглядит in the wild. Как-то так:

    def getSupportedTrackers(self):
        trackers = self.getTrackers()

        if not self.site.connection_server.tor_manager.enabled:
            trackers = [tracker for tracker in trackers if ".onion" not in tracker]

        trackers = [tracker for tracker in trackers if self.getAddressParts(tracker)]  # Remove trackers with unknown address

        if "ipv6" not in self.site.connection_server.supported_ip_types:
            trackers = [tracker for tracker in trackers if helper.getIpType(self.getAddressParts(tracker)["ip"]) != "ipv6"]

        return trackers

Просто сплошной [blabla for blabla in blablas if ...blabla...].

Просто в начале каждой такой строки ты должен мысленно стирать кусок [tracker for tracker in trackers if и читать, что же там дальше. И как писал Роберт Мартин в «Чистом коде», любые конструкции, которые принуждают читателя тренироваться пропускать себя мимо глаз, являются источником скрытых ошибок. Пропустив 500 раз мимо глаз типовой фрагмент кода, на 501-й раз вы пропускаете ПОЧТИ такой же фрагмент, в котором содержится ошибка. И в силу одинаковой натренированности рефлексов у всех разработчиков продукта, эта ошибка может оставаться незамеченной годами.

Давайте посмотрим, как этот же код можно преписать на лямбдах на руби:

    def getSupportedTrackers():
        trackers = @getTrackers()

        if not @site.connection_server.tor_manager.enabled
            trackers = trackers.filter {|tracker| not tracker.include? ".onion"}
        end

        trackers = trackers.filter {|tracker| @getAddressParts(tracker)}

        if not @site.connection_server.supported_ip_types.include? "ipv6"
            trackers = trackers.filter {|tracker| helper.getIpType(@getAddressParts(tracker)["ip"]) != "ipv6"}
        end

        return trackers
    end

Уже стало лучше за счёт уменьшения количества бойлерплейта, который приходится пропускать мимо. Но 3 вызова trackers.filter подряд и два идентичных вызова getAddressParts говорят нам, что этот код надо переписать.

Заметьте, что необходимость рефакторинга для устранения дублирования не была очевидна в коде с list comprehensions, потому что они за своей многословностью и нечитабельным синтаксисом скрывают суть происходящего.

Убираем дублирование:

    def getSupportedTrackers()
        tor_enabled = @site.connection_server.tor_manager.enabled
        ipv6_enabled = @site.connection_server.supported_ip_types.include? "ipv6"

        trackers = @getTrackers()

        trackers = trackers.filter {|tracker|
            if (not tor_enabled) and (tracker.include? ".onion")
                next false
            end

            address_parts = @getAddressParts(tracker)
            if not address_parts
                next false
            end

            if (not ipv6_enabled) and (helper.getIpType(address_parts["ip"]) == "ipv6")
                next false
            end

            next true
        }

        return trackers
    end

Этот код хотя и выглядит не так компактно при взгляде на экран издалека, на самом деле проще в чтении и в поддержке. Здесь нет дублирования, которое заставляет читателя многократно сверять строки, чтобы убедиться, что разработчик имел в виду именно то, что увидел читатель. А каждая строка выражает свою мысль без лишних бессмысленных слов, которые нужно отфильтровывать глазами.

P.S. Или для любителей длинных однострочников:

    def getSupportedTrackers()
        tor_enabled = @site.connection_server.tor_manager.enabled
        ipv6_enabled = @site.connection_server.supported_ip_types.include? "ipv6"

        trackers = @getTrackers()

        trackers = trackers.filter {|tracker|
            next false if (not tor_enabled) and (tracker.include? ".onion")

            address_parts = @getAddressParts(tracker)
            next false if not address_parts

            next false if (not ipv6_enabled) and (helper.getIpType(address_parts["ip"]) == "ipv6")

            next true
        }

        return trackers
    end

Но этот вариант по моему мнению хуже.

Перемещено leave из talks

wandrien
()

Статья: Устройство подсистемы TTY

 ,

Опубликовал статью, посвященную устройству подсистемы TTY.

Подсистема TTY — одна из ключевых особенностей Unix и Unix-подобных операционных систем.

В этой статье я постараюсь кратко, но достаточно ёмко и доступно для читателей разного уровня подготовки разобрать устройство подсистемы TTY и её взаимодействие с другими частями программной среды.

Описание архитектуры TTY, изложенное здесь, не является на 100% корректным. Некоторые части были намеренно упрощены или опущены, чтобы итоговая картина получилась более простой и цельной. Эти детали не являются критичными для понимания принципов работы TTY. При необходимости все необходимые детали могут быть восстановлены чтением страниц руководств в составе операционной системы.

Статья представляет собой высокоуровневое описание функциональных частей и режимов TTY с точки зрения пользователя или прикладного программиста.

>> Подробности

wandrien
()

Не совсем Windows calculator не совсем портировали на Linux

 

Windows calculator портировали на Linux

В таком виде — вызывающе неверная информация. См. подтверждение здесь: Windows calculator портировали на Linux (комментарий)

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

wandrien
()

Блокировать сайты в поисковой выдаче

 ,

Отщепенцы со дна общества под названием «оптимизаторы» придумали новый способ поискового спама для обхода эвристик Гугла: переводить машинным переводом Stack Overflow и заливать типа сайты вопросов и ответов на русском и других языках.

Зачастую этот мусор в результатах поиска оказывается выше, чем страницы, с которых он был спи^Wпереведён.

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

В общем, поставил в лису uBlacklist. Всем рекомендую.

wandrien
()

Куда утекает память?

 ,

Показания htop: https://ibb.co/fC34MBw

В первую очередь проверил tmpfs, там пусто:

$ df -h -t tmpfs
Файловая система Размер Использовано  Дост Использовано% Cмонтировано в
run                3,9G         1,6M  3,9G            1% /run
tmpfs              3,9G            0  3,9G            0% /dev/shm
tmpfs              4,0M            0  4,0M            0% /sys/fs/cgroup
tmpfs              6,2G          96K  6,2G            1% /tmp
tmpfs              788M         116K  788M            1% /run/user/1000

Главный подозреваемый – ядерный модуль VirtualBox.

Вчера днём утекло около 3 гигов. Перезагрузил, запустил VBox, оставил на ночь. За ночь утекло еще 6.

wandrien
()

И ты, Брут...

 ,

https://git.archlinux.org/pacman.git/commit/?id=454ea024383eab60295e4c4fdf2c329475887b2c

2020-05-11 This removes support for autotools in favour of meson.

Этому миру нужен герой…

wandrien
()

Bedrock Linux

 ,

Bedrock Linux – это «метадистрибутив», что в понимании авторов означает «программа для управления другими дистрибутивами».

Вы ставите любой дистрибутив по вкусу (из списка поддерживаемых) тем способом, который вам нравится. После этого запускаете установщик Bedrock Linux. Bedrock Linux перехватывает управление над системой, внедряясь в качестве дефолтного инита, изменяя и добавляя точки монтирования и т.п. После перезагрузки вы оказываетесь в системе, которая работает «внутри» Bedrock Linux. Вы можете устанавливать другие операционные системы семейства Linux «рядом» с основной системой и свободно смешивать софт из них. (Общий /bin, список файлов *.desktop, bash-completion, man pages и другие интеграционные фичи).

Библиотеки при этом не общие, таким образом дистрибутивы не нарушают бинарную совместимость друг друга.

Это всё красивая теория. Что на практике:

Я пожертвовал установленным на флешке Арчем, чтобы поэкспериментировать с Bedrock. Этот Арч, как и все мои Арчи, представляет собой клона основной системы, которая работает около 10 лет без переустановок. Так что я заранее был готов, что при накатывании сверху Bedrock всё развалится. Как пишут авторы, они тестируют работу системы только поверх свежеустановленного дистрибутива.

Для начала:

# ./bedrock-linux-0.7.17-x86_64.sh --hijack Arch
No file detected at /sbin/init.  Unable to hijack init system.

Смотрим в код. Установочный скрипт даже не пытается обнаружить, какой инит на самом деле использован:

    if ! [ -r "/sbin/init" ]; then
        abort "No file detected at /sbin/init.  Unable to hijack init system."
    fi

Мне лень писать ln -s ... вручную, поэтому просто ставлю пакет, который притащит нужный симлинк:

# pacman -S systemd-sysvcompat

Вот такой у меня повидавший жизнь и кучу апдейтов экземпляр Арча, в котором не стоит systemd-sysvcompat. Ладно, пофиксил, едем дальше.

Запускаю установку, на этот раз Bedrock ставится нормально. Говорит, что внедрился в операционную систему, и что надо перезагрузиться.

Сначала смотрю, что он сделал:

  • Создал директорию /bedrock со своими конфигами и бинарниками.
  • Заменил симлинк /sbin/init на свой скрипт запуска.

Других изменений не заметно.

Конфиг в /boot/grub/grub.cfg не поправил и даже не сказал, что я должен это проверить. А в конфиге вписан совсем не тот init:

menuentry "Archlinux Ester (mainline)" {
    linux /boot/vmlinuz-linux root=$root_dev ro init=/usr/lib/systemd/systemd
    initrd /boot/initramfs-linux.img
}

Правлю инит. Перезагружаюсь.

Получаю сообщение «No suitable video mode found. Booting in blind mode.» и… система не грузится.

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

Догадываюсь, что Bedrock пытается на чёрном экране показать мне своё boot menu. Нажимаю enter. Запускается systemd. Ура, у нас есть картинка.

Снова лезу в /boot/grub/grub.cfg. Добавляю строку insmod all_video. Перезагружаюсь.

На этот раз всё нормально, Bedrock рисует загрузочное меню, и оно отображается на экране. Предлагает грузиться через systemd или через runit-init, который у меня, оказывается, тоже установлен. Я и не помню, что его сюда ставил. Правда, в runit-init грузиться смысла нет, половина программ в Арче просто не поймут отсутствие systemd.

Загружаюсь. Сети у приложений нет. Обнаруживаю, что у меня хаос в ip route и в /etc/resolve.conf. NetworkManager видит Wifi, но, видимо, какой-то подземный стук вмешался в работу. Вручную правлю маршруты и резолверы имён. Сеть появляется.

==> Вы находитесь здесь.

Теперь надо разобраться, что мешает автоматике настраивать сеть правильно. Пока на этом из приключений всё. И дальше можно ставить рядом приложения из Debian, Void, Alpine, да хоть Gentoo компилировать.

Stay tuned!

wandrien
()

hacktoberfest

 

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

Какие вам присылали бессмысленные PR-ы?

wandrien
()

DOS Subsystem for Linux

 

Там opennet наркоманию принёс:

https://www.opennet.ru/opennews/art.shtml?num=53791

wandrien
()

Нашел залежи документации

 ,

Нашел случайно. Чей сервер, не знаю:

https://doc.lagout.org/

Не всё на английском, часть на французском. Есть как историческая информация, так и актуальная.

wandrien
()

Хомяк в облаке. Версия для гика

 ,

Оказался на выходных без своего ноутбука и с необходимостью починить и настроить Windows 7, которую ни в коем случае нельзя переустанавливать. (Куча софта для организации, частично крякнутого, частично лицензионного, и бог знает как всё это накатывать с правильными настройками.)

Комп получил в состоянии «не грузится даже в безопасном режиме».

Винда полтора дня любила мне голову, и в итоге я ее поборол. Но в процессе *надцатой загрузки линукса с live usb, подумал — хорошо бы иметь такую репу на гитхабе, которую скачиваешь, запускаешь оттуда скрипт, и дальше он сам скачивает недостающее, компилирует необходимый софт, синкает конфиги, все раскладывает по каталогам нужным образом, и я получаю готовый хомяк со всем нужным софтом, с правильными настройками, гарантированно нужных версий, независимо от конкретного дистрибутива, в котором всё это запущено.

Решил, как вернусь домой, попробую реализовать эту идею.

Используете такой подход? Сталкивались с какими-то подводными камнями при этом?

wandrien
()

Безмятежность

 , , , ,

Эти вечные вопросы, что тревожат умы… Что ставить? GNOME, KDE или Xfce? А может Mate или Cinnamon? И в каком дистрибутиве лучше готовят KDE? И что делать, когда что-нибудь отваливается? Не было печали — апдетов накачали…

Мой лаптоп под управлением Arch Linux обитает вдали от этих бурь. При обновлениях системы ничего не отваливается уже очень давно. А когда отваливалось, то чинилось элементарно.

Недавно пытался вспомнить, сколько лет я пользуюсь этой копией установленной системы. Так и не вспомнил точно. По одним прикидкам получается 9 лет, по другим больше 10-ти. И ни разу за эти годы система не была в состоянии «не загружается» или «не логинится». Хотя отдельные косяки, разумеется, случались.

При этом я наживую, без переустановок, мигрировал с 32 бита на 64, с grub-legacy на grub2, со скриптов на systemd. Два раза переносил запущенную систему с одного накопителя на другой. Не обновлялся по 8 месяцев, игнорируя городские легенды, что Арч не любит долгих пауз в обновлениях. И ставил кучу программ из AUR, которые согласно тем же легендам должны было непременно угробить систему.

Так что на основе многолетнего опыта эксплуатации могу сказать уверенно, что чтобы развалить Арч нужно иметь исключительно кривые лапки.

Ну а DE… А что DE?… Она не ломается, если её нет.

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

Да, я так и не сделал релиза SDE. Не реализовал половину запланированных фич. И не добавил половину программ, которые должны быть в составе оболочки рабочего стола.

Но использование этого компьютера настолько не вызывает тревог, что у меня практически не было стимула что-то доделывать. Все предыдущие 5 лет я уделял много внимания чему угодно, только не проекту SDE, потому что я практически не вспоминаю о его существовании: он просто работает, выполняет свои функции, просто не мешает мне заниматься на компьютере своими делами.

На скриншоте:

Панель виджетов waterline. Сбоку настроена классическая панель задач с часами, треем, регулятором громкости и т.п. Свёрнутые окна рисуются затенёнными иконками. Также можно включить показ реального изображения окна вместо иконок. Снизу меню приложений, меню доступа к каталогам, переключатель воркспейсов и плагин multiload. В правом верхнем углу напоминание о memento mori. Убавляется каждый день. Просто напоминает, что мои шансы увидеть там «0» очень невелики. Оно реализовано shell-скриптом, потому что на панели можно создавать виджеты, управляемые внешней программой.

На рабочем столе два линка на списки дел. Больше ничего на рабочем столе обычно не держу. Если же всё-таки кладу туда что-то, то специально, чтобы оно было на глазах – чтобы не забыть. Рабочий стол управляется программой stuurman-desktop. Двойным щелчком по рабочему столу можно скрыть или показать иконки. Обои меняются в случайном порядке скриптом каждые две минуты.

В трее менеджер буфера обмена rainbow-cm. Это бывший Parcellite, из которого выкинуто процентов 60 кода, а оставшийся переписан так, чтобы всё-таки работать.

Окнами управляет openbox. Тема оформления для него составлена вручную. Всё управление окнами на хоткеях.

За глобальные хоткеи (не относящиеся к openbox) отвечает xbindkeys.

За кадром остался lilyterm — лучший из всего семейства эмуляторов терминала на базе библиотеки vte. И классика — urxvt, который я недавно наконец-то настроил, и он оказался хорош.

Запуск сеанса обеспечивается старой версией lxsession, когда её еще не успели переписать на vala. Всё никак не найду времени форкнуть её и добавить немного нужных мне фич. Видимо, не слишком они и нужны.

Больше скриншотов:

  • https://ibb.co/yBBjMvy — меню приложений классическое, по категориям.
  • https://ibb.co/tpP6cyH — рекурсивное меню каталогов и файлов, быстрый доступ ко всему нужному. Можно сразу открыть терминал в каталоге проекта и начать работу. Или открыть файловый менеджер в каталоге. Или сразу открыть файл.
  • https://ibb.co/BPqmbft — текстовый редактор qk, форк medit. Мой основной редактор.
  • https://ibb.co/cFdTykT — это редактор SynWrite, который разрабатывался by @Alexey_Tor. Редактор под оффтопик. Но прекрасно работает под wine. Поставил в качестве эксперимента. И в целом, да. Ведь почему бы и нет: если под Windows разработан софт под свободными лицензиями, то почему бы им не пользоваться?
wandrien
()

Очень странный баг

 ,

Сабж, выделил на скрине красным: https://ibb.co/3fxDbqB

Кусок интерфейса окна снизу (основное окно poedit) просачивается в виде узкой вертикальной полосы на окно сверху (диалог поиска).

Ладно, допустим, что там gtk3 рисует в пределах окон одного приложения — его личное дело. Но полоса проходит по заголовку окна, а заголовок принадлежит оконному менеджеру.

Получается что? Получается, gtk3 берёт хэндл top-level окна (не клиентского, а именно openbox-ового окна) и зачем-то в него рисует.

wandrien
()

Открыть каталог с 500 тыс. файлов...

 ,

По следам темы: разыскивается файловый менеджер

Решил протестировать.

Создал каталог с 500 тысячами файлов.

Во всех ФМ стояла сортировка по имени. Точное время не засекал. Каждому ФМ давал 30 секунд на работу. Кто не справился — в таблице написано «дисквалифицирован».

ФМРезультат
nnnоткрывает очень быстро
vifmоткрывает быстро
mcоткрывает быстро
spacefmоткрывает быстро
PathFinderоткрывает секунд за 15-20
xfeдисквалифицирован
pcmanfmдисквалифицирован
stuurmanначинает строить список инкрементально. Но после 100000 скорость падает нелинейно. Так до конца и не добрался.
dolphinстроит список инкрементально. успел одолеть 300000
thunarдисквалифицирован
doublecmdдисквалифицирован
rox-filerна пределе отрезка времени, но открывает
workerна пределе, но открывает

Итого, безусловный фаворит — spacefm:

  • Работает быстро.
  • Имеет графический интерфейс.
  • Многопанельник.
  • Очень конфигурабельный.

Мой stuurman слился. Надо переделывать алгоритм.

wandrien
()

RSS подписка на новые темы