LINUX.ORG.RU

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

Luau - Lua с «батарейками», написанный на C++17

 , ,

Luau (GitHub) - встраиваемый, Lua 5.1-совместимый (и частично с Lua 5.2-5.4), язык со следующими улучшениями (или «улучшениями»?):

function foo(x: number, y: string): boolean
    local k: string = y:rep(x)
    return k == "a"
end
type Point = { x: number, y: number }
type Array<T> = { [number]: T }
type Something = typeof(string.gmatch("", "%d"))
for k, v in {1, 4, 9} do
    assert(k * k == v)
end
  • улучшенный repl (используется C-альтернатива readline Isocline)
  • и другие изменения ;)

По соображениям безопасности отсутствуют io, os, package и debug.

(En|Destr)oy!

dataman
()

Просмотр картинок (галерея)

 , , ,

Какой есть менеджер просмотра на linux чтобы он не тупил пол дня и умел gif открывать? У меня fluxbox, там mc + feh. Он гифки не умеет. Мне надо что-то под MC. Чтобы по клику открывал и подгружал миниатюры с папки.

dnhpbqt973
()

Убийца ли C язык C3?

 , ,

В честь сегодняшнего пре-релиза (0.2.4).

C3 (c3-lang.org) (GitHub) - очередной «убийца» C на базе LLVM. Потихоньку разрабатывается шведским программистом (одна штука).

Ключевые особенности:

  • компилятор написан на C
  • поддержка LLVM 12-15 (насколько мне известно, ни один из конкурентов этого не может (привет, Odin, Zig и т.д и т.п.))
  • полная C-ABI совместимость
  • модули - нет хидерам!
  • дженерики
  • макросы, но не как в C
  • слайсы
  • контракты
  • compile time and runtime reflection (плохопереводимая игра слов)
  • SIMD «из коробки»
  • и многое другое!

Из недостатков - практически спартанская стандартная библиотека, но так как реализованы ещё не все запланированные возможности, то в этом есть смысл.

macro int factorial($n)
{
        $if ($n == 0):
                return 1;
        $else:
                return $n * factorial($n - 1);
        $endif;
}

extern fn void printf(char *fmt, ...);

fn void main()
{
        int x = factorial(12);
        printf("12! = %d\n", x);
}
dataman
()

Выпустил большой релиз Ergo Framework 1.2.0

 , ,

Состоялся очередной релиз фреймворка Ergo - 1.2.0 (это реализация сетевого стека Erlang и его OTP библиотеки на языке Golang)

https://github.com/halturin/ergo

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

