LINUX.ORG.RU

Сообщения aleksey_tulinov

 

Математика с фиксированной запятой для C++20

Форум — Development

Посоны,

Мы тут сделали библиотеку для математики с фиксированной запятой на С++. Вот так работает:

const auto x = fixed::make::p<2>(1, 11);

Это число с двумя десятичными знаками после запятой представляющее 1.11.

const auto y = fixed::make::p<1>(1, 0);

Это число с одним десятичным знаком после запятой, представляющее 1.0.

const auto z = x + y;

Это сумма двух чисел.

А вот это ошибка компиляции:

fixed::make::p<3, uint8_t>((uint8_t)0, 0);

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

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

Во время выполнения, переполнение тоже контролируется, все операции возвращают std::optional который при переполнении будет пустым.

Библиотека спроектирована так чтобы ни один бит информации ни при каких манипуляциях не терялся бы, либо если бит надо потерять, то это надо сделать явно и число станет неточным, на что тоже есть признак, который можно проверить вызвав fixed::is_accurate(x), и если какие-то биты были потеряны, то функция вернёт false.

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

Ссылка: https://bitbucket.org/alekseyt/fixed

Более полный пример использования: https://bitbucket.org/alekseyt/fixed/src/master/examples/basic.cpp

Заранее спасибо.

 

aleksey_tulinov
()

Pattern matching для С++20

Форум — Development

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

variant<int, string> v = 1+2+3+5+7+11;
const auto pattern = pm::any_of(29, "42");

cout << *match(v,
  // match with pattern although pass (fall through). also create side effect in the middle of matching
  pass(pattern,            [&v] { cout << "How does this work?\n"; v = "42"; })
| pass(pattern,            [&v] { v = R"(I wonder ¯\_(ツ)_/¯)"; }) // match with pattern again, also pass
| with(pm::type(string{}), [&v] { return get<string>(v); }) // match with stored type
| with(__,                 []   { return R"(('・ω・'))"s; })) // catch-all condition (default)
<< endl;

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

Я так почитал пропозал для паттерн матчинга, вроде много чего из фичей есть кроме некоторых вещей, хотя я не до конца понимаю всё, что там написано и зачем оно там.

Я это отложу пока что потому мне это надо осмыслить, но может кто-то из многоуважаемых регистрантов или не менее многоуважаемых анонимусов посмотрит пока на это барахло и что-то посоветует? В код может кто-то глянет, всё ли по феншую? Там не много, меньше 700 строк кода пока что и очень простой дизайн.

Ссылка: https://bitbucket.org/alekseyt/pm

Более полный пример использования: https://bitbucket.org/alekseyt/pm/src/master/examples/example.cpp

И там в тестах всякие guard(), within(), maybe() и т.д. Заранее спасибо.

 

aleksey_tulinov
()

Юнити которое мы заслужили

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

Void, bspwm, xcompmgr, отдельные части юнити 7, ЛОР в браузере, аниме на обоях. Кажется забыл добавить на скриншот поняшек, ну может в другой раз.

Вроде ничего так получилось, и bspwm очень крутой. Разработчик bspwm ну очень хорошо разбирается в теме. Я сделал одно ишью на гитхабе с вопросом и он по моему описанию сходу выявил проблему в приложении. Я попытался эту проблему устранить, по локти погрузился в гномо-зависимости Nux'а (GUI-тулкит который используется в Unity 7), «всё понял», остановился, помыл руки с мылом и забил.

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

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

Исходники барахла (GPL v3): https://github.com/alekseyt/unity7-git/tree/void

>>> Просмотр (1600x900, 549 Kb)

 , ,

aleksey_tulinov
()

Void Linux

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

Ну вот например.

Что изменилось с прошлого раза: я попробовал десяточку и мне понравилось: 3D в интерфейсе, вот это всё, сразу такое ощущение появилось как будто 21 век уже наступил. К сожалению в WSL не заработал Void, что-то Майксософт не допилило ещё. Пока Майкрософт допиливает, решил попробовать собрать чего-то такого же в технологическом плане, только на линуксе.

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

Ещё скриншоты на реальном железе в разных комбинациях: https://imgur.com/a/wGrfc

Сверху-вниз:

  • Xfce4/Xfwm4 (без компиза)
  • MATE/compiz-reloaded
  • Openbox/xcompmgr

