LINUX.ORG.RU

Избранные сообщения PhysShell

Zram vs Zswap. Часть 1: практика

Статьи — Desktop

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

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

( читать дальше... )

 , ,

kirill_rrr
()

linux-0.01 скомпилированный в minix-386 и запущенный в эмуляторе 86box

Галерея — Скриншоты

Я люблю старые программы, мне нравится их изучать и смотреть как они развивались, и во что они сейчас превратились или умерли так и не дожив до современных дней. И по той же самой причине, мне нравится смотреть различных авторов Youtube каналов посвященные ретро тематике в котором авторы рассказывают о корнях программ, игр, приставок или старых компьютерах. И на волне этого, мне захотелось попробовать собрать и запустить, что-то относительно старое, но которое живет и развивается до сих пор. Мой выбор пал на первую версию Linux, версии 0.01.

Те кто знаком с историй создания Linux и её ранних дней, знают, что она писалась Линусом Торвальдсом на 386 машине на которой работала пропатченнная версия Minix 1.5. И не смотря на, то, что есть проект (и не один) позволяющий скомпилировать linux-0.01 на современных версия компиляторов мне же хотелось побыть немного в шкуре самого Линуса и самому собрать ядро в ее родной среде, а именно в Minix и древними версиями GCC.

Те, что интересуется подобной историей (да или просто пользуются гуглом), знают, что такое уже проделывали многократно (посмотрите хотя бы сайт oldlinux.org), но я хотел сделать это всё сам. И вот вооружись энтузиазмом, эмулятором 86Box, старыми версия ПО (многие их которых взяты с вышеупомянутого сайта), а главное ядра Linux, я пошел по стопам Линуса, ну или почти по стопам… :)

Первым делом необходимо было установить классический 16-битный Minix 1.5.10 (верхний левый скрин). При наличии дистрибутива (17 дискет), а также Reference Manual делается это не сложно. Просто необходимо внимательно читать manual Танненбаумана. Единственное замечание по установке в эмуляторе 86Box, так это то, что необходимо в настройках эмулятора (и BIOS) выставить тип 360к для 5 1/4 дисковода, иначе Minix сможет грузится с загрузочной дискеты, но root’овую уже не увидет.

Далее необходимо очень внимательно следовать прекраснейшему руководству от Джона Наллома по превращению в minix-386. На этом этапе каких-либо подводных камней нет (опять же внимательно читаем), единственное необходимо установить тип 1.2M для 5 1/4 дисковода. Также необходимо будет перекомпилировать все бинарные файлы в /bin и /usr/bin. В самом руководстве Джон компилирует только часть их них (сам Брюс Эванс в README на bcc писал, что достаточно только sh :) ). Я же перекомпилировал почти всё.

Затем качаем и ставим готовый компилятор GCC 1.37.1 от Alan W Black’а. Нужно как минимум 3 архива с самим gcc, библиотеками и заголовочными файлами. Главное, ОБЯЗАТЕЛЬНО, необходимо пропатчить ядро Minix (kernel) иначе при компиляции ядра Linux, получите сообщение, что-то типа fp stack overflow.

Ну и под финал всего это необходимо скомпилировать сам Linux-0.01. Линус писал, что он использовал пропатченный им же gcc-1.40 c поддержкой -mstring-insns, но он также писал, что возможно подойдет 1.37.1 и да, им можно скомпилировать ядро Linux. Нужно только убрать вышеупомянутую опцию из нескольких Makefile (об этом писал Линус), а также отредактировать под себя boot.s (под нужный тип дискеты) и include/linux/config.h (параметры жесткого диска). Плюс в Makefile надо добавить путь до gnulib (об этом тоже писал). О чем Торвальдс не писал, так это то, необходимо в Makefile добавить команду конвертации бинарного файла в формат, который мог бы исполняется на Minix-386 (на нижнем левом скрине эти команды можно увидеть). Линус не делал подобной конвертации и могу предположить, что у него был патч который позволял запускать бинарные файлы gcc нативно (aka gnutoo).