ключевые новшества в этом релизе:

  • добавлена поддержка TLS 1.3 с автоматической генерацией самоподписанных сертификатов
  • добавлен GenStage behavior. это невероятно удобная штука для создания pub/sub решений без шины сообщений и с механизмом защиты от переполнения. В наличии простой пример для демонстрации возможности https://github.com/halturin/ergo/tree/master/examples/genstage (сортировка чисел на четные/нечетные с помощью одного producer и двух consumers)
  • добавлена статическая маршрутизация (в общем-то это решение Erlang-специфичной проблемы небезопасности EPMD

и конечно же очень много багфиксов. здесь можно посмотреть весь список новшеств и изменений https://github.com/halturin/ergo#changelog

буду рад обратной связи и ответить на любые вопросы.

ergo
()

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

 

> 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_
()

Модули из C++20

 

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

Meyer
()

Доступна первая бета С++ библиотеки lexy

 , , ,

Состоялся выпуск первой беты библиотеки комбинаторного парсинга lexy.

struct channel
{
    static constexpr auto rule = dsl::n_digits<2, dsl::hex>;
};

struct color
{
    static constexpr auto rule = dsl::hash_sign + dsl::times<3>(dsl::p<channel>) + dsl::eof;
};

using production = color;

Оф. сайт.

Поиграть с примерами.

GitHub.

dataman
()

Вывести типы аргументов функтора

 ,

Приветствую.

#include <functional>
using namespace std;

template <typename T>
struct FTraits;

template <typename R, typename A>
struct FTraits<function<R(A)>> {
	using Ret = R;
	using Arg = A;
};

struct S {
	//S(S&&) = delete;
	//S() = default;
	// ^^^^ needs to be uncommented ^^^^
};

template <typename T>
void fn(T t) {
	using U = typename FTraits<decltype(function(declval<T>()))>::Arg;
	//static_assert(U ...);
}
int main() {
	fn([](S){});
}

Словами - в fn передаём некий функтор, узнаём тип его аргумента и проверяем соответсвие этого типа каким-то критериям валидности. Всё работает до тех пор, пока тип умеет стандартно копироваться/создаваться (этого хочет std::function).

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

Какие-нибудь варианты? Как-то обойтись без std::function и применить какую-нибудь «магию» напрямую к функтору?

kvpfs
()

Узнать время использования Windows через Linux

 , ,

Здравствуйте.

Можно ли узнать время включения и выключения компа с Windows через Live дистрибутив Linux’а (напр. Kali, Finnix, Manjaro…)?

ОС: Windows 7 (но интересно как и с другими версиями работает).

GREAT-DNG
()

Traefik и несколько доменов

 , ,

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

cat data/traefik.yml
api:
  dashboard: true

entryPoints:
  web:
    address: :80
    http:
      redirections:
        entryPoint:
          to: websecure

  websecure:
    address: :443
    http:
      middlewares:
        - secureHeaders@file
      tls:
        certResolver: letsencrypt_domain1

providers:
  docker:
    endpoint: "unix:///var/run/docker.sock"
    exposedByDefault: false
  file:
    directory: /custom
    watch: true

certificatesResolvers:
  letsencrypt_domain1:
    acme:
      email: admin@domain1.com
      storage: acme_domain1.json
      tlschallenge: true
      httpChallenge:
        entryPoint: web
cat data/custom/dynamic.yml 
http:
  middlewares:
    secureHeaders:
      headers:
        sslRedirect: true
        forceSTSHeader: true
        stsIncludeSubdomains: true
        stsPreload: true
        stsSeconds: 31536000   
             
    user-auth:
      basicAuth:
        users:
          - "admin:pass"
          
tls:
  options:
    default:
      minVersion: VersionTLS12
      curvePreferences:
        - secp521r1
        - secp384r1
      sniStrict: true
cat docker-compose.yml
version: '3'
services:
  traefik:
    image: traefik:v2.3.7
    container_name: traefik
    restart: unless-stopped
    security_opt:
      - no-new-privileges:true
    networks:
      - web
    ports:
      - 80:80
      - 443:443
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./data/traefik.yml:/traefik.yml:ro
      - ./data/acme_domain1.json:/acme_domain1.json
      - ./data/custom/:/custom/:ro
    labels:
      - "traefik.enable=true"
      - "traefik.docker.network=web"
      - "traefik.http.routers.traefik.entrypoints=websecure"
      - "traefik.http.routers.traefik.rule=Host(`traefik.domain1.com`)"
      - "traefik.http.routers.traefik.tls.certresolver=letsencrypt_domain1"
      - "traefik.http.routers.traefik.service=api@internal"
      - "traefik.http.routers.traefik.middlewares=user-auth@file"
networks:
  web:
    external: true
Читал документацию, пробовал добавить в traefik.yml раздел
  letsencrypt_domain2:
    acme:
      email: admin@domain1.com
      storage: acme_domain2.json
      tlschallenge: true
      httpChallenge:
        entryPoint: web
но не заводится. Кто нить такое реализовывал?

achilles_85
()

XMM аки RAM

 , ,

Всем привет. Насколько вообще оправдано использование xmm-регистров для временного (10-20 циклов) хранения некоторых данных? Пишу прошивку для управлений кой-чем. Флоат операции использовать там негде, а закидывать в память - не хочу занимать шину не вижу смысла. Вот и думаю как своеобразную «ОЗУ с быстрым доступом» юзать xmm.

tvldslv
()

C/C++ code navigation, call graph

 ,

Добрый всем день!

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

braboar
()

iGPU + dGPU passthrough: чёрный экран после завершения работы в гостевой ос

 , , , ,

Всем привет!

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

Имеется IOMMU/VT-d совместимое оборудование: RX580 видяха и интеловский проц

Имеется два моника: один воткнут по DVI-D в видяху, второй по VGA в мат. плату

В настройках биоса включена загрузка с IDG (через iGPU)

Дистрибутив: arch, 5.16.4-zen1-1-zen

Пробрасываю видяху с помощью qemu

Содержимое модулей /etc/mkinitcpio.conf

MODULES=(btrfs radeon vfio vfio_iommu_type1 vfio_pci vfio_virqfd vendor-reset)

vendor-reset нужен для rx580, известный амдушный баг, когда видяха блекскринит после завершения гостя и не оживает никаким способом, кроме рестарта хоста

Содержимое /etc/default/grub.cfg

GRUB_CMDLINE_LINUX_DEFAULT=«loglevel=3 intel_iommu=on kvm.ignore_msrs=1 vfio-pci.ids=8086:1901»

ids относится к dGPU, именно поэтому в биосе выставлен iGPU, иначе система застревает на Running early hooks (или как-то так, я прям дословно не помню

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

Мышь и клава шарится (через Barrier) и поэтому получается одновременно пользоваться и виндой и линуксом, как будто они единая система

И всё идеально, но...

Когда я завершаю работу гостевой системы, то моник на dGPU показывает чёрный экран

И решается это исключительно рестартом иксов (выход из сессии и запуск сессии заново)

Изначально даже этого не было (пришлось повозиться с vendor-reset, так как на 5.15+ ядрах он без бубна не захотел работать), но осталось дожать прям самую малость.

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

Докину дополнительной информации:

IOMMU groups - https://gist.github.com/Aquinary/5a0de919459f2fe45b48a880fc183d69

dmesg | grep «amd» - https://gist.github.com/Aquinary/f964646c90f32bf6f45fcddf5c396c64

journalctl -a (перед запуском вм предварительно очистил журнал и сделал сброс в файл сразу после завершения гостевой системы) - https://gist.github.com/Aquinary/3cb257040ae246d5b40aa48ed860afa3

lspci -vv (после завершения работы с гостевой ос) - https://gist.github.com/Aquinary/9c9a528384a72a157463c16b52a36419

xrandr до запуска вм - https://gist.github.com/Aquinary/77f4916b6dc6fbe0079b358891dafa3a

xrandr после завершения работы с вм - https://gist.github.com/Aquinary/0fbe0718b6784946445ce99f12c27612

/etc/libvirt/hooks/qemu- https://gist.github.com/Aquinary/657f1052edc870a34b0dd6e4e568cb9a

/etc/libvirt/hooks/qemu.d/win10/prepare/begin/start.sh - https://gist.github.com/Aquinary/00cc138324f22426dacc097dc959f785

/etc/libvirt/hooks/qemu.d/win10/release/end/revert.sh - https://gist.github.com/Aquinary/df9eceb9b3fd42c123d34dc99a951aa4

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

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

virsh nodedev-detach pci_0000_01_00_0
virsh nodedev-reattach pci_0000_01_00_0
sudo sh -c 'echo 0000:01:00.0 > /sys/module/amdgpu/drivers/pci:amdgpu/unbind'

Буду рад любой помощи, любым подсказкам (в том числе и альтернативным способам решения моей задачи), всё и так работает очень и очень хорошо, но вдруг есть какой-то способ сделать это лучше

Aquinary
()

GCC: как защититься от «оптимизации» конструкторов?

 

Здравствуйте.

Часть кода у меня в проекте выполенена в виде «модулей», то есть, исходник содержит функцию с __attribute__ ((constructor (xx))), выполняемую один раз при старте, которая помещает точки входа модуля в таблицу вызовов. Поскольку ни одна из функций модуля не вызывается явно из других частей программы, оптимизатор при линковке весь это модуль успешно выкидывает. Как сказать линкеру, чтобы он этого не делал?

r702
()

В стандарт C предложено внести лямбды и defer из golang

 , ,

Привет, ЛОР!

Я тут тебе немного покушать принёс. Как ты, наверное знаешь, не за горами выход нового стандарта языка C – C23. Среди прочих вкусностей, таких как лямбды в стиле C++, в этот стандарт предложено добавить механизм defer, аналогичный существующему в языке Go.

Ссылка на предложение: http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2895.htm

В случае, если этот стандарт будет принят, будет возможно написание вот такого кода:

p = malloc(N);
defer { free(p); }

Где аргументом оператора defer является анонимная функция. Так же возможны более сложные варианты использования:

enum { initial = 16, };
double buffer[initial] = { 0 };
...
size_t elements = 0;
double* q = buffer;
defer [orig = q, &q]{ if (orig != q) { free(q); }};
...
// increase elements somehow
...
// adjust the buffer
if (elements > initial) {
    double* pp = (q == buffer) ? malloc(sizeof(double[elements])) : realloc(q, sizeof(double[elements]));
    if (!pp) return EXIT_FAILURE;
    q = pp;
}
...

Учитывая всё это, скоро в C больше не будет нужно использовать goto вообще нигде, даже для очистки ресурсов при ошибке. Так заживём, ЛОР!

hateyoufeel
()

Баг компилитора или со мной что-то?

 

Привет.

Хотел написать так, чтобы создавался массив размером == шаблонному параметру и все его элементы инициализировались некоторым значением (в момент создания, а не потом обходом, т.к массив юзер типов, надо через конструктор). Написал:

#include <array>
#include <utility>
#include <iostream>
using namespace std;

template <size_t I>
struct Init_val {
    static int f(int val) {return val;}
    static constexpr int i = 9;
};

template <size_t num>
struct S {
    void f(int val) {
        [val]<size_t ...I>(index_sequence<I...>) {
            array ar{(Init_val<I>::f(val) , ...)};
            array ar2{(Init_val<I>::i , ...)};

            // check
            for (int a : ar)
                cout << a;
            cout << endl;
            for (int a : ar2)
                cout << a;
            cout << endl;

        }(make_index_sequence<num>{});
    }
};

int main() {
    S<5> s;
    s.f(7);
}

шланг и ГЦЦ компилирует без ошибок, но при запуске ожидалось пять семёрок и пять девяток, но:

$ g++ 2.cpp -std=c++20  &&  ./a.out 
7
9

Надо багрепорт писать?

PS: я там два массива сделал, вообще мне нужен тот что с функцией, но т.к. с функцией конструкция шибко хитрая, то написал вариант с константой - тоже не работает.

kvpfs
()

asyncio и http(s) прокси

 

Привет, lor!

Имеется http прокси. Для получения запросов открываю сокет socket.create_server; если приходит CONNECT, отправляю 200 Connection Established, а затем заворачиваю сокет в ssl контекст context.wrap_socket.

Появилось желание переписать с использованием логики asyncio. Не понимаю, как StreamReader завернуть в ssl. В документации вижу, что можно открыть либо plain http, либо сразу ssl; но как тогда обработать запрос CONNECT?

Благодарю за помощь.

rmu
()

Как заставить Debian работать из RAM

 , , , ,

Итак, я продолжаю «искать свой святой Грааль» - метод загрузки полноценной custom-системы Debian целиком в RAM. Сперва пытался сделать это путем помещения всей системы в initramfs - все заработало, да только большая система (с GUI и кучей приложений) не грузится (после загрузки ядра начинает грузить initramfs и выдает Invalid argument - при этом такой же Дебиан но без GUI и программ весом до 1 ГБ грузит в RAM в составе initramfs без проблем: по всей видимости, где то ограничение на размер initramfs зашито в ядре, туда лезть у меня не хватит, боюсь, знаний).

Тогда я решил поместить в RAM систему другим путем, который в общих чертах описан здесь: https://habr.com/ru/post/253759/

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

1. Меняем конфигурацию initramfs, отключая проверку кФС (здесь и далее - обозначение корневой ФС) и стандартное монтирование кФС:

# checkfs ${ROOT} root
# mount ${roflag} -t ${FSTYPE} ${ROOTFLAGS} ${ROOT} ${rootmnt}
а затем создаем временную точку монтирования (еще работая в пределах initramfs!) для нашего CD:
mkdir /ramboottmp
монтируем нашу кФС с CD во временную точку монтирования:
mount ${roflag} -t ${FSTYPE} ${ROOTFLAGS} ${ROOT} /ramboottmp
Создаем ФС в RAM:
mount -t tmpfs -o size=100% none ${rootmnt}
Ну и распаковываем нашу кФС (файл ram.tar.gz) в эту tmpfs:
cd ${rootmnt}
tar -zxf /ramboottmp/ram.tar.gz
umount /ramboottmp

2. Геним новый initramfs:

/sbin/mkinitramfs -o /initrd-ram.img

3. В кФС (автор поста предлагал заходить туда из-под Live-CD, я предпочел напрямую вытащить кФС из виртуального диска .vdi - но это дело вкуса) отключаем прописанное там в /etc/fstab монтирование кФС и пишем свое:

none / tmpfs defaults 0 0

4. А затем архивируем всё из корня:

busybox tar -czf /путь-к-архиву/ram.tar.gz *

5. Создаем директорию, туда кидаем isolinux (в директории isolinux, разумеется), в эту же директорию isolinux кидаю ядро и initrd-ram.img, а ram.tar.gz кидаю в основную директорию. В isolinux.cfg прописываю:

DEFAULT MyLive
LABEL MyLive
linux /isolinux/ЯДРО
APPEND initrd=/isolinux/initrd-ram.img root=/dev/sr0 rw

6. Ну и генерирую .iso:

genisoimage -o disk.iso -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -J -R /полный-путь-к-директории-из-пункта-5

Указанный .iso шикарно грузится, лишь немного затупливая при заливке 1.6 ГБ в RAM - но! Сам Линукс не загружается, выдавая в конце ошибку:

No init found. Try passing init= bootarg

При этом в директории root лежит моя кФС, то есть все, что я прописывал в initramfs РАБОТАЕТ! Но система то не запускается...

Что я пробовал:

1. По рекомендации самой системы выполнить run-init, указав в качестве NEW_ROOT точку монтирования моей кФС (/root), а в качестве NEW_INIT - Init моей кФС (/root/sbin/init):

run-init /root /root/sbin/init
Не происходит ровным счетом НИЧЕГО. Просто заново выдает консоль initramfs'а.

2. Просто запустить init initramfs'а:

/sbin/init
Выдает:
Not activating Mandatory Access Control as /sbin/tomoyo-init does not exist. Init must be run as PID 1

3. Кончилась фантазия и обращаюсь к Форуму...

dima9kin
()

«Никто», 2021, боевик, США

 ,

Последнее время, решая проблему выбора кино в каталоге, стал просто смотреть то что предложила система+понравился буклет. Честно, шедевров пока таким методом не находил. Ну и ладно. Это кинцо тоже годно только под пиво.

Уставший от жизненной рутины белый воротничок ввязывается в уличную драку с членами русской мафии и побеждает (на первый раз). И вот данный скрин встречается в контексте такого разговора:

– (глава общака и русской мафии в американском городе) Найдите на него все что сможете

– (девушка-ассистент русского мафиози) Пока ничего особенного нет, но у меня есть дружок в Пентагоне, он не сможет мне отказать

Далее показывают то, что я приложил в качестве снимка, а вы думали как выглядит процесс установки связи с Пентагоном? По снимку так же понятно что русская мафия предпочитает Ubuntu и Samsung.

PS. Будем считать что я посмотрел этот фильм за вас, твердая троечка не смотря на наличие пары российских звезд кино и песни группы Комбинация – «Бухгалтер» в качестве main theme.

Shulman
()

Chromium-based браузеры: как быть?

 , ,

Такая ситуация. Сначала сравниваю Chromium и Chrome. Дистрибутив NixOS.

Chromium - работает видео ускорение! (да, свершилось! у меня оно завелось!!!). Я так понимаю (только с криокамеры, могу сильно ошибаться) что его специально собирают с поддержкой VAAPI. Как добился активации:

  1. Ставлю флаг Override software rendering list

  2. Запуск с ключами –use-gl=desktop –enable-features=VaapiVideoDecoder

  3. h264ify, потому что у меня SandyBridge бронзового века.

Все бы круто, но - нет синхронизации!

Chrome - есть синхронизация. Но не заводится ускорение! Все те же действия - приводят ни к чему. в chrome://gpu горит желтым.

Собственно вопроса два возникает.

  1. Можно ли получить ускорение в Chrome?

  2. Можно ли получить синхронизацию в Chromium? (не обязательно с гуглом, как угодно между компами с линуксом).

James_Holden
()