LINUX.ORG.RU

Сообщения wandrien

 

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

Форум — Development

Вытащу сюда вопрос из темы.

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

Алгоритм, который мне известен:

1. Расширить операнды знаком в 2 раза. 2. Перемножить расширенные операнды алгоритмом беззнакового умножения, получив произведение, которое имеет в 4 раза больше бит, чем исходные операнды. 3. Трактуем произведение как число в дополнительном коде: если полученное значение укладывается в диапазон значений исходного типа, то переполнения нет, если не укладывается — значит переполнение.

Ну то есть, например: для перемножения 256-битных чисел нам придётся оперировать 1024-битным произведением. Что несколько дохрена.

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

(UPD: не, вроде херня какая-то)

 , , ,

wandrien
()

Qod. Опубликовал исходники компилятора, над которым работаю

Форум — Development

Финально определился с названием языка, подчистил разные хвосты и написал README. Теперь наконец-то можно посмотреть на нечто большее, чем просто фрагменты кода в постах на форуме: https://github.com/wandrien/qod/

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

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

А пока можно посмотреть на сам код вживую.

 , qod, ,

wandrien
()

Понедельник начинается в субботу, а пятница начинается в понедельник

Форум — Talks

Дорогие теребятки, пишу вам сие письмо из Firefox 67 как из машины времени.

Сейчас буду обновлять Arch, который не обновлялся больше 5 лет. Пожелайте мне удачи. Узнаем, насколько кривые руки у тех, кто ноет, что у них Арч разваливается постоянно.

[vadim@rihanna ~]$ last -F reboot | head -3
reboot   system boot  5.1.15-zen1-1-ze Mon Dec  9 22:51:55 2024   still running
reboot   system boot  5.1.15-zen1-1-ze Mon Mar 28 18:30:13 2022 - Mon Mar 28 11:35:41 2022  (-6:54)
reboot   system boot  5.1.15-zen1-1-ze Thu Jul  4 22:37:19 2019 - Thu Jul  4 16:27:51 2019  (-6:09)
[vadim@rihanna ~]$ tail -1 /var/log/pacman.log 
[2019-07-04 15:47] [ALPM] running 'update-desktop-database.hook'...
[vadim@rihanna ~]$ uname -a
Linux rihanna 5.1.15-zen1-1-zen #1 ZEN SMP PREEMPT Tue Jun 25 04:49:28 UTC 2019 x86_64 GNU/Linux
[vadim@rihanna ~]$ pacman -Q glibc
glibc 2.29-3
[vadim@rihanna ~]$ firefox --version 
Mozilla Firefox 67.0.4

А, да. Железо, в которое я сейчас сунул этот HDD:

[vadim@rihanna ~]$ grep 'model name' /proc/cpuinfo 
model name	: Intel(R) Pentium(R) Dual  CPU  E2180  @ 2.00GHz
model name	: Intel(R) Pentium(R) Dual  CPU  E2180  @ 2.00GHz
[vadim@rihanna ~]$ free -m
              total        used        free      shared  buff/cache   available
Mem:           2998         617        1707          36         673        2195
Swap:          8941           0        8941
[vadim@rihanna ~]$ lspci | grep VGA
01:00.0 VGA compatible controller: NVIDIA Corporation G72 [GeForce 7300 LE] (rev a1)

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

У меня лежит проц, который как раз сюда годится. Core 2 Duo E8300, если не переврал название по памяти. А в материнке есть 4 слота ОЗУ, так что можно поставить 8 гигов. Купил себе конструктор Лего, короче.

Надеюсь, из Нуво и ядра не выкинули поддержку этого GPU. Но гуглить я это конечно же не буду. Узнаю после рестарта.

 , , , ,

wandrien
()

Пилю генератор кода для компилятора

Форум — Development

Здравствуйте, теребятки! С вами наша непостоянная рубрика ненормальное программирование.

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

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

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

Некоторые используемые приёмы оптимизации:

  1. Отслеживание, какие константы или значения выражений загружены в регистры и устранение избыточных загрузок.
  2. Переупорядочивание вычисления операндов выражения.
  3. Устранение выдачи неиспользованных меток. (Помогает лучше отслеживать состояние регистров в п.1.)
  4. Устранение избыточных цепочек jmp-ов. (Когда jmp делается на следующий jmp.)

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

Пример 1.

Генератор кода устранил 4 инструкции mov EAX, dword [EBP+8], так как увидел, что значение переменной Index уже загружено в регистр.

Функция:

char @DictGetFullyQualifiedName(word D)
	when D >= nDict:
		StopInternal(__FILE__, __LINE__);

	word Index = Dict[D].FullyQualifiedName;
	when Index != 0:
		return @Char[Index];

	char Buff[nBUFF];
	strbuf buf;
	strbuf_init(@buf, @Buff, nBUFF);
	Dict_MakeFullyQualifiedName(@buf, D);

	Index = SaveString0(@Buff);
	Dict[D].FullyQualifiedName = Index;
	return @Char[Index];
end

Сгенерированный код:

