LINUX.ORG.RU

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

Tcl/tk. GUI на SVG-виджетах. Часть I

Статьи — Разработка

Хочу представить свой пет-проект . Создан он в недрах tсl/tk, который, по моему мнению, многие недооценивают. В статье речь пойдет не столько о tcl (хотя все примеры и сам проект написаны именно на нем), а сколько о tk.

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

 , , , ,

TclTk
()

Какой лаунчер использовать для minecraft на arch?

Форум — Games

Всем привет! Какой лучше всего использовать лаунчер кубиков на арче? И может есть специальный лаунчер именно для арча?

Перемещено hobbit из general

 ,

superpro22222
()

ANAKRON — новый моноширный растровый шрифт с поддержкой кириллицы

Форум — Desktop

https://github.com/molarmanful/ANAKRON

Перемещено dataman из opensource

 ,

anonymous
()

FyneDesk: элегантная DE на go + куча классных приложений

Форум — Talks

Искал не напряжные кроссплатформенные фреймворки (спойлер: всё грустно) и наткнулся на Fyne (на самом деле давно был в закладках, но потыкал только сейчас). Проект пилят с 2018, но он ещё молодой и особой популярности у него (НЕЗАСЛУЖЕННО) нет, судя по количеству приложух.

крч, некоторые приложухи с галереи сайта:

  • Fin: логин-менеджер
  • FyneDesk: DE в стиле старой убунты на Unity
  • Fybro: простой мессенджер для Telegram, Discord, WhatsApp (как Pidgin когда-то, пока плагины под него не сдохли без поддержки)
  • YTB Downloader: простая качалка для YouTube, ничего лишнего
  • Task Manager: список задач, тоже ничего лишнего

Мне очень зашёл стиль, который не GTK и не QT, которые сильно изуродовались в последнее десятилетие. Никаких кнопок в полэкрана и всего такого — нормальный, человеческий GUI.

Накатывается легко — это же гошечка, там всё компилится в пару команд. Опакетить бы такую прекрасную находку…

Wayland поддерживается, уже давно (с 2020 где-то).

Особенно зашёл FyneDesk — я считаю, его легко допиливать под себя, да там и упор сделан именно на эту фичу. И он воплощает именно тот минимализм, которого так не хватает во всяких разожравшихся XFCE, которые сегфолтятся и до сих пор нормально не поддерживают вяленд.

@Qui-Gon глянь, это получше голого wayfire будет, который тоже сегфолтится на каждом клике. Наконец-то человеческая DE, под которую легко писать — никаких тебе си, крестов, легаси, питон-конфигов сборки на миллион строк (ведь сраный си принципиально несовместим с концепцией пакетного менеджера), растов и прочего неподдерживаемого оверхед говна. (предыстория баттхёрта)

 , ,

InterVi
()

Лучший способ определить, на какой ФС находится файл.

Форум — Development

Может есть что-то попроще, чем прочитать /etc/mtab и проверить, какой смонтированной ФС принадлежит путевое имя файла? Программа на Си.

 , , фс

zloy_starper
()

Astroterm — карта звёздного неба в терминале

Новости — Мультимедиа
Группа Мультимедиа

Студент Корнеллского университета Далтон Лус представил открытый проект astroterm – карту звёздного неба в терминале. Исходный код программы написан на C и немного на Python и опубликован на GitHub под лицензией MIT.

Особенности:

🔭 выбор любой даты, времени и местоположения для исследования прошлых, настоящих или будущих небесных явлений
📐 просмотр Луны, звёзд и планет с максимальной точностью, которую позволяет графика терминала
🌘 точные фазы Луны в режиме реального времени
🌌 подробные формы созвездий
⚡ лёгкая и быстрая ASCII-графика

>>> ГитХаб проекта

>>> новость на Хабре

>>> гифка с работой программы, которая не влезла на ЛОР из-за размера

 , , ,

avgust23
()