Осталось только подготовить свободный раздел жесткого диска, создать несколько устройств в /dev и /bin скопировать bash (+ сделать ссылку на sh) и update. Запись ядро на дискету и как писал Линус «Use the three-finger-salute to reboot you machine».

 , linux-0.01, ,

OlegSL
()

Линус Торвальдс запланировал внедрение Rust в Linux 6.1

Новости — Ядро Linux
Группа Ядро Linux

Создатель ядра Linux и координатор его разработки Линус Торвальдс объявил на Kernel Maintainers Summit, что в Linux 6.1 будет доступно программирование модулей на Rust — «если не произойдёт ничего незапланированного».

Причиной включения Rust в ядро Торвальдс назвал более высокую безопасность языка (за счёт снижения числа ошибок работы с памятью) и его привлекательность для молодых разработчиков:

Rust - это одна из тех вещей, которые, как я думаю, привлекут новые лица… мы стареем и седеем…

Также опубликована начальная реализация драйвера rust-e1000 для Ethernet-адаптеров Intel. А компания Western Digital разрабатывает на Rust драйвер для NVMe-накопителей. Хотя драйвер ещё не оптимизирован, он не отстаёт в производительности от имеющегося ядерного драйвера на языке Си.

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

 , , ,

alex1101
()

Избежать повторения кода с помощью C++11 range-based for

Форум — Development

Допустим, есть какие-то единообразные инструкции над несколькими переменными

if(x % 2 == 0) ++x;
if(y % 2 == 0) ++y;
if(z % 2 == 0) ++z;

Как такое делается в современном c++? Я попробовал range-based for, но заработал только вариант с указателями.

for(auto t: {&x, &y, &z})
    if((*t) % 2 == 0) ++(*t);

Reference/dereference тут выглядит явно неуместно. Можно как-то по-другому?

Update

С помощью анонимусов получилось вот такое решение

#include <cstdio>
#include <initializer_list>
#include <functional>

#define rlist(x, ...) (std::initializer_list<std::reference_wrapper<decltype(x)>>({x, __VA_ARGS__}))

int main()
{
    int x = 2, y = 3, z = 4;
    for(auto t : rlist(x, y, z)) if(t % 2 == 0) ++t;
    printf("%d %d %d\n", x, y, z);
    return 0;
}

При использовнии выглядит достаточно прилично (а на макрос можно не смотреть). Требует стандарта C++11. Что с производительностью - пока не знаю.

Update 2

Решение на шаблонах от eao197

#include <iostream>
using namespace std;

template<typename F> void apply_to_all(F &&) {}

template<typename F, typename T, typename... O>
void apply_to_all(F && f, T && x, O && ...other) {
	f(forward<T>(x));
	apply_to_all(forward<F>(f), forward<O>(other)...);
}

int main() {
	int x = 2, y = 3, z = 4, v = 5, w = 6;
        apply_to_all([](int & v) { if(v % 2 == 0) ++v; },
		     x, y, z, v, w);
        apply_to_all([](int v) { cout << v << " "; },
		     x, y, z, v, w);
        cout << endl;
        return 0;
}
На c++14 можно писать auto вместо int в лямбде.

В С++17 за счет if constexpr не нужно будет делать пустую заглушку для прекращения рекурсии вызовов:

template<typename F, typename T, typename... O>
void apply_to_all(F && f, T && x, O && ...other) {
	f(forward<T>(x));
	if constexpr(0 != sizeof...(other))
		apply_to_all(forward<F>(f), forward<O>(other)...);
}

 ,

Crocodoom
()

c++ расплющить вложенный цикл?

Форум — Development

Например, есть что-то такое.

constexpr int n{4};
int shape[n];
for (int j0=0; j0<shape[0]; ++j0) {
	for (int j1=0; j1<shape[1]; ++j1) {
		for (int j2=0; j2<shape[2]; ++j2) {
			for (int j3=0; j3<shape[3]; ++j3) {
				/* return iterator to do external stuff ? */
			}
		}
	}
}
Хочется с помощью шаблонной магии преобразовать обход вложенного цикла к плоскому виду, что-то вроде функции:
template<n>flatten (int *shape, ...) -> iterator
c юзкейсом ala
int shape[4];
for (auto entry : flatten<4>(shape)) {
	/* do external stuff */
}
Хочется сделать это без дополнительного выделения памяти и runtime-time рекурсии. Куда копать?

 , ,