@10342:                                  ; ## DictGetFullyQualifiedName ##
        push    EBP
        mov     EBP,  ESP
        sub     ESP,  144
                                         ; #line compiler_dict.ctxi:84
        mov     EAX,  dword [EBP+8]
        cmp     EAX,  dword [@@DATA+8476676]
        jb      @10343
                                         ; #line compiler_dict.ctxi:85
        push    dword 85
        push    dword @@ROLITERALS+7329
        call    @10235                   ; StopInternal
@10343: 
                                         ; #line compiler_dict.ctxi:87
        mov     EAX,  dword [EBP+8]
        imul    EAX,  77
        mov     EAX,  dword [@@DATA+EAX+776684]
        mov     dword [EBP-4], EAX
                                         ; #line compiler_dict.ctxi:88
                                         ; Node link reuse in CodePrimaryWrapped
        ; Переиспользуется значение Index в регистре EAX
        test    EAX,  EAX
        je      @10346
                                         ; #line compiler_dict.ctxi:89
                                         ; Node link reuse in CodePrimaryWrapped
        ; Переиспользуется значение Index в регистре EAX
        add     EAX,  @@DATA+49288
        leave
        ret     4
@10346: 
                                         ; #line compiler_dict.ctxi:91
                                         ; #line compiler_dict.ctxi:92
                                         ; #line compiler_dict.ctxi:93
        push    dword 128
        lea     EAX,  [EBP-132]
        push    EAX
        lea     EAX,  [EBP-144]
        push    EAX
        call    @10126                   ; strbuf_init
                                         ; #line compiler_dict.ctxi:94
        push    dword [EBP+8]
        lea     EAX,  [EBP-144]
        push    EAX
        call    @10335                   ; Dict_MakeFullyQualifiedName
                                         ; #line compiler_dict.ctxi:96
        lea     EAX,  [EBP-132]
        push    EAX
        call    @10272                   ; SaveString0
        mov     dword [EBP-4], EAX
                                         ; #line compiler_dict.ctxi:97
                                         ; Node link reuse in Code_ASSIGN (1)
        ; Переиспользуется значение Index в регистре EAX
        mov     EBX,  dword [EBP+8]
        imul    EBX,  77
        mov     dword [@@DATA+EBX+776684], EAX
                                         ; #line compiler_dict.ctxi:98
                                         ; Node link reuse in CodePrimaryWrapped
        ; Переиспользуется значение Index в регистре EAX
        add     EAX,  @@DATA+49288
        leave
        ret     4

В этом примере есть интересный фрагмент:

        mov     EAX,  dword [EBP+8]
        cmp     EAX,  dword [@@DATA+8476676]
        jb      @10343
                                         ; #line compiler_dict.ctxi:85
        push    dword 85
        push    dword @@ROLITERALS+7329
        call    @10235                   ; StopInternal
@10343: 
                                         ; #line compiler_dict.ctxi:87
        mov     EAX,  dword [EBP+8]

Здесь также можно было бы устранить повторную загрузку mov EAX, dword [EBP+8], но это пока не реализовано.

  1. Компилятор знает, что StopInternal не возвращает управление.
  2. Единственный переход по метке @10343 выполняется из места, в котором EAX уже содержит нужное значение.
  3. Таким образом вторая загрузка регистра избыточна.
  4. Но чтобы отследить это, необходим продвинутый анализ перехода по меткам, делать который в мои планы пока не входит.

Пример 2.

Вот еще пример устранения загрузок локальной переменной. Генератор кода дважды переиспользует значение переменой L в регистре EAX:

	word L = strlen(@Dst);
	if L > 1 then
		if str_has_char(@fpath_p_dir_separators, Dst[L - 1]) == 0 then
			strn_cat(@Dst, @fpath_p_dir_separator, Size);
		end:if
	end:if
                                         ; #line include/fpath.ctxi:131
        push    dword [EBP+8]
        call    @10013                   ; strlen
        mov     dword [EBP-4], EAX
                                         ; #line include/fpath.ctxi:132
                                         ; Node link reuse in CodePrimaryWrapped
        cmp     EAX,  1
        jbe     @10179
                                         ; #line include/fpath.ctxi:133
                                         ; Node link reuse in CodePrimaryWrapped
        dec     EAX
        add     EAX,  dword [EBP+8]
        mov      AL,  byte  [EAX]
        push    EAX
        push    dword [@@DATA+44]
        call    @10106                   ; str_has_char

Пример 3.