Во что поиграть, если у тебя нет современного железа?

Форум — Games

Привет, ЛОР!

Серьезная просьба к вам: поделитесь играми, в которые стоить поиграть человеку, который никогда не играл в сталкера, халфу, диаблу и хочет наверстать упущенные крутые проекты. По крайней мере, в народе ходят слухи, что они могут быть «о боже, 10 из 10».

Условия запуска: проц со встройкой или старые видеокарты типа radeon 4650.

Пожелания:

  1. Эра до PS4 (говорят, что тогда оптимизация ещё существовала).
  2. 3D или изометрия.

Вкус автора:

  • Vampire: The Masquerade — Bloodlines (когда хочешь поиграть в шахматы, но блондинка уходит в отказ)
  • Condemned: Criminal Origins (когда насолил алкашам из соседнего подъезда)
  • Prince of Persia (1, 2, а вы что, не чувствуете, как Дахака, встав на карачки, преследует вас?)
  • Assassin’s Creed (первая часть навеки, а то всё бабы-бабы)
  • F.E.A.R. 2 (да-да, первая часть лучше, но мне заходит вторая, пмс - дело серьезное, да ещё и с графоном)
  • Sanitarium (а кто не катал свои подружку на санках?)
  • Deponia (вы выносите мусор регулярно?)
  • Manhunt (когда соседи не дают поспать после суток)
  • Dark Messiah of Might and Magic (когда нужно научится бить с ноги в короткие сроки)
  • Need for Speed: Most Wanted (когда дпс по-настоящему любит тебя)

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

Вот совсем не заходят мне эти ваши герои меча и магии 3 - в топку их. Есть только слабость к слэшэрам. Не надоели до сих пор, даже приметил «The Lord of the Rings: War in the North», о коей никогда раньше не слышал.

 ,

Reptile
()

Игры в терминале

Форум — Games

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

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

Теги для поисковых ботов (жрите мои любимые ботики): ascii games, terminal games, ncurses games, tty games, console games, cli games, tui games, text-based games, command line games, игры в терминале, игры в консоле, игры для командной строки.

Критерии отбора:

  1. Язык программирования: Си(в приоритете), си++. Остальные пока не рассматриваются. Потенциальные в будущем - ада, фортран, бейсик, паскаль. Жирный пайтон идет лесом, хипстерские гоу, раст и иже с ними туда же.
  2. Открытые исходники с лицензиями, позволяющими модификацию, не препятствующие распространению. Свободные и одобренные дядюшкой Столлманом в приоритете.
  3. Зависимости. Без sdl и других графических либ. Опционально пускай будет, например, для музыки. Но не навязывается. NCurses и подобные библиотеки для работы с терминалом всяко одобряются и котируются. Не приветствуются в зависимостях всякие гугловские юнит тесты и другие чёрт ногу сломит либы. Для маленьких терминальных игр эта мишура не нужна.

Источники игорей:

  1. https://ttygames.wordpress.com/
  2. https://github.com/ligurio/awesome-ttygames
  3. https://inconsolation.wordpress.com/
  4. https://kmandla.wordpress.com/
  5. https://ibiblio.org/pub/linux/games/ Артефакты прошлого. Игры для терминала надо искать. Не всё собирается с современным компилятором.
  6. gopher://sdf.org/9/users/saahriktu/bttf/gamez_p0.tar.lzma (использовать lynx) - сборник ascii игр, собранный камрадом @saahriktu
  7. https://www.youtube.com/user/livibetter/videos
  8. https://zenway.ru/tag/ASCII
  9. https://blends.debian.org/games/tasks/console
  10. ASCII игры по Linux
  11. Поиск на github.com, gitlab.com по соответствующим запросам
  12. Поиск рогаликов на http://www.roguebasin.com/index.php?title=Category:Roguelike_games
  13. Все поисковики, даже малоизвестные иногда выдают страницы, на которые не попадешь с гугла или яндекса.

