LINUX.ORG.RU

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

Моноколесо, для езды на работу (~12км - говна+ асфальт в ямах)

Форум — Talks

Увлечение js не проходит бесследно. Увидел у какого-то хипстера в городе колесо, задумался. Трачу на маршрутки 10тыр/год. Задача моноколеса довести мою жопу до работы. (опционально 2 км с ребенком до садика + 10 до работы). Дорога - 1 км говна, 11 км асфальта средней убитости. Перепад высот на протяжении пути метров 100. Бюджет 20 тыр, также стоит вопрос окупаемости всего этого мероприятия - как быстро умрёт батарейка, сколько стоит её замена и сколько проживет бюджетное колесо при таком режиме эксплуатации (холод, влага, грязь, 5/2, ~25км/день)

UPD. Если подумать - то велик - норм. Но цена мотор-колеса такая, как будто оно сделано из серебра. Думаю как смастерить из говна и палок:) UPD2. Прав на вождение нет и не будет в обозримом будущем. Транспорт крупнее велосипеда держать негде.

 ,

crutch_master
()

Weston готов для продакшена

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

Решил посмотреть на какой стадии wayland/weston. Оказалось все не так уж и плохо. Пока останусь на нем.

weston.ini

Из опробованных порядка 15 програм запустились все (кроме bbrun). Нативно (без xwayland) запустились только transmission-gtk и gnome-shell.

Для того чтобы gtk3, qt5 и efl запускались нативно, надо чтобы в environment были следующие переменные:

export GDK_BACKEND=wayland
export QT_QPA_PLATFORM=wayland-egl
export ECORE_EVAS_ENGINE=wayland_egl
export ELM_ENGINE=wayland_egl

Иногда переменных мало и надо еще испортить DISPLAY:

sh# DISPLAY=666 terminology

Есть проблемы с менюшками. В хроме не работает клик по пункту меню, вызванному правой кнопкой мыши. Вместо клика можно нажать enter. Gnome-shell тихо умирает когда долго теребишь ему панель меню.

Что есть:

  • Русская раскладка
  • Виртуальные рабочие столы
  • Симпатичный лаунчер

Чего нет:

  • Поддержки мыши в консоли (только скролл)
  • Кастомных шорткатов (впрочем изкоробки выбор неплохой. Не хватает только запуска терминала)
  • Тайлинга

UPD: Вываливается в терминал при использовании буфера обмена

 , ,

makoven
()

Suckless

Галерея — Скриншоты
  • dwm
  • st
  • nvim

Вроде бы всё

 , , ,

rk-d
()

Ещё один скрин

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

Постепенно опять скатился к комфортному DE на основе Compiz и ржавых гвоздей.

Чё тут есть

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

 , ,

zezic
()

Новый скрин

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

Давно не было новых скринов от меня. Пришло время встряхнуть этот гадюшник ЛОР.

Что на этот раз:

 , ,

zezic
()

Arch Linux LXQT + xfwm

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

Всем привет, все скрины — scrot.moe/album.

Тени рисует compton.

 , , ,

stupid
()

ranger: Solarized Dark для терминалов с 16 цветами

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

ranger is a text-based file manager written in Python. (c) ArchWiki/ranger

Поскольку я использую цвета Solarized для своего терминала, я использую 16-цветовой вариант, потому что он лучше. Но для файлового менеджера ranger можно включить только 256-цветовой вариант Solarized; и если его включить для 16-цветового терминала, то цвета будут отображаться неправильно.

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

 ,

kalterfive
()

TWIN, или ностальгия по Turbo Vision

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

Однажды на работе было особенно тоскливо, и решил я собрать эту штуку (а заодно и посмотреть на API).

ИМХО, для десктопа пока не годится (emacs, screen или, прости господи, tmux на экзотических терминалах куда стабильнее), но фичи же! Перекрывающиеся окна! Окна переменного размера! Поддержка Unicode! Расширяемое API!

Что примечательно, проект не делит ни строчки исходного кода ни с одним из форков оригинального Turbo Vision, т. е. велосипед был честно изобретён с нуля.

P.S. Проект уже давно переехал с SF (ещё скриншоты) на GitHub (завалите автора pull-реквестами).

P.P.S. Звиняйте за шрифты и обоину!

 

Bass
()

Расширенный Си

Форум — Talks

Не так давно я презентовал здесь свой велосипед - c-oop-gen: ООП в Си. А именно генератор сишного кода в ООП стиле из XML описания. Тогда мне объяснили, что XML не лучшая идея для представления программного кода. Так что встречайте мой новый велосипед - https://github.com/KivApple/c_ext.

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

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

struct A {
    int a;
};

struct B: A {
    int b;
};

При этом очень немаловажен тот факт, что указатель на B совместим с указателем на A (но не наоборот). Под капотом там незаметно вставляется приведение типов, если оно необходимо.