В этом примере генератор кода понимает, что можно повторно использовать константу в EAX, но не понимает, что можно повторно использовать указатель в EBX.

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

        mov     EAX,  100000
        mov     EBX,  dword [EBP-8]
        mov     dword [EBX+44], EAX
                                         ; #line compiler_dict.ctxi:117
                                         ; Node link reuse in Code_ASSIGN (1)
        mov     EBX,  dword [EBP-8]
        mov     dword [EBX+32], EAX
                                         ; #line compiler_dict.ctxi:118
                                         ; Node link reuse in Code_ASSIGN (1)
        mov     EBX,  dword [EBP-8]
        mov     dword [EBX+36], EAX
                                         ; #line compiler_dict.ctxi:119
                                         ; Node link reuse in Code_ASSIGN (1)
        mov     EBX,  dword [EBP-8]
        mov     dword [EBX+40], EAX
                                         ; #line compiler_dict.ctxi:120
                                         ; Node link reuse in Code_ASSIGN (1)
        mov     EBX,  dword [EBP-8]
        mov     dword [EBX+12], EAX
                                         ; #line compiler_dict.ctxi:121
                                         ; Node link reuse in Code_ASSIGN (1)
        mov     EBX,  dword [EBP-8]
        mov     dword [EBX+16], EAX
                                         ; #line compiler_dict.ctxi:122
                                         ; Node link reuse in Code_ASSIGN (1)
        mov     EBX,  dword [EBP-8]
        mov     dword [EBX+20], EAX
                                         ; #line compiler_dict.ctxi:123
                                         ; Node link reuse in Code_ASSIGN (1)
        mov     EBX,  dword [EBP-8]
        mov     dword [EBX+24], EAX

Примеры 4, 5, 6.

Устранение загрузок в условных выражениях:

	if rs >= BRACKET_LEX_SIZE | rs < 1 then
		StopInternal(__FILE__, __LINE__);
	end
        mov     EAX,  dword [EBP-8]
        cmp     EAX,  3
        jae     @11156
                                         ; Node link reuse in CodePrimaryWrapped
        cmp     EAX,  1
        jae     @11155
@11156: 
                                         ; #line frontend_syn_brackets.ctxi:40
        push    dword 40
        push    dword @@ROLITERALS+7664
        call    @10235                   ; StopInternal
@11155: 

В теле цикла после проверки условия цикла:

	while i < nOperator do
		word j = i + 1;
		...
        mov     EAX,  dword [EBP-4]
        cmp     EAX,  dword [@@DATA+12180364]
        jae     @11180
                                         ; #line frontend_syn_operators.ctxi:66
                                         ; Node link reuse in CodePrimaryWrapped
        inc     EAX
        mov     dword [EBP-8], EAX
	while i < nOperator do
		if Operator[i].Prio > Prio then
		...
        mov     EAX,  dword [EBP-8]
        cmp     EAX,  dword [@@DATA+12180364]
        jae     @11197
                                         ; #line frontend_syn_operators.ctxi:120
                                         ; Node link reuse in CodePrimaryWrapped
        imul    EAX,  36
        mov     EAX,  dword [@@DATA+EAX+12178080]
        cmp     EAX,  dword [EBP+12]
        jbe     @11198

 , , ,

wandrien
()

Общие сведения о работе терминала

Форум — General

Эту заметку пишу как ответ на коммент в тему Хочу работу с мышкой как в терминале ConEmu Но пишу быстро и по верхам, так что в общий раздел, а не в раздел статьи. Возможно окажется полезным, чтоб ссылаться сюда в случае похожих вопросов у новичков.

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

Ща всё разъясним.

Базово есть такая архитектура:

Приложение-терминал <--> TTY <--> программа, которая хочет общаться через терминал

TTY это компонент ядра. Кроме того, что служит связующим звеном, он также реализует некоторые базовые фичи, которые делают терминал немного «умнее». Дело в том, что исторически терминалы (те самые — физические, аппаратные терминалы) для Unix были концептуально «тупые». То есть умели только выводить текст по командам программы, а также пересылать ей, какие клавиши пользователь нажал. Для некоторых других ОС терминалы были «умные», с продвинутыми средствами работы с данными на стороне терминала. Но в Unix они не применялись. Unix вообще концептуально была про простоту. А ля делай только самое необходимое и не больше.

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

Про работу TTY я писал подробную статью, вот тут можно прочитать: https://wandrien.github.io/articles/tty/

Далее.

Если программа хочет сама продвинуто работать с терминалом, она настраивает TTY, чтобы оно ей не мешало, то есть отключает его логику обработки данных частично или полностью. И таким образом работает с терминалом прозрачно, без особого вмешательства TTY.

Кроме того, что программа настроила TTY, ей нужно еще управлять самим терминалом.

Терминал управляется через некоторый протокол. Этих протоколов и их вариаций за историю была чертова уйма. Обычно конкретное приложение-терминал поддерживает некоторый базовый набор + какие-нибудь специфичные для себя фишки. Кто-то меньше, кто-то больше. Например, если внимательно почитать, сколько команд и режимов работы имеет xterm, там можно потеряться. Ну короче зоопарк как с браузерами или как с поддержкой разных фич в видеокартах.

Для реализации концепции командной строки программы обычно не велосипедят всю логику работы с терминалом с нуля, а берут готовые решения. Часто это библиотека readline. Например, она используется в bash.

В мире BSD-софта вместо readline обычно используется libedit. Ну и еще куча альтернатив есть, как обычно.

Итак, если мы работаем с командным интерпретатором bash, он использует библиотеку readline, реализующую фичи строки ввода, и readline отображает текст в терминале и реагирует на наши команды правки текста.

Если мы работаем с Midnight Commander, то там вместо readline применяется продвинутый тулкит, который реализует окошки, кнопки, поля ввода и так далее.

В zsh, если память не изменяет, используется не readline, а свой отдельный велосипед. (Лень факт-чекать.)

Вот так всё это устроено.

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