Сами игори:

!!!NEW!!! 1. 8f - Терминальный вариант карточной игры Сумасшедшие восьмёрки (Crazy Eights).

  1. Alienwave - Сложная Galaga-подобная игра с хорошим ascii-артом.
  2. Bricktick - Красивый клон арканоида с бонусами.
  3. CLines - Качественная реализация всеми известной офисной игры Color Lines.
  4. Dominoes - Реализация одного из вариантов игры Домино.
  5. Lwrace - Бегаем символом «O», собираем «$», избегаем «#», уворачиваемся от «o».
  6. Morpion solitaire - Отличная реализация отличной же тетрадной игры Join Five.
  7. MyMan - Пакман для терминала с множеством настроек.
  8. Peg-solitaire.c - Добротная реализация одноименной настольной игры с 5-ю раскладками.
  9. XT gyoretsu - Воссозданная с любовью и с ncurses старая тетрадная игра.
  10. Ztrack - Псевдо-тридешные гоночки с красивым бэкграундом.
  11. to be continued

 , , ,

nab_linux
()

STC 5.0

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

После почти двух лет разработки состоялся выпуск 5.0 библиотеки STC (header-only), написанной на языке C (стандарт C11) и распространяемой по лицензии MIT.
Библиотека предоставляет большой набор структур данных и алгоритмов, основанных на макросах C и свою реализацию регулярных выражений и форматированного вывода.

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

>>> Список изменений версии 5.0 на GitHub

 , , , ,

dataman
()

mmtui — TUI для монтирования дисков

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

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

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

>>> GitHub

 , , ,

SL_RU
()

EasyEffects не нужно, или PipeWire для продвинутых: часть 1

Статьи — Desktop

ВСТУПЛЕНИЕ

Звуковая система PipeWire принесла, без преувеличения, революцию в мир десктопно-мультимедийного Linux. Наконец то эта ОС получила продуманную, сделанную по уму понимающими в теме людьми, и сделанную качественно звуковую систему. Многие ее возможности присутствовали и раньше, в других более старых звуковых системах, но в PipeWire они собраны воедино и сформировали целую единую платформу, на которой можно реализовать огромное количество самых разных задач.

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

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

 , ,

James_Holden
()

Пилю генератор кода для компилятора

Форум — Development

Здравствуйте, теребятки! С вами наша непостоянная рубрика ненормальное программирование.

В качестве пет-проекта я потихоньку пилю собственный Ada-подобный ЯП. Планов на фичи языка очень много, но пока он по фичам не далеко ушел от ранних вариантов сишечки. Однако сегодня не об этом. Сегодня я вам хочу рассказать о генерации кода.

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

Сегодня мы посмотрим, что получается, если решать задачу заведомо неподходящим способом.

Некоторые используемые приёмы оптимизации:

  1. Отслеживание, какие константы или значения выражений загружены в регистры и устранение избыточных загрузок.
  2. Переупорядочивание вычисления операндов выражения.
  3. Устранение выдачи неиспользованных меток. (Помогает лучше отслеживать состояние регистров в п.1.)
  4. Устранение избыточных цепочек jmp-ов. (Когда jmp делается на следующий jmp.)

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

Пример 1.

Генератор кода устранил 4 инструкции mov EAX, dword [EBP+8], так как увидел, что значение переменной Index уже загружено в регистр.

Функция:

char @DictGetFullyQualifiedName(word D)
	when D >= nDict:
		StopInternal(__FILE__, __LINE__);

	word Index = Dict[D].FullyQualifiedName;
	when Index != 0:
		return @Char[Index];

	char Buff[nBUFF];
	strbuf buf;
	strbuf_init(@buf, @Buff, nBUFF);
	Dict_MakeFullyQualifiedName(@buf, D);

	Index = SaveString0(@Buff);
	Dict[D].FullyQualifiedName = Index;
	return @Char[Index];