thunar
()

как оптимизировать с++ код, чтобы 7000 бинарников не выедали всё cpu

Форум — Development

https://imgur.com/RcrmzW0.png

https://imgur.com/Z4wdNBA.png

Код простой, в простое опрашивает ивенты, больше ничего не происходит.

- запускаю 1000-3000 бинарников - всё ок
- на 7000 бинарников - картина на скрине

Возможно у кого-то есть какие-то идеи куда смотреть и почему так просходит? откуда это ограничение в 7000

код очереди

std::optional<T> pop() {
        std::unique_lock<std::mutex> lock(this->mutex);

        if (q.empty()) {
            return std::nullopt;
        }

        std::optional<T> value = std::move(this->q.front());
        this->q.pop();

        return value;
    };


код опроса инвентов (он и генерит лоад)
while (true) {
        auto tick_start = std::chrono::steady_clock::now();

        if (auto event = internal_events_.pop(); event) {
            std::visit([this](auto &&casted_event) {
                process_event(casted_event);
            }, event.value());
        }

        if (auto event = my_events_.pop(); event) {
            using namespace td::td_api;
            auto &&object = event.value();
            switch (object->get_id()) {
                case updateMyActivity::ID:
                    process_event(move_object_as<updateMyActivity>(object));
                    break;
                case updateMyActivity2::ID:
                    process_event(move_object_as<updateMyActivity2>(object));
                    break;
                default:
                    break;
            }
        }

        if (auto event = my_q_events_.pop(); event) {
            std::visit([this](auto &&casted_event) {
                process_event(casted_event);
            }, event.value());
        }

        auto tick_end = std::chrono::steady_clock::now();
        auto duration = tick_end - tick_start;
        auto sleep_time = std::chrono::milliseconds(10) - duration;
        if (sleep_time.count() > 0) {
            std::this_thread::sleep_for(sleep_time);
        }
    }

 , , , ,

smilessss
()

Sway Input Configurator 1.0.0

Новости — Linux General
Sway Input Configurator 1.0.0
Группа Linux General

Итак, после некоторых боданий с кодом и не без помощи добрых людей, представляю вашему вниманию утилиту для настройки устройств ввода в Sway - Sway Input Configurator.

( читать дальше... )

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

 , , ,

Sunderland93
()

Использование git на нескольких равноправных компьютерах

Форум — Development

Есть несколько компьютеров (допустим, в локальной сети). Например ноутбук и десктоп. Есть репозиторий git, с которым хочется работать на каждом из них. То есть репозиторий не должен быть bare, и в любой момент в working tree могут быть какие-то изменения, как подготовленные к коммиту (staged), так и нет. Надо, чтобы с любого компа на любой можно было делать push и pull/fetch.

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

Видел такую статью, где предлагается сделать специальную ветку типа laptop-master, но при таком походе, как я понимаю, условие «хорошо бы» не выполняется (потому что в одном случае получим обновления в ветке laptop/master, а в другом в laptop-master). Появилась идея: делать push в remote-ветку, типа laptop/master, в ту же самую, в которую делался бы fetch, но не понял, можно ли так сделать.

В общем, помогите понять, как все это правильно настроить.

 ,

Klymedy
()

Нужна консультация у электрического инженера

Форум — Science & Engineering

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

Решение: https://i.ibb.co/yntGHtg/2022-06-17-10-46-35.png

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

 , , , ,

Goury
()

Glasgow Haskell Compiler 9.4.1

Новости — Разработка
Glasgow Haskell Compiler 9.4.1
Группа Разработка

Привет, ЛОР!

7 августа вышла новая версия Glasgow Haskell Compiler 9.4.1. На данный момент GHC является самым активно развиваемым компилятором для Haskell.

( читать дальше... )

>>> Release Notes

 , ,

hateyoufeel
()