Теперь к вопросу про мышь, который был в исходном треде.

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

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

Но! Тут есть обходной путь. Если, например, мы запустим mc и попытаемся выделить текст с нажатой Shift, то увидим, что мышь обрабатывается терминалом, а не mc. Удержание Shift принудительно возвращает обработку мыши в терминал.

Вот вроде и всё, что я хотел вам на эту тему сообщить сегодня. =)

 ,

wandrien
()

Контекстно-зависимость в синтаксисе ЯП

Форум — Development

Вот такой чисто теоретический вопрос, навеянный топиком Странная ошибка c шаблоном (или я идиот, или одно из двух)

В C++ одна из особенностей, делающих грамматику контекстно-зависимой — это неоднозначность парсинга выражения

foo<a>(b);

То ли это шаблонная функция foo<a>, вызываемая с аргументом b.

То ли это выражение (foo < a) > b.

Чтобы это понять, компилятор должен иметь доступ к декларации foo.

Как бы вы сделали эту часть грамматики контекстно-свободной, если бы дизайнили ЯП с нуля? Ваши идеи?

 ,

wandrien
()

В этих пикселях на 102.7% больше сюжета, чем...

Форум — Talks

/Простите, мне некуда это написать, я кроме ЛОРа и еще одного форума нигде не сижу/

Начало игры…

Создаю идеологию из смеси трансгуманизма, ритуализма и кровоедства. Сюжетка – вампирская. На экране выбора пешек сразу прокает сетап: Вампирша 22-х биологических лет возраста и 1941 хронологических. С перком на усердие и огоньками на горном деле, растениеводстве, медицине, общении и умственном труде. А также её дочка 18 лет – трансгуманист, кровожадная, бегун, с огоньками на ближний бой, горное дело и ремесло, да при этом еще и беременная! Сразу жму начать игру, чтобы случайно не рерольнуть такой крутой сетап – у нас тут сразу со старта намечается династия!

Первая осень…

К колонии присоединяется молодая девушка с огоньками в строительстве, искусстве, медицине и умственном труде. Всё бы ничего, вот только она словила комбо перков на дизмораль: завистливость, пессимист, непонятный творец. Оставляю её, хорошие руки и мозги в колонии нужны. Настолько нужны, что у меня нет времени держать её на перевоспитании для смены идеологии. Благо, она частично совместима с моей – в составе есть трансгуманизм и верховенство человека. (И за следующий год времени на перевоспитание так и не найдётся.)

Чуть позже в аварийной капсуле падает её мать. Она боец широкого профиля, крутой медик и строитель. Но снова перки подвели: подавленность и биоконсерватор. А у нас тут планы на тотальную конверсию человеков во всякое.

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

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

Вторая зимовка…

В начале зимы высаживается спящий кластер механоидов с регулятором климата на -10 градусов. Таймер сработает 12-го или 13-го декавраля, перед самым концом зимы. То есть вместо весны меня ждёт вторая зима, а вместо лета – робкая весна и сразу следом снова зима. К такому моя колония не готова, и запасов еды на бесконечную зиму у меня нет.

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

Кластер высадился даже без купольной защиты – мне бы хоть один миномёт и запас боеприпасов.

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

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

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

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

Но вот откладывать дальше некуда – надо хотя бы поставить ёлочку ребятам, а на утро после праздника помолиться и идти в лобовой штурм без дымовой защиты. Какие еще есть варианты? Бросить базу и уйти строить новую, пока еще есть еда. Или тупо пересиживать на месте до лета, экономя жратву и охотясь на диких животных. А там попытаться снова купить дымовухи. Мне не нравится этот вариант, ведь тогда есть риск свариться как лягушка на медленном огне, только вместо огня – холод. Малодушно бросать базу без боя – не нравится еще больше.

Два моих вампира лежат в торпоре, придётся отмечать НГ без них. Ладно, пока все в добром здравии ставим ёлоч… Бзззз! Один чел после похода словил нервный срыв, вернувшись домой холодный и голодный.

Ладно, значит ты не празднуешь, без тебя ставим ёлоч… Бзззз! «Рейд мусорщиков десантируется на вашу базу!»

А ведь.. два моих вампира лежат в торпоре? Чёрт побери! А они двоё сражаются за шестерых.

Мусорщики десантируются прямо на точку, где неприкаянно ходит психанувший колонист. Мне остаётся только беспомощно наблюдать за ним, пока остальные пешки готовятся к обороне. Бесконечно долгие секунды, пока откроются десантные капсулы… Колонист сразу же получает по щщам стальной дубиной и падает – без сознания, но живой. Фух!

Оказывается, за те несколько мгновений, когда сначала видишь тени от садящихся капсул, а потом и сами капсулы, можно о столь многом успеть подумать. И том, что пусть с Маннингом остальные члены колонии не всегда находили общий язык, но все ценили его отличные навыки стрельбы и непререкаемую приверженность нашему учению. Когда-то в самом начале он сам пришел и попросился в колонию как верный последователь нашего дела. А также и о том, что вместе с Маннингом сейчас под десантирующимися капсулами окажется одна из лучших винтовок, и бой придётся принимать не только за минусом трёх бойцов, но и без самого качественного оружия.