Я проверял на WM: Xfce4/MATE/Openbox/Cinnamon, на композиторах: встроенный в Xfwm4/встроенный в MATE/compiz-reloaded/xcompmgr/compton - работает довольно бодренько. Может быть на чём-то ещё взлетит, но мне надоело перебирать. Основное требование к менеджеру окон - поддержка Xshape input и работающий композитинг. В AwesomeWM/Fluxbox/i3 по причине отсутствия поддержки Xshape не работает например. Думаю возможна альтернативная реализация без необходимости Xshape, но я сделал так: полноэкранный оверлей который рендерит себя в прозрачный фреймбуфер, ввод от мышки должен проходить сквозь его прозрачную часть и попадать в окна которые находятся под ним.

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

Ну в общем, как наверное и так понятно из скриншотов, технические проблемы Юнити о которых можно прочитать в интернете мягко говоря сильно преувеличены. Я не могу вспомнить ещё один десктопный шелл который мог бы работать на Openbox с xcompmgr также как на MATE с compiz-reloaded, по-моему это настолько далеко от технических проблем, насколько это вообще может быть от них далеко. Про iPhone X говорят, что он минимум на 2,5 года опережает конкурентов, а с момента релиза Юнити прошло более 7 лет, какое ещё DE может делать аппаратно-ускореную графику с полной поддержкой 3D в интерфейсе в 2к18? Ну наверное что-нибудь на Qt, да? Вот есть Юнити 8 на Qt/QML:

// Rotating 3 times at top/bottom because that increases the perspective.
// This is a hack, but as QML does not support real 3D coordinates
// getting a higher perspective can only be done by a hack. This is the most
// readable/understandable one I could come up with.
...
// Because rotating it 3 times moves it more to the front/back, i.e. it gets
// bigger/smaller and we need a scale to compensate that again.

Тут написано, что QML не поддерживает настоящий 3D и вместо того чтобы повернуть изображение на определённый угол, оно три раза поворачивается на меньший угол, затем исправляется искажение возникающее при такой операции. Ну вот, Юнити 8 на Qt/QML, дамы и господа. Но вейленд-то сейчас придёт и точно спасёт нас от всех ужасов десктопного линукса, да?

Я когда проверял поддержку нескольких мониторов, столкнулся с такой проблемой: существующие менеджеры окон не могут зарезервировать место в определённых частях экрана. Оказалось, что это известная проблема иксов, единственное, что меня смутило - это то, что в убунтовском компизе это уже 7 лет работает. Я почитал, что про это пишет разработчик kwin и понял, что то, что он предлагает в моём случае работать не будет.

Что он предлагает: а) создать окно; б) установить тип окна в «панель»; в) настроить как это окно должно взаимодействовать с другими окнами (перекрывать/не перекрывать/т.д.); а kwin уже зарезервирует место под панель «где надо». Как работает то, что на скриншоте: 1) создаётся одно окно которое разворачивается на весь экран; 2) резервируется область экрана меньшая чем размер окна; 3) в некоторых случаях надо зарезервировать несколько областей в разных частях экрана. Как 1), 2) и 3) выразить через а), б) и в)?

Короче света в конце туннеля не видно, да и это наверное не туннель.

И вообще я думаю, что Марк Шаттлворт прав, что выбросил и Юнити 7, и Юнити 8, и дисплейный сервер Мир вероятно тоже не нужен. Свою роль в повышении популярности убунты это всё уже сыграло, зачем дальше тянуть резину?

Да и если так подумать, то зачем это всё на линуксе? Композитинг по Портеру/Даффу? Анимация с помощью трёхмерной призмы вращающейся вокруг своей оси? Да не, бред какой-то. Любой менеджер окон может открыть и терминал и браузер, а что ещё нужно? Fade-in - это тоже хорошая анимация, а когда окошко как бы выезжает слева-направо - это просто взрыв мозга, я и не знал, что так можно.

И расстраиваться конечно не из-за чего. Ещё лет через 7-15 десктопный линукс наверняка достигнет уровня Юнити и год линукса на десктопах обязательно настанет, только попозже, но обязательно настанет, к гадалке не ходи. А пока что вот вам артефакты древней цивилизации:

Исходники того, что на скриншоте (GPL v3): https://github.com/alekseyt/unity7/tree/void

Шаблон для сборки под Void: https://github.com/alekseyt/void-packages-private/tree/master/unity7-chromatic

>>> Просмотр (1920x1080, 614 Kb)

 , ,

aleksey_tulinov
()

Void Linux

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

Решил попробовать Void Linux в виртуалке. Заинтересовал тем, что в качестве инита используется runit.

