LINUX.ORG.RU

Сообщения wandrien

 

SSD труп?

 apacer, ,

Купил новый SSD в начале лета. Почти им не пользовался. Ситуация:

Model Family:     Apacer AS340/350 SSDs
Device Model:     Apacer AS340 240GB
ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
  1 Raw_Read_Error_Rate     0x0032   100   100   050    Old_age   Always       -       0
  5 Reallocated_Sector_Ct   0x0032   100   100   050    Old_age   Always       -       2
  9 Power_On_Hours          0x0032   100   100   050    Old_age   Always       -       123
 12 Power_Cycle_Count       0x0032   100   100   050    Old_age   Always       -       72
160 Unknown_Attribute       0x0032   100   100   050    Old_age   Always       -       0
161 Unknown_Attribute       0x0033   100   100   050    Pre-fail  Always       -       91
163 Max_Erase_Count         0x0032   100   100   050    Old_age   Always       -       15
164 Average_Erase_Count     0x0032   100   100   050    Old_age   Always       -       2263
165 Unknown_Attribute       0x0032   100   100   050    Old_age   Always       -       11
166 Later_Bad_Block_Count   0x0032   100   100   050    Old_age   Always       -       1
167 SSD_Protect_Mode        0x0032   100   100   050    Old_age   Always       -       6
168 SATA_PHY_Error_Count    0x0032   100   100   050    Old_age   Always       -       5050
169 Unknown_Attribute       0x0032   100   100   050    Old_age   Always       -       100
175 Bad_Cluster_Table_Count 0x0032   100   100   050    Old_age   Always       -       0
176 Erase_Fail_Count_Chip   0x0032   100   100   050    Old_age   Always       -       0
177 Wear_Leveling_Count     0x0032   100   100   050    Old_age   Always       -       0
178 Used_Rsvd_Blk_Cnt_Chip  0x0032   100   100   050    Old_age   Always       -       2
181 Program_Fail_Cnt_Total  0x0032   100   100   050    Old_age   Always       -       0
182 Erase_Fail_Count_Total  0x0032   100   100   050    Old_age   Always       -       0
192 Unexpect_Power_Loss_Ct  0x0032   100   100   050    Old_age   Always       -       28
194 Temperature_Celsius     0x0022   100   100   050    Old_age   Always       -       40
195 Hardware_ECC_Recovered  0x0032   100   100   050    Old_age   Always       -       988957
196 Reallocated_Event_Count 0x0032   100   100   050    Old_age   Always       -       0
197 Current_Pending_Sector  0x0032   100   100   050    Old_age   Always       -       2
198 Offline_Uncorrectable   0x0032   100   100   050    Old_age   Always       -       0
199 UDMA_CRC_Error_Count    0x0032   100   100   050    Old_age   Always       -       0
232 Available_Reservd_Space 0x0032   100   100   050    Old_age   Always       -       91
241 Total_LBAs_Written      0x0030   100   100   050    Old_age   Offline      -       10877
242 Total_LBAs_Read         0x0030   100   100   050    Old_age   Offline      -       39960
245 Unknown_Attribute       0x0032   100   100   050    Old_age   Always       -       19897

Значения Reallocated_Sector_Ct и Current_Pending_Sector пару часов назад показывали 1, сейчас уже 2.

wandrien
()

Почему же весь софт такая шляпа

 

Простите, у меня сгорела жопа.

Полчаса из жизни:

Надо было отредактировать одну картинку, запустил для этого ноут с виндой. Минут 10 любовался на надпись «Очистка. Завершено 0%. Не выключайте компьютер.» Плюнул, взял ноут с Линуксом.

Картинку мне прислали в PDF. Открываю PDF в Libreoffice Draw. Там лист формата A4, на котором вставлена картинка. Тыкаю ПКМ по картинке, выбираю «Save…». Libreoffice Draw предлагает сохранить её с DPI 96, что даёт физический размер изображения около 32x32 сантиметра.

Ну здорово. А взять реальный размер картинки на листе A4, посчитать из этого DPI и предложить по умолчанию адекватное значение DPI — нельзя было?

То есть DPI я должен вычислять сам, видимо. Ну типа, прикладывать линейку к экрану и считать, сколько процентов от отображения листа A4 на экране она занимает? Или как?

Также в меню для картинки есть пункт «Edit with External Tool». Но называется он неправильно. Его правильное название было бы — «Open with External Tool». Потому что он открывает картинку в программе, которая настроена в файловойм менеджере для соответствующего типа файлов. У меня там — просмотрщик картинок.

Ладно. Сохранил. Запускаю GIMP. GIMP версии 3.0 я запускаю первый раз. Он встретил меня диалогом с выбором настроек внешнего вида. То, насколько этот диалог ужасен с точки зрения дизайна UI — не передать словами. Зато переключение вкладок в нём анимированное. И анимация выглядит всрато.

Итак, GIMP запущен. Первое, что меня в нём «порадовало» — всратые менюшки GTK3 без рамок. Менюшки с серым фоном поверх серого содержимого окна. Границ не видно. Найс.

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

$ fastcompmgr -cC 
Another composite manager is already running
Status: 1

При том, что никакой другой композитный менеджер не запущен. Лааадно. С этим разберёмся потом.

Обратно в GIMP. Вот скриншот всего лишь одного окна: https://ibb.co/v6ztVny8

Может я слишком зажрался, но почему всё настолько плохо? Отступы? Расстояния?? Сетка вёрстки? Здравый смысл, в конечном счёте???

wandrien
()

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

 , , ,

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

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

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

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

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

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

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

wandrien
()

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

 , qod, ,

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

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

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

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

wandrien
()

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

 , , , ,

Дорогие теребятки, пишу вам сие письмо из 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
()

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

 , , ,

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

В качестве пет-проекта я потихоньку пилю собственный 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
()

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

 ,

Эту заметку пишу как ответ на коммент в тему Хочу работу с мышкой как в терминале 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
()

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

 ,

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

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

foo<a>(b);

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

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

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

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

wandrien
()

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

 ,

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

Начало игры…

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

wandrien
()

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

 , скриптинг

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

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

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

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

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

wandrien
()

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

 , ,

Откопал ссылку на такую штуку в Арчевики. Простая программа, реализующая для 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

wandrien
()

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

 

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

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

wandrien
()

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

 ,

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

Вот пример:

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

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

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

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

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

wandrien
()

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

 ,

Данная тема создана по следам этого: 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

 , ,

В теме Это правда, что большинство пользовательских программ в 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, лишь бы только не конкурировать с собственными полноценными процессорами.

wandrien
()

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

 ,

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

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

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

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

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

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

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

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

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

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

wandrien
()

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

 , fastcompmgr, ,

Вышел первый публичный релиз нового композитного менеджера для 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%

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

wandrien
()

В Debian завезли AUR

 , , makedeb, pacstall,

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

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

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

wandrien
()

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

 , ,

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

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

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

wandrien
()

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

 

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

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

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

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

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

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

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

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

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

wandrien
()

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