Да в рейде-то еще и любовник девчонки, которая сидит у меня в плену. Снова шутки от Ренди.

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

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

А где это любовник… надо посмотреть статы девчонки. Ага, вот он лежит остывает. Не ушел. Еще тридцатника нет, а уже с циррозом печени был. Девчонку не жалко, она ведь тоже не просто так в камере у меня оказалась.

(В этом месте я вспоминаю, как я полгодом ранее пожалел иттакина - вылечил и отпустил. А через неделю он пришел снова в составе другого рейда. Там в землю и лёг.)

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

Ставлю ёлочку. Колонисты собираются на праздник. Проходит несколько секунд:

Бзззз! «Рейд импидов направляется к вашей базе! Враг нападает немедленно!»

Бзззз! «Начинаются сильные заморозки!»

Сразу подряд.

А в составе рейда сын того импида, который у меня сидит в плену уже больше года и служит донором крови вампирам. Отца пришел спасать?

Ладно, какие-то вшивые импиды с луками, всего несколько человек. У меня тут еще и торговец со своей охраной тусит. После мусорщиков под гоу-соком, которые десантировались прямо на голову, импиды это вообще не противник.

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

Среди оставшихся лежать четверо еще живы. С двух снять одежду и оставить истекать кровью в снегу. Третий – тот самый сын, пришедший спасать отца. Захватить и посадить в ту же камеру. Там вы всю свою жизнь и проведёте. Четвёртая… 33 года, «девочка из племени», «беспечный стрелок», «оптимист»… похоже, так бедна, что даже снять с неё нечего. Одета в какие-то лохмотья. Оптимистка, блин… Посреди этого симулятора преступлений против человечности у меня вдруг почему-то дрогнула рука оставить её в снегу. Если выживешь после потери крови и не умрёшь от инфекции, то отпущу.

Бип! «Караван торговцев уходит из-за опасных погодных условий». А почему, снаружи же было -6… в смысле -29? Какой-то лаг в UI, это в холодильнике у меня должно показывать -29…. ЧО РЕАЛЬНО МИНУС ДВАДЦАТЬ ДЕВЯТЬ??? Я смотрю на уведомления, и до меня начинает доходить. Пока я разбирался с импидами, произошло не одно, а два события: три часа назад – начались природные сильные заморозки; час назад – активация искуственной погоды у мехов.

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

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

Все посадки мгновенно вымерзают. С грядок пропадает будущая еда, а еда – это жизнь… Правда, есть еще животные в загоне, но насколько их хватит?

Сама база тоже не приспособлена к таким морозам. Правда у меня есть награбленные обогреватели, даже крафтить не придётся. Но нет запаса по мощности, и не везде есть сеть. Срочно отправить часть колонистов ставить пару дополнительных дровяных генераторов и тянуть провода, а другую – пополнять запасы дров?

И снова тот же вопрос, что и ранее, но теперь в острой форме: всё бросить и уходить? отсиживаться на базе, стараясь пережить самый холод? атаковать мехов немедленно?

Тем временем температура в части помещений падает ниже нуля.

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

Бззз! «Приближаются шамблеры!» …вообще не до вас, ребята зомби… вы там замёрзните как-нибудь в снегах без моего участия, ладно? Еще не хватает классического в такой ситуации «Енот сходит с ума!». Да, Ренди?

Бой проходит относительно удачно. Подвижные дроны уничтожены, двое бойцов – ранены. Тяжело ранена та самая космическая беженка, которую когда-то я хотел выгнать. А сейчас она мой лучший стрелок.

Перед второй фазой боя нужна передышка.

А в это время на базе… у части пленных уже развиваются обморожения. В одной из камер температура упала до -12. В спальне, где весь пол был засажен розами вместо твёрдого настила – вымерли розы. Колонисты тоже плохо переносят холод. Кто был легко одет, к концу боя получили существенную гипотермию. Срочно надо разводить костры, оказывать помощь пленным, думать, как кого переодеть, спасать замерзающих животных в загоне, а все уже на грани нервного срыва и валятся с ног. Одна только дочка главы поселения не унывает и пашет как трактор. Перк кровожадность – сила. После участия в двух мясорубках с кучей убитных врагов, у ней такой запас хорошего настроения, что ничто не может его перебить. А если еще закинуться бодрином, то можно пахать всю ночь и всё утро, пока остальные уже почти сходят с ума.

/здесь пока моё прохождение останавливается/

 ,

wandrien
()

А какие сейчас есть актуальные замены (da|ba|k|)sh для скриптов?

Форум — Development

Пишу сейчас очередной sh-скрипт с кучей вызовов awk, grep и sed. В связи с чем задумался об альтернативах. Попытался сформировать список черт, которые делают sh до сих пор актуальным инструментом:

  • Возможность легко и просто скомпилировать под любой утюг.
  • Отсутствие развесистой библиотеки, которую интерпретатор таскает с собой, а также как следствие — нет слома совместимости между версиями библиотеки.
  • Минимальное время инициализации интерпретатора.
  • Малое потребление памяти.
  • Простой параллелизм через fork.
  • Возможность удобно и просто вызывать внешние команды и пайплайны команд.
  • Возможность прозрачно миксовать внешние команды и собственные функции. (В sh мы делаем command1 | command2, и это работает одинаково, независимо от того, являются ли эти команды собственными функциями или внешними командами.)