Хорошая система инциализации, работает сама: создал симлинк в /var/service - runit сам поднял сервис, удалил симлинк - runit потушил сервис. Я с ним забыл, что сервисы надо стартовать или останавливать, оно просто работает. Загружается очень быстро даже в виртуалке, работает как волшебство, впечатления исключительно положительные.

Void имеет свой пакетный менеджер который называется XBPS. Рецепты для сборки пакетов - это обычные shell-скрипты в которых можно творить любое колдунство для того чтобы собрать нужный пакет. Я пробовал только x86_64, но в репах есть ещё пакеты для альтернативной libc (musl) и 64-битного ARM'а.

XBPS контролирует зависимости на уровне динамических библиотек и сам определяет зависимости пакетов. Например если приложение линкуется с libstdc++, то XBPS это определит и сам поставит зависимость. Этот эффект распространяется вниз по дереву пакетов и в итоге рантайм автоматически получается целостным и без дырок. В случае с приложениями на питоне или чём-то таком, можно руками дописать нужное в depends.

На скриншоте XFCE с несколькими модификациями. Изначально я пытался собрать Unity 7 и мне удалось собрать несколько компонентов: compiz, nux, dash, hud, launcher, которые даже запускались, но, разумеется, нормально не работали без остальных зависимостей. Я посмотрел на это всё и решил оставить только компиз от юнити, для, так сказать, эффекта присутствия, а остальное попытаться заменить тем, что есть в пакетах или на гитхабе.

Менеджер окон - compiz 0.9, декоратор - emerald. Фича с отключением заголовков развёрнутых окон в компизе делается легко, декорации отключаются для окон в таком состоянии:

!(state=maxvert & state=maxhorz)
Для того чтобы на верхней панели появлялись кнопки для развёрнутых окон, нужен плюгин xfce4-windowck-plugin. Из коробки он работает неправильно, поэтому его пришлось пропатчить (ссылка на патчи внизу). Для глобального меню используется vala-panel-appmenu.

В качестве дока - Plank, для запуска приложений - Albert. Albert - это ещё одно очень годное приложение которое позволяет делать поиск по системе: по приложениям, по файлам, или выполнить арифметическое действие как в калькуляторе и т.д. То есть это что-то типа dash из Unity, но сильно проще (или сложнее, кому как), это скорее Alfred из MacOS.

Зацените блюр в терминале и доке. Круто?

А по-моему выглядит как Windows 98 с доком и глобальным меню. Технологически это откат на десятилетие назад, примерно так это всё и выглядело в 2006 году когда компиз впервые зарелизили. Я для скриншота выбрал приложения поприличнее, а если полазить по разным окнам, то повылазят гномо-приложения на Gtk3 и произойдёт апгрейд с Windows 98 до Windows ME.

Никаких glBegin(), текстур, шейдеров, шейдеров поверх шейдеров. Компиз иногда добавляет на рабочий стол объём и спецэффекты, но всё остальное рисуется в плоский canvas, не хватает только какого-нибудь пиксель-арта для завершения картины.

Видите индикатор раскладки клавиатуры на котором написано «us» маленькими буквами жирным шрифтом? У меня от него глаза вытекают. И это ещё уменьшенный, а можно в настройках сделать покрупнее. А видите рядом с ним баг в отрисовке иконки NetwokManager'а? Теперь вы не можете это развидеть. А знаете ли вы, что XFCE сортирует иконки в трее по имени приложения? Зачем? ¯\_(ツ)_/¯ Но иконка NetworkManager'а при этом оказывается то рядом с индикатором раскладки, то между ними вклинивается иконка xchat'а. Я сделал ещё один патч для xfce4-panel который отключает сортировку иконок...

Это всё можно было бы запатчить, имея достаточный заряд энтузиазма, но я забил. Каждый компонент который видно на скриншоте как-то багует или работает криво. Каждый багует по-своему, например compiz-reloaded падает в одних случаях, но стабильно работает там где падает компиз из юнити, компиз из юнити в свою очередь стабильно работает там где падает compiz-reloaded. Индикатор раскладки клавиатуры был таким же десять лет назад, видимо это всех устраивает, раз за десять лет никто это не исправил. На гитхабе в issues xfce4-windowck-plugin оригинальных разработчиков не видно, какие-то люди обсуждают свои проблемы и говорят, что неплохо было бы портировать плюгин на Gtk 3, но не похоже, чтобы они его портировали. Людей поддерживающих compiz-reloaded я не стал беспокоить, у них и без меня проблем хватает. Разработчики XFCE, я так подозреваю, тоже заняты портом на Gtk 3, а потом будет Gtk 4, Gtk 5, Gtk 6. В общем доделывать патчи я не стал.