end

Сгенерированный код:

@10342:                                  ; ## DictGetFullyQualifiedName ##
        push    EBP
        mov     EBP,  ESP
        sub     ESP,  144
                                         ; #line compiler_dict.ctxi:84
        mov     EAX,  dword [EBP+8]
        cmp     EAX,  dword [@@DATA+8476676]
        jb      @10343
                                         ; #line compiler_dict.ctxi:85
        push    dword 85
        push    dword @@ROLITERALS+7329
        call    @10235                   ; StopInternal
@10343: 
                                         ; #line compiler_dict.ctxi:87
        mov     EAX,  dword [EBP+8]
        imul    EAX,  77
        mov     EAX,  dword [@@DATA+EAX+776684]
        mov     dword [EBP-4], EAX
                                         ; #line compiler_dict.ctxi:88
                                         ; Node link reuse in CodePrimaryWrapped
        ; Переиспользуется значение Index в регистре EAX
        test    EAX,  EAX
        je      @10346
                                         ; #line compiler_dict.ctxi:89
                                         ; Node link reuse in CodePrimaryWrapped
        ; Переиспользуется значение Index в регистре EAX
        add     EAX,  @@DATA+49288
        leave
        ret     4
@10346: 
                                         ; #line compiler_dict.ctxi:91
                                         ; #line compiler_dict.ctxi:92
                                         ; #line compiler_dict.ctxi:93
        push    dword 128
        lea     EAX,  [EBP-132]
        push    EAX
        lea     EAX,  [EBP-144]
        push    EAX
        call    @10126                   ; strbuf_init
                                         ; #line compiler_dict.ctxi:94
        push    dword [EBP+8]
        lea     EAX,  [EBP-144]
        push    EAX
        call    @10335                   ; Dict_MakeFullyQualifiedName
                                         ; #line compiler_dict.ctxi:96
        lea     EAX,  [EBP-132]
        push    EAX
        call    @10272                   ; SaveString0
        mov     dword [EBP-4], EAX
                                         ; #line compiler_dict.ctxi:97
                                         ; Node link reuse in Code_ASSIGN (1)
        ; Переиспользуется значение Index в регистре EAX
        mov     EBX,  dword [EBP+8]
        imul    EBX,  77
        mov     dword [@@DATA+EBX+776684], EAX
                                         ; #line compiler_dict.ctxi:98
                                         ; Node link reuse in CodePrimaryWrapped
        ; Переиспользуется значение Index в регистре EAX
        add     EAX,  @@DATA+49288
        leave
        ret     4

В этом примере есть интересный фрагмент:

        mov     EAX,  dword [EBP+8]
        cmp     EAX,  dword [@@DATA+8476676]
        jb      @10343
                                         ; #line compiler_dict.ctxi:85
        push    dword 85
        push    dword @@ROLITERALS+7329
        call    @10235                   ; StopInternal
@10343: 
                                         ; #line compiler_dict.ctxi:87
        mov     EAX,  dword [EBP+8]

Здесь также можно было бы устранить повторную загрузку mov EAX, dword [EBP+8], но это пока не реализовано.

  1. Компилятор знает, что StopInternal не возвращает управление.
  2. Единственный переход по метке @10343 выполняется из места, в котором EAX уже содержит нужное значение.
  3. Таким образом вторая загрузка регистра избыточна.
  4. Но чтобы отследить это, необходим продвинутый анализ перехода по меткам, делать который в мои планы пока не входит.

Пример 2.

