LINUX.ORG.RU

Сообщения KennyMinigun

 

XWayland: размытые шрифты

Заценил Plasma под Wayland, особенно «безшовное» масштабирование с несколькими мониторами.

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

  • Разрешение: 3840x2160 (15.6", 282ppi)
  • Scaling factor: 190%

Выхлоп xrandr:

$ xrandr
Screen 0: minimum 16 x 16, current 3941 x 1252, maximum 32767 x 32767
XWAYLAND0 connected 1920x1080+0+172 (normal left inverted right x axis y axis) 350mm x 190mm
   1920x1080     59.96*+
XWAYLAND2 connected 1920x1200+2021+0 (normal left inverted right x axis y axis) 520mm x 320mm
   1920x1200     59.88*+

Причем WAYLAND0 – это 4K

Вот что про него говорит kscreen-console:

Id:  1
Name:  "Y2XND\u0080LQ156D eDP-1-unknown"
Type:  "Panel (Laptop)"
Connected:  true
Enabled:  true
Primary:  false
Rotation:  1
Pos:  QPoint(0,172)
MMSize:  QSize(350, 190)
FollowPreferredMode:  false
Size:  QSize(-1, -1)
Scale:  1.89844
Clones:  None
Mode:  "0"
Preferred Mode:  "0"
Preferred modes:  ("0")
Modes: 
         "0"    "3840x2160@60"   QSize(3840, 2160)   59.997

Вопрос такой: как в XWayland (под kwin) пофиксить размытые шрифты? Мое подозрение – неправильное масштабирование (можно ли его задать вручную для X?).

 , , , ,

KennyMinigun
()

MappedSum есть где нибудь?

Надо обьект, который будет предоставлять интерфейс подобный std::map<int, int> но при том держать/актуализировать сумму всех значений.

template <typename Element, auto... keys>
class MappedSum;

enum Keys { ONE, TWO, THREE };
MappedSum<int, ONE, TWO, THREE> sum = 0.0;

sum[TWO] = 10;
sum[THREE] = 3;
assert(sum == 13); // 0 + 10 + 3

sum[ONE] = -4;
assert(sum == 9); // -4 + 10 + 3

sum[THREE] = -3;
assert(sum == 3); // -4 + 10 + -3 

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

Может есть что-то такое в std или boost?

Самому написать не сложно, я даже знаю как. Просто велосипедить не хочется.

 

KennyMinigun
()

KDE Plasma 5.18 LTS

Лень писать новость. $subj.

Уже лежит в kubuntu-backports.

tl;dr:

  • Emoji picker (Meta+.)
  • Больше нет ‘‘ручки слива’’ (переработан режим редактирования виджетов)
  • Еще более допилен внешний вид уведомлений
  • (Снова) переработан внешний вид systemsettings

cast @fail2ban

https://kde.org/announcements/plasma-5.18.0

 ,

KennyMinigun
()

Поделитесь рецептом для libffmpeg в Opera

Проблема такова, что временами отпадает проигрывание видео и/или стриминг музыки (aka spotify, deezer, etc). Проблема решается подменой libffmpeg который идет в оригинале с пакетом на тот, что идет в пакете Chromium и/или VS Code (да, там тоже есть libffmpeg):

sudo cp /snap/chromium/971/usr/lib/chromium-browser/libffmpeg.so /usr/lib/x86_64-linux-gnu/opera
# или
sudo cp /usr/share/code/libffmpeg.so /usr/lib/x86_64-linux-gnu/opera

Естественно, после обновления opera-stable приходится все делать снова (не всегда, правда). Так вот, может кто уже решил проблему? Так, чтоб libffmpeg автоматически подменялся с минимум усилий по поддержке решения?

Опера как бровзер очень нравится, и переезжать не сильно хочется (т.е. Chromium/Vivaldi/Firefox/etc попрошу не советовать).

 ,

KennyMinigun
()

Конкурс обоев и видео для KDE Plasma 5.18

Короче, к релизу 5.18 снова проводится конкурс на лучший рисунок рабочего стола. Призом является ноутбук TUXEDO InfinityBook Pro 14.

Также проводится конкурс на лучшее промо видео о Plasma и KDE Applications. Призами являются TUXEDO Gaming PC (для Plasma) и TUXEDO InfinityBox (для KDE Applications).

А также несколько поощрительных призов (футболка, чашка, бейсболка).

Драма по ссылке: https://dot.kde.org/2019/12/23/announcing-kde-plasma-518-wallpaper-and-video-contests

Запилите новость, кому не лень (cast @alexferman)

 ,

KennyMinigun
()

Отмонтирование флешки в KDE удаляет ее девайс с /dev

Суть такова. При физическом подключении флешки (lsusb -v):

$ lsusb  | grep -i toshiba
Bus 004 Device 004: ID 0930:6545 Toshiba Corp. Kingston DataTraveler 102/2.0 / HEMA Flash Drive 2 GB / PNY Attache 4GB Stick

$ ls -l /dev/sdb*
brw-rw---- 1 root disk 8, 16 гру  2 19:39 /dev/sdb
brw-rw---- 1 root disk 8, 17 гру  2 19:39 /dev/sdb1

После размонтирования через GUI (выхлоп lsusb -v такой же как и перед):

$ lsusb | grep -i toshiba
Bus 004 Device 004: ID 0930:6545 Toshiba Corp. Kingston DataTraveler 102/2.0 / HEMA Flash Drive 2 GB / PNY Attache 4GB Stick

$ ls -l /dev/sdb*
brw-rw---- 1 root disk 8, 16 гру  2 19:45 /dev/sdb

Не могу понять, почему нода /dev/sdb1 удаляется. После этого невозможно снова подмонтировать флешку тоже.

Если это баг, то в какой проект под bugs.kde.org рапортовать/искать?

 ,

KennyMinigun
()

Lego как подарок коллеге. Что думаете?

Сап ЛОР,

Есть вопрос для аудитории: как бы Вы отнеслись к подарку на некий абстрактный личный празник, если бы подарком был конструктор LEGO?

Какой тип конструктора предпочитаете (Technic (механика, сложнее), Creator (моделирование, проще), Architecture, City, тематический (Star Wars, Harry Potter, Batman)? Был ди у Вас уже опыт складывания Lego?

А Linux здесь при том, что у Raspberry Pi есть интеграция с LEGO. Ну и вообще природа явления очень похожа 😂

 , , ,

KennyMinigun
()

Git: есть ли способ определить состояние forced-update?

Использую git вместо rsync для синхронизации сырцов на удаленной машине. Ну и часто доводится делать git push -f buildbox на локальной машине (естественно config receive.denyCurrentBranch = warn).

Чтоб потом привести рабочее дерево на удаленнй машине к желаемому состоянию делаю git reset --hard HEAD. Но иногда забываю, и запускаю компиляцию старой версии кода. Думаю написать алиас/фунцию которая бы делала reset при запуске билда если задетектит, что был сделан forced update.

Вопрос: как сделать проверку на forced update? Или может есть другой подход осуществить то, что я хочу?

 ,

KennyMinigun
()

Edge к нам приходит

Microsoft серьезно планирует Chromium-based Edge на GNU/Linux.

https://myignite.techcommunity.microsoft.com/sessions/79341?source=sessions

Видео на 8:36.

Для Ъ:

And Linux is comming… at a later time

Ваши мысли?

 , , мерзость,

KennyMinigun
()

Python для школьника

Для поступления в желаемый универ надо сдать информатику. Не сильно сложно: немного алгоритмов, императивного программирования и декларативного (SQL). Cпециальность не сильно айтишная: дизайн, графика, etc.

Выбор языка программирования – свободный. На экзамене лишь предоставляют задание. Выбор пал на Python 3, поскольку множество литературы нескучной для начала. Платформа – естественно GNU/Linux (Ubuntu). Как варианты рассматривались еще языки Pascal, C, JavaScript (sic!), Java, C#.

На повестке дня выбор инструментария. Понятно, что консолька и vim/nano – это обязательно. Но сейчас скорее вопрос стоит между VS Code, Spyder и Kdevelop. Хотелось бы статический анализатор (aka tidy), дебагер и автокомплит. Есть истории успеха? Может кто тоже начинал с Python? Что стоит учесть?

Дискач.

 ,

KennyMinigun
()

Сьехала верстка на странице профиля

Между рядом кнопок управления профилем и табличкой с данными (Nick, Имя, …) слишком маленькое (непропорционально) расстояние.

Opera 64.0.3417.54: https://imgur.com/5V8MDeY

@maxcom

 ,

KennyMinigun
()

Дрон c API

Недавно узнал, что в «игрушечном» дроне Ryze Tello есть возможность управления/общения через высылку UDP датаграм с командами.

Недавно они еще выпустили некий Tello EDU с обновленным ПО. Там больше команд, и рекламируется возможность создания «роя»: https://github.com/dji-sdk/Tello-Python

Теперь вопрос: есть ли в природе не сильно дорогие дроны, с подобным интерфейсом? А чтоб еще и с GPS?

 , деньги на ветер, ,

KennyMinigun
()

Годный закос

https://www.linux.org.ru/gallery/screenshots/15254986

Ставлю все свое ничего, что на скрине таки не оффтопик, а годный закос. Потому что:

  • Сглаживание шрифтов линуксовое
  • Значки в трее линуксовые (особенно star-spangled banner в качестве индикатора раскладки)
  • Вендовый значек «пуск» не пропорциональный

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

cast @Dimez @VarfolomeyKote4ka @Shaman007

Может все же разудалить?

 , ,

KennyMinigun
()

std::apply и std::integer_sequence

Захотелось странного (ну, почти): заставить работать std::apply с обьектом std::integer_sequence. Ведь последний – вполне себе кортеж.

А целью было бы упрощение паттерна (хз как называется) с обходом кортежей (С++17*):

template <typename Function, 
          typename Tuple, 
          std::size_t... indexes>
void doFoonktion(Function f, Tuple t, std::index_sequence<indexes...>) {
  (static_cast<void>(f(std::get<indexes>(t))), ...);
}

template <typename Function,
          typename Tuple>
void doFunction(Function f, Tuple t) {
  doFoonktion(f, t, std::make_index_sequence<std::tuple_size_v<Tuple>>{});
}

До такого:

template <typename Function,
          typename Tuple>
void doFunction(Function f, Tuple t) {
  std::apply([](auto... index) {
               (static_cast<void>(f(std::get<index>(t))), ...);
             },
             std::make_index_sequence<std::tuple_size_v<T>>{});
}

  • да, я знаю, что в С++20 можно явно делать шаблонные лямбды и второй «внешней» функции уже не надо было бы.

Значит сделать tuple_size и tuple_element для integer_sequence очень даже просто:

template <auto v>
using constant = std::integral_constant<decltype(v), v>;

template <typename T, T... values>
tuple_size<integer_sequence<T, values...>> : constant<sizeof...(values)>
{};

template <size_t i, typename T, T... values>
tuple_element<i, integral_sequence<T, values...>> { using type = T; };

Докостыливаем std::get:

template <std::size_t i, typename T, T first, T... rest>
T get(integer_sequence<T, first, rest...>) {
  if constexpr (i == 0)
    return first;
  else
    return get<i - 1>(integer_sequence<T, rest...>{});
}

template <std::size_t i, typename T>
T get(integer_sequence<T>) {
  static_assert(i != i, "invalid index");
}

После такого финта ушами начинает работать structured binding:

  auto [zero, one, two, three] = std::make_index_sequence<4>{};

Однако std::apply «не видит» нашего std::get, если заголовок <tuple> был включен ДО нашего определения get. Наверное там нету ADL: https://wandbox.org/permlink/GRDV7VEvalUWATlM

Есть идеи как сделать такое красиво/правильно? Ну и еще было бы круто вообще заставить std::apply работать с пользовательскими типами. Пока что на ум приходит только написание собственную реализацию std::apply c шлюхами и ADL.

 ,

KennyMinigun
()

Как уменьшить размер std::bitset?

Мне надо запаковать три битовых флага, которые имеют одинаковое значение (напр. как в std::vector<bool> isValid). Только давит жаба использовать std::bitset, ибо sizeof(std::bitset<3>) == 8.

Можно ли как-то в std::bitset подать размер хранилища?

 ,

KennyMinigun
()

Как изменить target по умолчанию в Clang?

Есть Clang на оффтопике:

C:\Users>clang++ --version
clang version 8.0.0 (tags/RELEASE_800/final)
Target: x86_64-pc-windows-msvc
Thread model: posix
InstalledDir: C:\Program Files\LLVM\bin

По умолчанию он хочет стандартную либу от M$:

C:\Users>clang++ hello.cpp -o hello-clang.exe
clang++: warning: unable to find a Visual Studio installation; try running Clang from a developer command prompt [-Wmsvc-not-found]
hello.cpp:1:10: fatal error: 'iostream' file not found
#include <iostream>
         ^~~~~~~~~~
1 error generated.

У меня есть MinGW, который я хочу чтоб Clang использовал. Однако надо явно подать аргумент --target:

C:\Users>clang++ --target=x86_64-pc-windows-gnu hello.cpp -o hello-clang.exe

C:\Users>hello-clang.exe
Hello, World!

Можно ли поменять конфигурацию Clang так, чтоб он по умолчанию выбирал target: x86_64-pc-windows-gnu? В интернетах нашел только как пересобрать Clang с таким конфигом. Не очень хочется пересобирать :/ Может есть какая-то переменная среды или текстовый конфиг чтоб поменять умолчания?

 ,

KennyMinigun
()

Установка GNU/Linux в Hyper-V

Пытаюсь завести Kubuntu 19.04 в мелкомягкой поделке (не спрашивайте почему). Перебираю опции, чтоб машина заработала.

Если устанавливаю как «Generation 1», то LiveDVD загружается до графической менюшки «Try Kubuntu/Use Kubuntu». Try Kubuntu зависает, Install Kubuntu устанавливает, но потом не запускается (тоже зависает).

В «Generation 2» они включают UEFI с проверкой сертификатов (о б-же проверка сертификата для VM (sic!)), и LiveDVD не проходит проверки. Соответственно, не запускается. Одако, для «Generation 2» они обащеют дополнительные фичи виртуализации. Да-да, тот самый Microsoft’овский EEE в действии.

Сейчас думаю, может под Generation 2 таки заработает. Только надо пройти проверку сертификата. Вроди ж LTS релизы должны проходить?

Сорри за нубский вопрос, но может кто-то уже сталвивался и не надо будет копать глубже?

 , ,

KennyMinigun
()

Firefox Premium. А вы готовы заплатить?

Согласно с материалом статьи https://www.omgubuntu.co.uk/2019/06/firefox-premium-would-you-pay Mozilla планирует платную Premium подписку на услуги связанные с повышением приватности в сети (напр. VPN). Базовый функционал как был останется безплатным.

Интересно, что такой жест даст Мозилле?

 , firefox premium,

KennyMinigun
()

Мультиуровневый bsearch, нужно ли?

Мои исходные данные – массив структур с географической информацией:

struct Geo {
  std::string airport;  // level: 1
  std::string city;     // level: 2
  std::string province; // level: 3
  std::string nation;   // level: 4
  std::uint8_t subarea; // level: 5 | values: 11, 12, 13, 14, 21, 22, 23, 31, 32, 33, 34
  std::uint8_t area;    // level: 6 | values: 1, 2, 3
};

Надо много (и желательно быстро) отвечать на запрос «принадлежит ли Needle к Haystack». Где Needle всегда более специфично нежели Haystack, например:

belongsTo(Needle=City{Munich}, Haystack=Subarea{21}) -> true

Я думаю посортировать данные иерархически:

std::vector<Geo> geos = allGeos();
std::sort(geos.begin(), geos.end(), 
  [](const Geo& lhs, const Geo& rhs) {
    int areaCmp = lhs.area - rhs.area;
    if (areaCmp != 0)
      return areaCmp < 0;

    int subareaCmp = lhs.subarea - rhs.subarea;
    if (subareaCmp != 0)
      return subareaCmp < 0;

    int countryCmp = lhs.nation.compare(rhs.nation);
    if (countryCmp != 0)
      return countryCmp < 0;

    int provinceCmp = lhs.province.compare(rhs.province);
    if (provinceCmp != 0)
      return provinceCmp < 0;

    int cityCmp = lhs.city.compare(rhs.city);
    if (cityCmp != 0)
      return cityCmp < 0;

    return lhs.airport.compare(rhs.airport) < 0;
  }
);

И потом использовать bsearch() по партициям типа Needle на пути от Haystack. Т.е (псевдокод):

int level = levelOf(Haystack);
std::vector stack{ Range{geos.begin(), geos.end()} };

while (!stack.empty()) {
  Range partition = stack.back();
  if (partition.empty()) {
    stack.pop_back();
    ++level;
  }

  // depth-first
  if (level > levelOf(Needle)) {
    iterator begin = partition.begin();
    iterator end = lower_bound(begin, partition.end(), valueOf(*begin, level));
    stack.push(Range{begin, end})
    level -= 1;
    continue;
  }

  // level == levelOf(Needle)
  if (bsearch(partition, Needle))
    return true;

  // trim parent's begin()
  stack.pop_back();
  stack.back().begin() = partition.end();
  ++level;
}

Где level обозначает поле из Geo, соответсвенно комментарию.

Вопрос такой: может есть алгоритм (или структура данных) лучше подходящая под цель?

 ,

KennyMinigun
()

Подскажите контейнер для const обьектов

Все прекрасно знают (или сейчас узнают), что std::vector не умеет в const T. Хотя, вполне себе можно представить как такой контейнер будет себя вести:

  • под капотом std::aligned_alloc
  • добавляем через emplace_back(Args&&), который делает placement new
  • operator[] отдает через std::launder (C++17)

У меня есть метод, что подтягивает данные с базы. Хочу возвращать контейнер с const обьектами. Чтоб означить, что их не следует менять. Конечно ничего не мешает возвращать не-const

Есть ли что-нибудь на замену std::vector, чтоб самому не писать? Может boost?

 ,

KennyMinigun
()

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