Во-вторых, у структуры теперь могут быть методы:

struct A {
    int f();
};

int A::f() {
    return 100500;
}

Инлайнить (реализовывать методы прямо внутри структуры) нельзя, но я считаю, что это не очень нужно, ибо это таки С, а не С++ и программист должен явно определять, в каком исполняемом модуле окажется функция (а если очень хочется, может описать её как static в момент реализации и поместить в заголовочный файл).

Всем нестатическим методам автоматически передаётся указатель на структуру this, с которым можно свободно работать.

В-третьих, у структур теперь могут быть статические члены:

struct A {
    static int i;
    static void test();
};

int A::i;

void A::test() {
    ...
}

В-четвёртых, у структуры могут быть виртуальные методы. Правда, чтобы они работали, нужно обязательно объявить конструктор - нестатичный метод с именем construct, а также вызвать его до любого вызова виртуального метода.

В-пятых, можно явно обратиться к родительской реализации. Как-то так:

struct A {
    void f();
};
struct B: A {
    void f();
};

void B::f() {
    this->A::f();
}

Данный транслятор должен понимать большинство gcc-змов. Во всяком случае я проверил его на нескольких стандартных заголовочниках (а они полны gcc-змов) и он всё скушал, а на выходе получился валидный код. Однако крайне не рекомендуется применять всякие атрибуты к структурам и их членам, если вы используете новые возможности (если нет, то определения не будут изменены, а вот если транслятор в них уж полез, то он может съесть что-то неподдерживаемое).

Также транслятор сам по себе понимает директивы #line и генерирует свои после окончания обработки. То есть ему можно подавать на вход результат работы любого препроцессора (cpp, m4 и т. п.), а в сообщениях об ошибках компилятора будут адекватные указания, где произошла ошибка.

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

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

В общем, вот такие дела. Жду ваших комментариев.

Особенно меня интересует вопрос: что делать с конструкторами, собственно? Можно вызывать их в C++ стиле - то есть в момент объявления переменной (или выделения памяти). Это хорошо, конечно, что никто не забудет вызвать конструкторы, но как-то недостаточно Plain C-way. А что если мы хотим выделить память, а конструктор вызывать лишь спустя какое-то время? От ответа на этот вопрос зависит и судьба деструкторов - если конструктор гарантированно вызывается, то мне не проблема автоматически вызвать деструктор. Но в текущем виде автоматическому вызову деструктора не место (а вдруг объект не был сконструирован?).

Также интересует нужность перегрузки функций. Я могу сделать манглинг имён (а чтобы сохранить совместимость с Си, не менять имя первого объявления функции), но насколько он нужен?

P. S.: Планы на будущее: поддержка лямбд и асинхронного программирования.

UPD1: Добавил поддержку анонимных функций, в том числе с захватом переменных из текущего контекста по ссылке или по значению. См. README.

UPD2: Добавил начальную поддержку самого главного, ради чего всё затевалось. А именно - поддержку асинхронного программирования. Теперь можно вызвать функцию, возвращающую void и ожидающую делегата в качестве последнего аргумента (у меня делегат - это любая структура, у которой первое поле это указатель на функцию, которая первым аргументом принимает указатель на эту структуру), не указывая значение для этого самого аргумента. В результате случится магия и текущая функция станет асинхронной (функция, которая подтвергается данной метаморфозе, должна возвращать void и не принимать переменное число аргументов). Переменные, которые используются одновременно по разные стороны от асинхронного вызова будут сохранятся в специальную структуру состояния. Сама структура состояния будет создана с помощью malloc при входе в асинхронную функцию и освобождена при выходе (будь то естественное завершение или выход с помощью return). Пока в реализации есть косяки, но я их исправлю. Внутри асинхронной функции категорически не рекомендуется использовать goto, ибо это сломает алгоритм определения какие переменные нужно сохранять при асинхронном вызове.

 , , , ,

KivApple
()

c-oop-gen: ООП в Си

Форум — Development

Программирование в ООП-стиле на Си как правило порождает достаточно большое количество boiler plate кода. А итоговая программа пестрит приведениям типов. «Хватит это терпеть» решил я и запилил сие поделие: https://github.com/KivApple/c-oop-gen.

1) Вы описываете структуру классов (поля, методы, наследование) в XML-формате.

2) Вы генерируете два заголовочных файла из этого описания. Рекомендуется делать это не в ручную, а в качестве одного из шагов компиляции проекта.

3) Первый файл вы инклюдите всюду, где хотите использовать описанные классы. Второй файл вы инклюдите только в модуль с реализацией соответствующих классов (там описаны таблицы виртуальных методов).

4) PROFIT

Пример описания пакета классов:

<?xml version="1.0" encoding="utf-8" ?>
<package>
    <include file="stdlib.h"/>
    <class name="BaseObject">
        <method name="destroy" virtual="yes">
        </method>
    </class>
    <class name="DerivedObject" inherits="BaseObject">
        <field name="tmp" type="int"/>
        <method name="foo">
            <arg name="bar" type="int"/>
        </method>
        <method name="staticMethod" static="yes"/>
    </class>
</package>

После этого методы классов можно вызывать легко и просто:

DerivedObject_foo(another_object, 10);
DerivedObject_staticMethod();
DerivedObject_destory(another_object);
BaseObject_destroy(some_object);

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

Поддерживаются виртуальные методы (как абстрактные, так и имеющие реализацию, к слову, переопределять в потомках можно только виртуальные методы), статические методы (не наследуются потомком, рекомендуется конструкторы делать на них) и обычные. Также любые методы могут получить переменное число аргументов с помощью атрибута «variadic».

Конструктор может быть любой функцией. Главное присвоить obj->vtable = &ClassName_vtable, если класс содержит хотя бы один виртуальный метод.

Деструкторы - это обычные виртуальные функции.

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

В отличии от многих других библиотек привносящих ООП в Си, сгенерированный код не требует НИЧЕГО (даже libc). Ведь это просто набор define'ов и структур.

Кстати, пакеты классов могут использовать друг-друга с помощью <include package=«some-package.xml»>. В этом случае можно будет наследоваться от классов объявленных в другом пакете (а сгенерированный исходник будет содержать #include «some-package.h»). При этом однако же генерировать заголовочный файл для подключенного пакета придётся отдельно.

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

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

 , , , ,

KivApple
()

Скриншот новичка :)

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

Привет, форумчане :) Linux я установила буквально пару дней назад и, по наводке одного знакомого, зарегистрировалась тут. Вопросов по работе системы у меня пока нет, поэтому решила показать свой рабочий стол :)

Правда там ничего интересного особо нет :) Всего лишь переделанная Elementary, шрифты, которые мне нравятся ещё с винды. Ну ещё пытаюсь разобраться в коде vk.com, и слушаю на ютьюбе веселые песни :D

Ах да, что-то темы у вас хмурые. Надо бы установить stylish и сделать что-нибудь весёленькое :)

Всем удачного дня :)

 

Jenifer
()

i3. Не опять, а снова

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

Экстракт всего ненужно в одном скриншоте.

  • ОСь - Рач
  • WM - i3-gaps
  • Панелька - polybar
  • Блокнот Редактор кода - VScode
  • Терминал - tilix(тайлинг в квадрате)
  • Файловый менеджер - ranger

 , ,

RedMaun
()

Радужный i3

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

Собственно решил обновить свой конфиг десктопа и вот что получилось.

  • Операционный стол - Рачик
  • Запуск приложений - Rofi(скрин)
  • Неосилил vim - VScode(скрин)
  • Есть же i3blocks - Polybar
  • Терминал - Alacritty
  • ФМ на скриншоте - Ranger
  • Основной ФМ - Thunar(скрин)
  • Browser - Огнелис(скрин)
  • GTK тема - Сгенерирована с помощью oomox'a(скрин)
  • Цветовая схема - Pywal(скрин)
  • Тема для VScode - Своя

 , , ,

RedMaun
()

Гайка собирает Emacs

Галерея — Рабочие места

Рисунок был нарисован на бумаге карандашом. Потом отсканированный и разукрашенный в gimp'е.

Новичку-линуксоиду надоела политика microsoft в windows 10 по шпионажу. Он решил попробовать установить один из дистрибутивов Гну/Линукс. И он захотел собрать первую в жизни программу из исходного кода, но программы не как не собирались. Повозившись весь день, он под ночь лёг спать. И о этом узнали спасатели. Тогда Гайка пришла ему на помощь и собрала ему программу пока он спал.

cc-by-sa

 , , , ,

gtk3
()

Безликий Void

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

Вот и прошел примерно год с момента установки Void Linux. В целом впечатления от дистрибутива крайне положительные, ничего не ломалось за год и все обновления проходили безболезненно. Здешний runit пусть и выглядит довольно тривиальным на фоне OpenRC/systemd, но я его один раз настроил и забыл. Навевает атмосферу того самого старого Arch, которым он был до определенных изменений. :)