Вот еще пример устранения загрузок локальной переменной. Генератор кода дважды переиспользует значение переменой L в регистре EAX:

	word L = strlen(@Dst);
	if L > 1 then
		if str_has_char(@fpath_p_dir_separators, Dst[L - 1]) == 0 then
			strn_cat(@Dst, @fpath_p_dir_separator, Size);
		end:if
	end:if
                                         ; #line include/fpath.ctxi:131
        push    dword [EBP+8]
        call    @10013                   ; strlen
        mov     dword [EBP-4], EAX
                                         ; #line include/fpath.ctxi:132
                                         ; Node link reuse in CodePrimaryWrapped
        cmp     EAX,  1
        jbe     @10179
                                         ; #line include/fpath.ctxi:133
                                         ; Node link reuse in CodePrimaryWrapped
        dec     EAX
        add     EAX,  dword [EBP+8]
        mov      AL,  byte  [EAX]
        push    EAX
        push    dword [@@DATA+44]
        call    @10106                   ; str_has_char

Пример 3.

В этом примере генератор кода понимает, что можно повторно использовать константу в EAX, но не понимает, что можно повторно использовать указатель в EBX.

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

        mov     EAX,  100000
        mov     EBX,  dword [EBP-8]
        mov     dword [EBX+44], EAX
                                         ; #line compiler_dict.ctxi:117
                                         ; Node link reuse in Code_ASSIGN (1)
        mov     EBX,  dword [EBP-8]
        mov     dword [EBX+32], EAX
                                         ; #line compiler_dict.ctxi:118
                                         ; Node link reuse in Code_ASSIGN (1)
        mov     EBX,  dword [EBP-8]
        mov     dword [EBX+36], EAX
                                         ; #line compiler_dict.ctxi:119
                                         ; Node link reuse in Code_ASSIGN (1)
        mov     EBX,  dword [EBP-8]
        mov     dword [EBX+40], EAX
                                         ; #line compiler_dict.ctxi:120
                                         ; Node link reuse in Code_ASSIGN (1)
        mov     EBX,  dword [EBP-8]
        mov     dword [EBX+12], EAX
                                         ; #line compiler_dict.ctxi:121
                                         ; Node link reuse in Code_ASSIGN (1)
        mov     EBX,  dword [EBP-8]
        mov     dword [EBX+16], EAX
                                         ; #line compiler_dict.ctxi:122
                                         ; Node link reuse in Code_ASSIGN (1)
        mov     EBX,  dword [EBP-8]
        mov     dword [EBX+20], EAX
                                         ; #line compiler_dict.ctxi:123
                                         ; Node link reuse in Code_ASSIGN (1)
        mov     EBX,  dword [EBP-8]
        mov     dword [EBX+24], EAX

Примеры 4, 5, 6.

Устранение загрузок в условных выражениях:

	if rs >= BRACKET_LEX_SIZE | rs < 1 then
		StopInternal(__FILE__, __LINE__);
	end
        mov     EAX,  dword [EBP-8]
        cmp     EAX,  3
        jae     @11156
                                         ; Node link reuse in CodePrimaryWrapped
        cmp     EAX,  1
        jae     @11155
@11156: 
                                         ; #line frontend_syn_brackets.ctxi:40
        push    dword 40
        push    dword @@ROLITERALS+7664
        call    @10235                   ; StopInternal
@11155: 

В теле цикла после проверки условия цикла:

	while i < nOperator do
		word j = i + 1;
		...
        mov     EAX,  dword [EBP-4]
        cmp     EAX,  dword [@@DATA+12180364]
        jae     @11180
                                         ; #line frontend_syn_operators.ctxi:66
                                         ; Node link reuse in CodePrimaryWrapped
        inc     EAX
        mov     dword [EBP-8], EAX
	while i < nOperator do
		if Operator[i].Prio > Prio then
		...
        mov     EAX,  dword [EBP-8]
        cmp     EAX,  dword [@@DATA+12180364]
        jae     @11197
                                         ; #line frontend_syn_operators.ctxi:120
                                         ; Node link reuse in CodePrimaryWrapped
        imul    EAX,  36
        mov     EAX,  dword [@@DATA+EAX+12178080]
        cmp     EAX,  dword [EBP+12]
        jbe     @11198

 , , ,

wandrien
()