В принципе этим можно пользоваться с минимумом патчей если вы готовы терпеть небольшую кучку косяков разного размера и вам не жалко ваших глаз. Я пользуюсь, прямо в виртуалке, но я пользуюсь в основном консолью и браузером. Или можно ещё держать свой убунту-стайл патчсет и накладывать его во время сборки пакетов, но это плохая примета. Патчи, или скорее хаки, которые я сделал, находятся здесь: https://github.com/alekseyt/void-packages, надеюсь будет кому-нибудь полезно, но наверное нет.

Для себя я сделал такие выводы:

1. Void Linux - это прекрасно. Говорю без всякой иронии. Это был как глоток чистого воздуха, ИМХО именно таким и должен быть линукс. Однозначно буду пользоваться.

2. На десктопе надо использовать MacOS или десяточку с WSL. Хочется верить, что открытые исходники в конечном итоге всё равно победят, но я думаю, что эти открытые исходники ещё не написаны.

>>> Просмотр (1920x1080, 373 Kb)

 , ,

aleksey_tulinov
()

Вышла remotefs 1.0

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

После длительного перерыва в разработке вышла версия 1.0 сетевой файловой системы, нацеленной на домашние NAS'ы. За время прошедшее с предыдущего релиза были сделаны следующие изменения:

  • Добавлена поддержка timeout'ов на разные операции, чтобы исключить «застревание» файловых операций на разорваном соединении.
  • Поддержка новой версии FUSE (>=2.8) позволило несколько упростить внутреннее устройство remotefs без потери производительности.
  • В конфигурации теперь можно указывать не только IP-адреса, но и имена хостов.
  • Исправлено несколько небольших ошибок.

Remotefs предназначена для людей, на чьём железе по каким-либо причинам не работает или работает плохо NFS, Samba, sshfs и т.д.

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

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

Сервер remotefs использует не больше 384 килобайт памяти на соединение, и небольшую долю CPU (в неэкстремальных режимах), что позволяет обслужить достаточное количество одновременных соединений даже на дешёвом роутере с 16 мегабайтами памяти и обеспечить передачу закодированого 720p видео по WiFi.

Полный список изменений

>>> Сайт проекта

 , , ,

aleksey_tulinov
()

remotefs 0.12

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

Вышла очередная версия remotefs – легковесной файловой системы для домашнего применения.

Главная особенность этой версии – NSS-модуль (rfsnss) для автоматической реализации id-mapping'а. Подробнее о его функциях вы можете прочитать в man rfs_nssd: http://remotefs.sourceforge.net/rfs_n... (англ.)

Кроме того, в этом релизе мы исправили известные ошибки, добавили новые фичи и убрали лишние.

Из изменений:

  • включено по умолчанию: IPv6, поддержка ссылок, список экспортов на сервере (rfs -l);
  • сервер откажется запускаться не из-под рута (без опции -q);
  • исправлены размеры файлов в выводе ls и du;
  • исправлен баг с копированием файлов только для чтения (mode: 444);
  • исправлен баг с временными метками (при копировании с их сохранением: cp -p);
  • удалено кеширование операций чтения и связанные с ним опции (-ord_cache, -ordwr_cache);
  • добавлена опция transform_symlinks, аналогичная одноимённой опции в sshfs.

Полный список изменений: http://remotefs.svn.sourceforge.net/v...

>>> Домашняя страница

 , , ,

aleksey_tulinov
()

remotefs 0.11

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

Вышла промежуточная версия remotefs - легковесной сетевой файловой системы на базе FUSE. remotefs разрабатывалась для применения на домашних NAS'ах на базе низкопроизводительного оборудования.

В эту версию включена экспериментальная поддержка SSL и POSIX ACL - обе опции не включены в пакеты, но доступны в репозитории.

Доступны пакеты для архитектуры i386 для дистрибутивов основанных на Debian и Redhat, ебилды для Gentoo, а также пакеты для OpenWrt для архитектур MIPS, MIPSEL, ARM, ARMEB и PowerPC.

Пакеты для OpenWrt (кроме MIPSEL) экспериментальные, т.е. их работоспособность не проверялась опытным путём. Если какой-то из экспериментальных пакетов не работает - разработчики будут благодарны если вы сообщите им об этом.

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

 , , ,

aleksey_tulinov
()

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