Если обобщить, то главным отличием sh от ЯП типа perl, ruby, python и т.п. является композиция программы как совокупности исполняемых модулей, запускаемых как отдельные процессы, в противовес композиции библиотечных модулей, слинкованных в единый процесс.

Главным минусом sh является то, что в нём не развиты средства работы с какими-либо структурами данных, кроме строк. Да и для самих строк средства не развиты.

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

 , скриптинг

wandrien
()

qman — man page viewer здорового человека

Форум — Talks

Откопал ссылку на такую штуку в Арчевики. Простая программа, реализующая для man pages в терминале то, что еще 35 лет назад было в справочных системах под DOS-ом, + большее.

  • Страницы оглавлений, отображающие все маны, установленные в системе, сгруппированные по категориям
  • Интерактивный инкрементальный apropos и whatis (search as you type)
  • Инкрементальный поиск по странице
  • Активные гиперссылки на другие маны
  • Активные гиперссылки на http(s) и email адреса.

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

  • Если в направлении листания на экране есть следующая ссылка, фокус переходит к ней.
  • Если в направлении листания на экране следующей ссылки не видно, текст сдвигается на 1 строку.

Программа реализована на Си с минимумом зависимостей.

Зависимости в собранном виде и размер:

vadim@aquila:~$ ldd /usr/bin/qman
	linux-vdso.so.1 (0x00007dbe6007f000)
	libncursesw.so.6 => /usr/lib/libncursesw.so.6 (0x00007dbe5ffa3000)
	libinih.so.0 => /usr/lib/libinih.so.0 (0x00007dbe5ff9e000)
	libc.so.6 => /usr/lib/libc.so.6 (0x00007dbe5fdb2000)
	/lib64/ld-linux-x86-64.so.2 => /usr/lib64/ld-linux-x86-64.so.2 (0x00007dbe60081000)
vadim@aquila:~$ ls -lh /usr/bin/qman
-rwxr-xr-x 1 root root 116K мая 29 11:43 /usr/bin/qman

Сорцы и скриншоты тут: https://github.com/plp13/qman

 , qman,

wandrien
()

Работа с выводом в терминале как с текстом для последующей обработки

Форум — General

Какие вообще есть решения для этого? Чтобы безмышевозанья.

Иными словами, как программно получить данные из экранного буфера?

 

wandrien
()

Wikipedia — вахтёрская помойка

Форум — Talks

Извиняйте, просто навеяло ночью.

Вот пример:

https://web.archive.org/web/20240128100538/https://en.wikipedia.org/wiki/Zero_Install

По меньшей мере с 2005-го года, то есть почти 20 лет лежала статья, никому не мешала. Содержала ссылки на другие похожие решения и технологии.

В январе 2024-го явился вахтёр и статью удалил как «незначимую».

В чем смысл такой энциклопедии, не очень понятно. Что «Волга впадает в Каспийское море» Гугл и так подскажет, без энциклопедии.

Щас еще осталось поисковые системы полностью на ИИ заменить, и в инете вообще ничего невозможно будет найти ни по какой теме.

 ,

wandrien
()

Линукс и жор памяти

Форум — Desktop

Данная тема создана по следам этого: 750 мб занятой оперативы на старте дистрибутива с XFCE - это норма?

Люди так удивляются, что 4 ГБ – это мало для работы, будто то ли на на дворе 2005, то ли Linux может магически превратить 4 ГБ в 16, и еще пару ядер накинуть на сдачу.

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

Вот картина потребления оперативной памяти без логина в графический сеанс:

https://ibb.co/BNrCWMk

Я отключил все службы, которые нужны лично мне, такие как docker, оставил только системные штуки. Видно, что запущен systemd с базовыми сервисами, NetworkManager, а также lightdm с графическим сеансом, через который отображается окно ввода логина-пароля. Не запущены также штуки, которые часто суют в дистрибутивы по дефолту – cups, wsdd и т.п. (У меня их на этой машине и нет.)

Опускать потребление ниже этой базовой линии возможно только если отказываться от systemd, а также накладывать на систему какие-нибудь кастомные патчи. Это уже получится не линукс мейнстримного вида образца 2024-го года, а специализированная сборка.

А вот после входа в графический сеанс пользователя:

https://ibb.co/m5WCWvP

Опять-таки, я закрыл все штуки, которые лично мне нужны, такие как syncthing или автозапускаемый сеанс в terminator.

Если вместо графической оболочки из нескольких отдельных программ использовать компактный WM типа icewm, то можно подсократить эти числа, чтобы они были ближе к числам на 1-м скриншоте. Но не вижу в этом большого смысла.

Короче говоря, если сравнивать с виндами, то Linux в 2024-м может базово потреблять ОЗУ где-то на уровне Vista. Всё в ваших руках: хотите потребление как у Висты и запуск на старом лаптопе – это возможно, хотите ни в чём себе не отказывать на системе с 64 гигами – это тоже возможно.