За прошлый год я перебрался сначала с vim на neovim в январе, а затем осенью пересел на Emacs с evil'ом примерно в то время, когда свет увидел vim 8 версии.
Ориентироваться в экосистеме Эмакса изначально было довольно трудно (у вимеров и эмаксеров, как оказалось, совершенно разное представление о документации), но на выходе я получил более монолитную, более функциональную и настраиваемую среду, в которую оставалось добавить только редактор. В vim'e мне довольно сильно досаждала лапша среди языков для расширений и слабая интеграция самих плагинов между собой.
Скорость? В боевом варианте nvim с автокомплитом и filetype плагином не намного быстрее настроенного Emacs'a, как оказалось. Да, vim быстр и удобен в консоли для правки конфигов или написания скриптов, но для более нетривиальных задач приходилось делать много лишних телодвижений. Я не агитирую бросать vim под предлогом «это плохой редактор» — нет, это действительно годный редактор для определенных задач и пользователей, но если вы ощущаете дискомфорт при разработке, то можете попробовать Emacs.

Скриншот с окнами: Thunar, termite с запущенным ncmpcpp и viewnior

Основной скриншот в png

На скриншотах:

Мои конфиги пока не готовы к выпуску в свет.

 , ,

Ordy
()

Развитие моего конфига i3

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

Раз тут такое спонтанное выкладывание i3, то я тоже выложу своё.

Это - постепенное развитие моего конфига, который был сделан «по вашим советам» (NixOS + i3 + KDE (по вашим советам))

Основные внешние изменения - добавлены konversation с конфигом, цветовая тема okular, «цветовая тема» firefox ( LOR habr github ).

Ещё я попробовал попользовать XMonad, особого профита для себя не увидел. Вместо этого просто научился использовать табы в i3.

Внутри я добавил плагинов emacs для своего комфорта, растащил конфиг по отдельным файлам, дописал плагинов для albert, перешёл на rclone с gdrive-ocamlfuse.

Конфиг: https://github.com/balsoft/nixos-config/

ПО

  • NixOS+home-manager
  • i3
  • polybar

На этом скрине

  • emacs

Вообще

  • firefox
  • albert
  • dolphin
  • konsole + zsh
  • kdenlive
  • trojita, telegram-desktop, vk-messenger, konveration
  • VirtualBox для виртуалок с «нормальными» дистрами

Скрины того, чем я занимаюсь

  • Основной скрин: допиливание скриптов polybar
  • учёба

 albert, , , ,

balsoft
()

Emacs - мой новый window manager

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

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

EXWM расшифровывается как Emacs X Window Manager и превращает Emacs в полноценный тайловый оконный менеджер для X-сервера.

В итоге - он прекрасно прижился у меня на рабочем ноутбуке. Работает стабильно, был один баг с переключением раскладки в line mode, но автор довольно оперативно его исправил после общения на github. В результате, я полностью перешел с dwm на exwm и очень этому рад.

В остальном система практически не поменялась.

  • Ноутбук: Acer E11
  • Дистрибутив: Slackware 14.2
  • Оконный менеджер: exwm, версия из git
  • Редактор кода и Desktop Environment: Emacs, версия из git
  • Shell: Eshell
  • Email-клиент: Gnus
  • Музыка: emms
  • IRC: rcirc

 , ,

Deleted
()

Кастомное что-то

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

!!! Скрин в жипеге !!!

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

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

В первую очередь порадовал возврат на саблайм со связки атом+вим и переход на polybar вместо i3bar+py3status.

Номера+названия воркспейсов были заменены иконками, что было очень непривычно, т.к. раньше я всё раскидывал как попало, но в итоге пришёл к 3-4 воркспейсам на монитор и через небольшое время стало даже проще ориентироваться.

Минимализм из-за некоторых вещей немного пострадал, система обвещана, как незнаймо что, настолько, что я побаиваюсь всё это дело сохранять где-нибудь в гит репозитории, ибо тянуть нужно огромное количество скриптов, по пути кастомизации сделал много пулл реквестов в разные плагины, утилиты и форкнул youtube-dl в котором добавляю экстракторы для «пиратских» сайтов, которые по правилам youtube-dl в репозитории находиться не могут. Немного неприятно синхронизировать с апстримом, но стоит того, чтобы смотреть, например, аниме сезон одним плейлистом, без браузера, ещё и с сохранением последней серии и времени просмотра.

Если кому-то нужны конфиги и/или модули/скрипты/плагины коих куча, пишите в дискорд (d3adc0d3#9019), в других местах почти не сижу.

Как соберусь и запилю репозиторий со всеми dot файлами и README/скриптом для установки зависимостей и/или развёртывания всего этого дела, выброшу на общее обозрение.

Ах да, если что, в саблайме небольшой Nim пакет для работы с Riot Developers Api.

Ещё скриншоты:

https://imgur.com/a/KLRU2

Сводка:

Дистр: Arch

ВМ: i3-gaps

Бар: polybar

Редактор: Sublime Text 3 Dev

Терминал: Xfce4 Terminal

ШГ: Noto (UI), Noto Mono (Terminal), Fira Code (Sublime)

Тема саблайма: кастом

Плагин polybar'а для mpv: кастом

 , , ,

Deleted
()