Яндекс выложил в опенсорс userver — инструмент для создания высоконагруженных приложений

Новости — Разработка
Группа Разработка

Интернет, 29 июля 2022 года. Яндекс опубликовал исходный код и документацию фреймворка userver. Это первый открытый набор инструментов, который позволяет создавать высоконагруженные приложения на языке С++ и протестирован на масштабах уровня Яндекса. Userver используют в Яндекс Go, Лавке, Доставке, Маркете, финтех-проектах и многих других сервисах компании. Фреймворк предоставляется по открытой лицензии Apache 2.0.

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

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

«Когда мы переходили на микросервисы, мы понимали, что новый фреймворк должен быть как можно проще для разработчиков и бизнеса. Поэтому userver создавали с акцентом на надёжность и удобство, а внутри него есть всё необходимое для разработки, диагностики, мониторинга, отладки и экспериментов. Например, userver подсказывает как исправить ошибки ещё на этапе компиляции, умеет работать с разными базами данных, менять параметры на лету и так далее. Он хорошо подходит для разработки приложений как в небольших, так и в крупных компаниях. И с помощью userver даже новичок может за неделю написать новый микросервис», — говорит Антон Полухин, один из авторов фреймворка и руководитель группы бэкенд-разработки решений для продуктовых команд RideTech и eCom.

Яндекс выкладывает в опенсорс и другие свои ключевые технологии — например, распределенную систему управления базами данных YDB, способную обрабатывать миллионы запросов в секунду, а также библиотеку машинного обучения CatBoost, которую Яндекс применяет в Поиске и других сервисах.

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

 , , ,

anonymous
()

Debian отсудил права на домен debian.community

Новости — Debian
Группа Debian

Проект Debian, некоммерческая организация SPI (Software in the Public Interest) и организация Debian.ch, представляющая интересы Debian в Швейцарии, выиграли разбирательство во Всемирной организации интеллектуальной собственности (WIPO). На данном сайте велась критика проекта Debian, а также выносились интересные инсайды из рассылки debian-private, который является конфиденциальным каналом.

Домен debian.commnunity передан проекту Debian. Официальная версия - из-за нарушения торговой марки Debian. Автор сайта debian.community объявил, что зарегистрировал для продолжения публикаций новый сайт - «suicide.fyi», на котором продолжит публиковать критику Debian.

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

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

Пример: Дэниел привлекал внимание к Молли Де Бланк (Molly de Blanc), которая, по его мнению, под видом продвижения кодекса поведения занималась травлей несогласных с её точкой зрения и пыталась манипулировать поведением участников сообщества (Молли является автором открытого письма против Столлмана). За свои хлесткие высказывания Дэниэл Покок был забанен на дискуссионных площадках, а также исключён из числа участников таких проектов, как Debian, Fedora, FSF Europe, Alpine Linux и FOSDEM, но продолжал свое дело на своих сайтах.

Дополнение: помимо прочего, Дэниел зарегистрировал в Швейцарии для своих целей торговую марку DEBIAN (подробности в комментариях).

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

 , ,

ipkirill21x
()

Rust и двусвязный список

Форум — Development

Хорошую тему тут затронули

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

http://contain-rs.github.io/linked-list/src/linked_list/lib.rs.html#11-1388

Или не лучшее? Растаманы и растафобы, собирайтесь на великую битву!

А вот, кстати, ещё про списки:

https://rust-unofficial.github.io/too-many-lists/

 , двусвязный список,

den73
()

Deannoing — демон/фильтр мониторинга лог-файла

Новости — Open Source
Группа Open Source

Deannoing — демон/фильтр мониторинга лог-файла с вызовом парных команд с ожиданием при успешном поиске regex-выражений.

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

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

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

Программа написана на языке C.

>>> Подробное описание программы

 

vodz
()

Как запереть приложения в системе?

Форум — Security

Как «запереть» все приложения, кроме некоторых, чтобы они не выходили в Интернет?
Т.е. поместить их в «черный список» для исходящих пакетов, оставив эту возможность только для приложений из «белого списка».