На практике после входа в графический сеанс, автозапуска всех нужных служб и приложений и открытия тестового редактора с кучей вкладок потребление памяти у меня составляет 800-900 МБ.

 ,

wandrien
()

Intel N100

Форум — Talks

В теме Это правда, что большинство пользовательских программ в linux больше грузят процессор, чем их альтернативы в windows? увидел сообщение от @amd_amd:

CPU: Intel Pentium 4 3.20GHz (2) @ 3.200GHz

И ответ на него от @haydudogni:

Энергопотребление (TDP): 82 Watt

у меня 8 и это APU

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

Но затем в связи с этим вспомнил недавнее видео с обзором ноута на процессоре N100, и что я как раз хотел создать тему для его обсуждения.

Не знаю, насколько слаб старый APU от AMD у ТСа в той теме, но новые процессоры, которые Intel пропихивает в бюджетный сегмент, тоже не радуют:

https://www.youtube.com/watch?v=pCkM8yRQoMs

Если кратко:

В чисто вычислительных тестах показывает производительность на уровне мобильных Core i3 11-го поколения, что весьма неплохо.

В то же время, в ряде тестов проваливается практически до уровня Core 2 Duo. (o_O)

Основная проблема этого SoC — невероятно задушенная пропускная способность ОЗУ. Это становится особенно критично на фоне того, что встроенный GPU критично чувствителен к скорости работы памяти.

Как результат, ноутбук 2024-го года не в состоянии вытянуть Fallout New Vegas и Skyrim. Производительности системы хватает, чтобы воспроизводить ролики с ютуба. Обзорщик явным образом этого не сказал, но к слову «хватает» определённо просится добавка «впритык».

Вот такие неоднозначные решения делает Intel, лишь бы только не конкурировать с собственными полноценными процессорами.

 , , n100

wandrien
()

Снова о статической типизации

Форум — Development

Пример задачи:

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

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

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

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

Усложненный вариант задачи.

В программе имеются мьютексы m1, m2… mN.

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

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

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

 ,

wandrien
()

fastcompmgr — быстрая альтернатива для picom/compton

Форум — Talks

Вышел первый публичный релиз нового композитного менеджера для X11 на основе исходного кода классического xcompmgr.

CPU usages by compositor:

Compositor      move    resize  scroll
fastcompmgr     6.7%    4.4%    1.5%
xcompmgr        7.8%    4.9%    1.6%
compton         26.4%   6.8%    17.1%
picom           29.3%   8.1%    23.1%

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

 , fastcompmgr, ,

wandrien
()

В Debian завезли AUR

Форум — Talks

Выглядит как сборка пакетов здорового человека:

https://github.com/pacstall/pacstall-programs/blob/master/packages/emacs/emacs.pacscript

Правда вебня свёрстана через одно место. Еще поменьше всплывающее окно нельзя было сделать? https://ibb.co/RDDYVvq

 , , makedeb, pacstall,

wandrien
()

Посоветуйте приложение типа mind mapping-а, но не совсем

Форум — Desktop

Называется, сам не знаю, чего хочу.

Что-то среднее между ming mapping и программой для составления презентаций из слайдов. Чтобы на слайды можно было по-быстрому накидать диаграммы и блок схемы, а отдельные элементы диаграммы сделать ссылками на другие слайды, где этот элемент описан подробнее. Такой древовидный набор слайдов с гиперссылками между ними.

При чем мне даже кажется, что я давно под винду видел что-то такое. А вот под линь – вроде не сталкивался.

 , ,

wandrien
()

Простите, я упустил момент, а когда разрабы LibreOffice упоролись?

Форум — Talks

Или это всегда так было?

  1. Открываем LO Writer.
  2. Идём на панель рисования, создаём на странице что угодно, например, прямоугольник.

В этот момент последовательно и с ощутимой ясно видимой задержкой происходят следующие вещи:

  • Тулбар форматирования текста исчезает.
  • Это приводит к тому, что страница прыгает вверх на высоту данной панели.
  • На тулбаре «Стандарт» происходит отключение части кнопок, в процессе этого они одна за другой перемигиваются огоньками, то есть панель обновляется не атомарно.
  • С еще более долгой задержкой обновляется внешний вид линеек.

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

  • Тулбар форматирования текста появляется.
  • Это приводит к тому, что страница прыгает вниз на высоту данной панели.
  • На тулбаре «Стандарт» происходит включение части кнопок, в процессе этого они одна за другой перемигиваются огоньками, то есть панель обновляется не атомарно.
  • В последнюю очередь обновляется внешний вид линеек.

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

Вот как раз такое я имею в виду, когда говорю, что UI у опенсорса обычно сделан из говна и палок. Лучший офисный пакет, согласно коллективному мнению ЛОРа.

UPD: https://drive.google.com/file/d/1tUBerVKMF7FD1CLnMh3GQYociDC0uKeK/view?usp=sharing

 

wandrien
()

О развитии GUI