SONC - Клиент для приёма звука по сети

Форум — Talks
- APK сборки НЕ рабочие оказались :( Andoid сборки удалю.
- Для запуска sonc.love можно использовать ПО из дистрибутива или Love2D для Android. 

Пятница развратница! Но это у нормальных людей, так что…
Скромное, нубское приложение на Love2D, застряло не этапе прототипа более года назад, но я пользуюсь им постоянно. Может кому пригодится.

Просто принимает 16bit LE PCM звук отправленный по сети через PulseAudo - module-simple-protocol-tcp

Исходнки

Как выглядит, там на картинке есть, я прям с LOR галереи стащил :D


Есть сборки для Android

Которые даже не проверялись на работоспособность. Нет аппарата, окончательно подох.
Но там ещё lovefile есть который можно запустить как на ПК, так и на Android через Love2d с плеймаркета .


Универсальный lovefile

  • sonc.love

Который можно запустить где угодно где есть Love2D 11+, сам я его и использую.
love файл это zip архив с программой, который может быть запущен программой love (для тех кто не знает)


Ну, в целом всё, баги есть чинить буду по мере возможностей. Процессор долбит прилично, звук заикается из за прохода GC в Lua и потом отстаёт всё сильнее и сильнее, всё как полагается. Это можно исправить, видно будет, как ни будь потихонечку.

И да, гитфлик на даёт качать тем кто не зареган, очень странно…

Так что вот ещё, временно сборки тут


На самом деле я просто хочу узнать оно вообще на android запускается или нет, и apk рабочие или нет, а то я тут насобирал да и вообще многие вещи делаю просто в слепую. Типа как бы оно должно работать, но типа как бы и не совсем обязано :D Эх…

Есть много гораздо более лучших реализаций, лучших на голову и во всём, это так, NIH синдроммная метастаза в виде пупыри. Маленька, страшненька, но зато своя, родная ^.^ программулька.

Для тех кто не в курсе что такое Love2D

Вот как-то так вот.
Всем бобра. Досвиданья.

 , , , ,

LINUX-ORG-RU
()

Есть ли 100% надежный способ, будучи на Линукс убедить все шпионящие и вредоносные трекеры, что у меня Windows 10?

Форум — General

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

 , ,

sbin
()

Какие моноширинные шрифты — ваши любимые?

Голосования — Голосования

>>> Результаты

 

MrCookie
()

rofi панель задач

Форум — Desktop

Можно ли с помощью rofi организовать панель задач как в de? Если да, то хотелось бы получить ссылки на такие решения

 , , , ,

kashath
()

Асинхронность как чтение буфера - TCP и HTTP сервер

Форум — Development

Для своего проекта мне нужно реализовать передачу данных по протоколу TCP. Моих знаний и опыта хватило для примитивного сервера на Python:

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

Максимальная скорость передачи, которую мне удалось достичь - 4 мегабайта в секунду в локальной сети. Было бы гораздо эффективнее просто закидать сервер тысячами пакетов, и собирать ответы от сервера в буфер, в который периодически можно поглядывать, чтобы потом докинуть неудачные пакеты.

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

  • Программа создаёт сокет
  • Настраивает сокет
  • Биндит сокет на порт
  • Когда приходит запрос или ответ на запрос - операционная система записывает данные в некий «буфер входящих пакетов»
  • Программа читает часть «буфера входящих пакетов»

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

Да, в Python существуют библиотеки для асинхронной работы, но асинхронность в высоких языках я воспринимаю как мега-ужасный костыль - она быстро превращает проект в мега-сложную и сверх-запутанную структуру с огромным количеством абстракций и систем защиты от «гонок». Любой проект превращается из простого «сделать это а потом то» в «держать абстрактный класс с содержанием других классов, наследующих от других классов другие классы», и для моего не самого гениального мозга это воспринимается как мусор, в котором абстрактность на абстрактности, и абстрактность абстрактностью погоняет.

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

Почему не хочу использовать многопоточность?

  1. Мой проект должен работать на любом тостере, на любом самоваре, а значит - многопоточности может и не оказаться.
  2. Я считаю многопоточность огромным усложнением проекта - в нём сразу возникнет куча проблем с «гонками», семафорами и безопасностью.
  3. Многопоточность ускорит работу сети в 2-24 раза, а грамотная асинхронность - в сотни тысяч раз, если не в миллионы или миллиарды.

Почему не async из Python? Потому что это костыль е_аный, а не асинхронность.

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

Плохой новостью для меня окажется, если просто поглядывать в буфер раз в 1/4 секунды - не выйдет, по причинам типа:

  • Accept переводит процесс в состояние «заблокировано», пока не будет установлено соединение
  • Listen переводит процесс в состояние «заблокировано», пока не придёт новый пакет

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

В общем и целом - помогите разобраться в самоучке.

Покидайте полезных статей с примерами, пожалуйста, я сейчас нахожу только воду и статьи, сгенерированные нейросетями, аля «чтобы добиться асинхронного TCP соединения на Python…» и дальше какой-то абстрактный код, который потом превращается в Java, а затем в рецепт салата Цезарь из резиновых покрышек.

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

Хочу добиться своего на Си или Python.

Спасибо заранее ^~^

 , , ,

Linux-Music-Girl
()

Хочу работу с мышкой как в терминале ConEmu

Форум — General

Привет. Мне понравилось, что в виндовом ConEmu терминале можно мышь (курсор) тыкать в любое место команды и редактировать её (даже в XP, лол). В общем, поведение как в текстовом редакторе, а не старом терминале. Для правки длинной команды не надо жать стрелку влево и адски долго ждать пока курсор доползёт до нужного места. Конечно, знаю, что в линуксе есть горячие клавиши, облегчающие редактирование. Например, быстрая навигация по словам Alt+B (назад), Alt+F (вперёд). Есть ещё какие-то клавиши для возврата в начало, в конец. Но это не так удобно, как просто тыкнуть мышью и надо запоминать эти хоткеи.

Вот и хочу спросить, а нет ли в линуксе терминалов, в которых редактирование как в текстовом редакторе, как в ConEmu? А то что же получается, линукс король терминала, а винда его обскакала. Я, конечно, понимаю, что это наследие старых систем, где взаимодействие с текстом было линейным (строчным) и без графического интерфейса, но времена-то меняются. И я без стёба спрашиваю. Действительно, обидно. Может быть есть какие-то похожие решения? Хотя, в линуксе есть другие удобные фичи (типа, мышиного буфера, истории). А получается вместе всё лучшее совместить нельзя. Нет, я не считаю, что у меня странная просьба, скорее, я смотрю в будущее.

 ,

netrium
()

Как быстро вы печатаете на клавиатуре?

Голосования — Голосования

CPM это Character Per Minute.

Проверить скорость печати можно здесь:


В более чем 1200 CPM я не поверю пока не увижу запись на фоне стрелочных часов с плавным ходом секундной стрелки.

  1. <200 CPM 121 (48%)

    ********************************************************************************************************************************************************************************************************************************************************************************************************************************

  2. 200-400 CPM 102 (40%)

    *****************************************************************************************************************************************************************************************************************************************************************************

  3. 400-600 CPM 18 (7%)

    ***********************************************

  4. 1000-1200 CPM 8 (3%)

    *********************

  5. 600-800 CPM 2 (1%)

    *****

  6. 800-1000 CPM 2 (1%)

    *****

Всего голосов: 253

 , , ,

mord0d
()

А что там система на PHP?

Форум — Talks

И правда, давно не писал как там дела у лучшего в мире DE дистра на PHP.

К сожалению, появился другой, более приоритетный проект, а именно самодельный гибридный инвертор с настоящей, некитайской функцией подмешивания, посему программированию могу уделять час-два в неделю.

Из новенького

Решил пойти по пути наименьшего сопротивления, и остановиться на дистре.

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

Что касается самого DE

Избавился от консольных утилит для работы с иксами. Архитектура иксовая конечно дикий ад. Но зато теперь код изящнее, а настройки более гибче.

Почти полностью разобрался с треем через d-bus. Теперь оно не тормозит, проц не жрет. Вдобавок средствами PHP научился принудительно обесцвечивать иконки в серой палитре, или с красивыми стильными тенями. Выглядит почти прикольно, и не зависит от программы.

Сделал темизацию панели в нескольких вариантах — темном, светлом, и градиентном. Градиент подхватывается с т.н. основных цветов системной темы, и выглядит опять таки прикольно. Плюс благодаря отвязке от консольных утилит, открутил шурупы с панели. Теперь она может быть и вверху, и внизу, а благодаря открытости кода, хоть по диагонали с верха слева, по низ справа.

Облегчил док. Заметил по своим знакомым, что никто не перетаскивает иконки — они остаются на усмотрение системы. Так что перетаскивание убрал. Ну и остановился на индикации приложений в виде серой точки — закрыто, голубой точки — запущено, красной точки — требует внимания, голубой полоски — активно. Решил не нагромождать меню по ПКМ, а сделал два вида - основное по ПКМ, добавочное по shift+ПКМ. Например при ПКМ в меню есть опция «Закрыть», а в меню вызываемом shift+ПКМ, вместо нее «Закрыть принудительно».

С меню к сожалению получилось не все что я хотел. Хотел добавить туда возможность запускать программы от рута. Но из-за специфики PHP, а точнее вызова программы после программы (pkexec) либо меню закрывается только после завершения самой программы, либо pkexec не запускается вовсе. Городить костыли навроде передачи команды на запуск крутящемуся в фоне демону — не хочу. Зато теперь можно с меню добавлять в док, не запуская. Может чё еще добавлю.

Настройки

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

Внутря

Запилил демон настроек, который преобразует конфигурационный файл ДЕ в субконфигурации той или иной подсистемы. Кстати про настройки. Остановился на самом оптимальном и читаемом на мой взгляд формате — подобно HTML-теговому: <keyboard_layouts>us ru</keyboard_layouts>

Поскольку это все же PHP, т.е. может быть ненадежно, сделал лимит перезапусков DE чтобы не было бесконечных циклов, если 5 раз не вышло - запускается xterm.

Все-таки пересобрал xembedsniproxy — шняга которая конвертит программы со старого формата иксового трея, в новомодно-костыльный dbus-ный.

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

Ввел некоторые ключи производительности в само DE. Что-то типа «безопасного режима» что ли. С некоторыми ключами, эффекты отключаются, задержки между итерациями разных проверок увеличиваются, и в целом система адекватно насколько это возможно, работает на первом EeePC на одноядерном селероне 900 МГц и 2Гб ОЗУ.

На данный момент, будучи абсолютно работоспособной (хоть и не готовой в продакшен), система без учета иксов и прочих сопутствующих либ, занимает 3 мегабайта ОЗУ. Так-то. Исходный код, он же исполняемый код - занимает 700Кб. Абсолютно вся система, включая скомпиленный интерпретатор PHP и сырцы либ — 76 мегабайт на носителе.

В дистре это DE вместе со всеми необходимыми потрохами, я решил размещать в одной единственной директории в корне. Посему любые операции — удобны и делаются в обыкновенном ФМ без рисков положить систему.
Удалить: rm -rf /system.
Апгрейднуть: mv /system /system_old;mv ~Downloads/new_version /system.

Естественно дистр лайвовый — просто берется и запускается безо всякого геморроя.

Когда будет готово для скачивания?

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

https://ibb.co/ykj0cMV

https://ibb.co/RYWcsFL

 ,

windows10
()