Например. в Андроиде это элементарно делается при помощи файрволов DroidWall, AFWall, NoRoot Firewall, которые сами «узнают» о всех приложениях в системе и позволяют установить для них нужные правила.

«Наши» же ufw и iptables работают не с приложениями, а с портами, поэтому не соображу как это сделать.
Но наверняка есть такой способ?

 

chukcha
()

Как хранить лайки/реакции в базе?

Форум — Development

Сообщенька в базе - это бинарный «документ» (лежащий в чём-то типа mongoDB или типа redis, в общем неком key=value), про который известны оффсеты до всех полей. Совершенно аналогично «туплу», который «строка» в «традиционных» табличных СУБД. В общем, сообщенька - это, можно сказать, строка в БД, в которой можно так же апдейтить/инкрементить отдельные произвольные «поля»/«колонки». В общем, скажем для простоты, что это «обычная строка в обычной БД».

У сообщеньки есть 8-битная поле/колонка - likes. Там лежит либо 0, либо 1.

Есть отдельные «микросервис» лайков - совершенно отдельная «субд», заточенная под хранение лайков - она хранит key=set, где key идентифирует пролайканный объект, тип лайка. Таким образом, можно понять сколько у этого объекта лайков, лайкал ли ты (данный uid) уже эту сущность, и автоматически не дать тебе что-то лайкнуть 2 раза.

Лайки - это частный случай реакции, реакция типа ноль. Например, если uid=123 лайкнул сообщеньку номер 10000 в чатике «zuzu», то uid=123 поставил реакцию типа ноль и в микросервисе лайков мы увидим ключ: zuzu:10000:0 в котором лежит set и в этом set мы обнаружим 123 среди прочих.

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

Теперь непонятно, как в сообщеньке таким же образом (как поле likes) закешировать инфу о том, что этой мессаге поставили не только лайк, но ещё и «огонь» и ещё «палец вверх».

Превратить likes в битовую маску - жопа, т.к. заранее неизвестно, сколько разных реакций возможно.

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

Ну или можно такой «массивчик», хотя на самом деле отдельный key=set хранить отдельно. Т.е. колонка likes говорит, что реакции в принципе были, далее уже достаём этот key=set и смотрим какие именно были.

 

trisobakov
()

Микросервисы и точки отказа.

Форум — Development

Сейчас такая мода на микросервисы... Но смищно когда все микросервисы разворачивают на одном сервере, но это ССЗБ. А еще, когда я рос в ИТ, я помню постулат «Всегда снижай точки отказа», а с развитием микросервисов мне кажется что точек отказа просто писец как больше становиться. Притом админ при каждом обновлении фронта и бэка ставиться бешенной собакой. Обновления «экосистемы» становяться каким-то нетривиальным делом. Еще и микрофронтэнд тут сбоку подползает.


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

 , ,

splinter
()

char это и не signed и не unsigned а непонятно что

Форум — Development
> cat main.cpp
#include <type_traits>

int main() {
        static_assert((::std::is_same<char, signed char>::value) == true);
        static_assert((::std::is_same<char, unsigned char>::value) == true);

        return 0;
}

> g++ -Wall -Wextra main.cpp
main.cpp: In function 'int main()':
main.cpp:4:2: error: static assertion failed
  static_assert((::std::is_same<char, signed char>::value) == true);
  ^~~~~~~~~~~~~
main.cpp:5:2: error: static assertion failed
  static_assert((::std::is_same<char, unsigned char>::value) == true);
  ^~~~~~~~~~~~~

 

bga_
()

За что мы любим Manjaro

Форум — Talks

За пунктуальность

За стремление к совершенству

За мудрость

За добропорядочность

 

chenbr0
()

dmg в iso чем сконвертить в GNU / Linux?

Форум — Admin

Привет!
Хочу сконвертировать dmg-образы MacOSX в ISO в GNU / Linux для испльзования в VmWare Player 16 для наcтройки сборочной среды для программ на Qt5.
Помню что раньше были проблемы даже у виндовых программ. Как сейчас дела обстоят? Буду на Qt собирать opensource-программу.

 , , , ,

xwicked
()