Форум — Development

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

  1. Не существует способа узнать положение клавиатурного курсора в окне стороннего приложения. Это необходимо, чтобы открывать произвольные меню и панели «по месту» ввода.
  2. Не существует способа узнать выделенный текст в окне стороннего приложения. Буфер PRIMARY предназначен не для этого, соответственно его содержимое не сбрасывается после сброса выделения.
  3. Не существует надежного способа вставить текст в окно стороннего приложения. Используемые сейчас варианты - это костыли с эмуляцией нажатия клавиш, которые в зависимости от приложения, могут либо не работать, либо давать непредсказуемые эффекты.

Ровно этот же список я мог бы назвать 15 лет назад, с тех пор ничего не изменилось.

Как видно, речь идёт о том, чтобы операции вида «сделать что-то с выделенным текстом» или «вставить результат работы стороннего приложения» могли быть бесшовно интегрированы между приложениями без необходимости хардкодить это в тулките или грузить so-шки с хаками в адресное пространство приложения.

Банальные примеры подобных интеракций:

  • Вставить текущую дату в выбранном пользователем формате.
  • Выполнить выделенный текст как команду оболочки и вставить результат.

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

 

wandrien
()

О пользе хоткеев и межпрограммном взаимодействии

Форум — Development

@qulinxao3 писал:

однако жаль малоиспользуется sam|acme

и в целом логика исполнения текущей строки редактируемого файла(текстового буфера) тем или иным исполнителем и помещение возвращённого результата (побочный итак в глобальности) в тот или иной текстовый контейнер

ззы: ща на ctrl-\ в сode висит Terminal: Run Selected Text ln Active Terminal который при пустом выделении отрабатывает текущую строку - получается нечто парное vim'овскому :r!вотэтовотвыделение

забавно как пламбер оказался не ко времени всё ещё

Я ему ответил:

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

Этот обмен репликами заставил меня вернуться к мыслям об организации хоткеев в SDE. И вот хочу показать вам фрагмент черновика на эту тему.

Также дополнительно к сказанному в черновике хочу сказать следующее:

Я многократно говорил, что задача DE – интеграция программ. Мне на это отвечают, что «интеграция программ» создаёт монстров, примеры которых мы можем наблюдать в KDE и вообще везде.

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

Всё, описанное ниже, доступно к реализации даже при помощи несложного bash-скрипта для любой DE или вообще без DE. Но конечно грамотная реализация на Си – предпочтительнее.

Итак, сам текст:


Хоткеи запуска приложений:

Super + Q - Запустить предпочитаемый эмулятор терминала
Super + W - Запустить предпочитаемый текстовый редактор
Super + E - Запустить предпочитаемый файловый менеджер
Super + R - Показать лаунчер для быстрого запуска команд
Super + T - Запустить предпочитаемый web-браузер
Super + Y - Запустить предпочитаемый калькулятор

Как видно, горячие клавиши выбраны так, чтобы располагаться подряд в 1-й буквенной строке клавиатуры (QWERTY) и не имеют мненомического значения. Порядок клавиш выбран в соответствии с тем, какие приложения обычно наиболее часто востребованы при работе с типичной UNIX-like системой: в первую очередь вам потребуется терминал, во вторую текстовый редактор и так далее.

Хоткеи, использующие выделенный текст как путь к документу:

Super + Shift + Q - Запустить предпочитаемый эмулятор терминала в указанном каталоге
Super + Shift + W - Открыть указанный файл в предпочитаемом текстовом редакторе
Super + Shift + E - Показать указанный файл в предпочитаемом файловом менеджере
Super + Alt   + E - Показать контекстное меню для указанного файла
Super + Shift + R - Показать лаунчер для быстрого запуска команд и выполнить команду для указанного пути
Super + Shift + T - Открыть указанный URL в предпочитаемом web-браузере

Каким образом DE понимает, что является «указанным файлом/каталогом»:

Первый вариант — если выделен некоторый текст.

  1. Если выделенный текст выглядит как URL, то он и считается указанным.
  2. Если выделенный текст выглядит как полный путь (начинается с символа /), то он и считается указанным.
  3. В ином случае выделенный текст считается файловым путём относительно текущего каталога. Следовательно, необходимо найти текущий каталог.
    • Для этого DE извлекает путь к документу из текущего окна.
    • Если путь является существующим каталогом, то он и считается текущим каталогом.
    • Если путь является существующим файлом, то берётся путь к его каталогу.
    • Если путь извлечь или проверить не удалось, то домашний каталог пользователя считается текущим.

Второй вариант — если текст не выделен.

В этом случае DE извлекает путь к документу из текущего окна.

  • Если запускаемое приложение требует только путь к каталогу (как в случае с Super + Shift + Q), то путь урезается до пути к каталогу.
  • В ином случае используется полный путь.

Частные примеры действий, которые становятся вам доступны c использованием данных возможностей:

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

Таким образом ваша работа с документами перестаёт быть приложение-центричной и становится документо-центричной. В фокусе вашего внимания то, С ЧЕМ вы работаете, а не то, КАКИМИ ПРИЛОЖЕНИЯМИ вы работаете. Вы легко можете «перекинуть» один и тот же файл/объект/документ в другое приложение просто нажав хоткей. DE видит и понимает контекст вашей работы.

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

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

 ,

wandrien
()

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