LINUX.ORG.RU

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

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

Форум — 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 я не поверю пока не увижу запись на фоне стрелочных часов с плавным ходом секундной стрелки.

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

 , , ,

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

Настройка SoftEtherVPN для обхода блокировок

Форум — Admin

Поскольку провайдеры начали блокировать Wireguard, пытаюсь освоить SoftEther. Настроил сервер, включил SecureNat, подключился клиентом, получил IP по DHCP. Сервер пингуется, всё хорошо. Как мне теперь завернуть на клиенте весь траффик в туннель? Таблица маршрутов сейчас выглядит вот так:

default via 192.168.1.1 dev enp6s0 proto dhcp src 192.168.1.100 metric 100 
default via 192.168.30.1 dev vpn_liberty proto dhcp src 192.168.30.100 metric 1008 
10.0.0.0/24 dev wg0 proto static scope link metric 50 
192.168.1.0/24 dev enp6s0 proto kernel scope link src 192.168.1.100 metric 100 
192.168.30.0/24 dev vpn_liberty proto dhcp scope link src 192.168.30.100 metric 1008 

Если поставить для маршрута через 192.168.30.1 метрику ниже, чем через 192.168.1.1, то траффик никуда не идёт. Если оставить всё как есть, то внешний траффик идёт в обход туннеля.

 softethervpn,

Axon
()

ikev2 strongswan нет подключения с мобильного интернета, не могу понять почему?

Форум — Admin

Всем привет!

подскажите пожалуйста, есть vps с strongswan ikev2, конфигурация ниже. С компа нормально подключается, с телефона подключенного к домашнему wi-fi тоже без проблем, но с мобильного интернета - борода. В логи смотрю и не хватает ума понять в чем дело. Подскажите пожалуйста, кто шарит?

config setup
    charondebug="ike 1, knl 1, cfg 0"
    uniqueids=no

conn ikev2-vpn
    auto=add
    compress=no
    type=tunnel
    keyexchange=ikev2
    fragmentation=yes
    forceencaps=yes
    dpdaction=clear
    dpddelay=300s
    rekey=no
    left=xxx.xxx.xx.xx
    leftid=xxx.xxx.xx.xx
    leftcert=/etc/ipsec.d/certs/server-cert.pem
    leftsendcert=always
    leftsubnet=0.0.0.0/0
    right=%any
    rightid=%any
    rightauth=eap-mschapv2
    rightsourceip=10.10.10.0/24
    rightdns=8.8.8.8,8.8.4.4
    rightsendcert=never
    eap_identity=%identity
    ike=aes256-sha256-modp2048,aes128-sha256-modp2048,aes256-sha1-modp2048,aes128-sha1-modp2048,chacha20poly1305-sha512-curve25519-prfsha512,aes256gcm16-sha384-prfsha384-ecp384,aes256-sha1-modp1024,aes128-sha1-modp1024,3des-sha1-modp1024!
    esp=aes256-sha256-modp2048,aes128-sha256-modp2048,aes256-sha1-modp2048,aes128-sha1-modp2048,chacha20poly1305-sha512,aes256gcm16-ecp384,aes256-sha256,aes256-sha1,3des-sha1!

логи сторнгсвана в момент подключения вот такие:

Nov 04 15:54:43 x.stark-industries.solutions charon[115176]: 13[NET] received packet: from 1.1.1.90[45177] to 2.2.2.41[500] (1072 bytes)
Nov 04 15:54:43 x.stark-industries.solutions charon[115176]: 13[ENC] parsed IKE_SA_INIT request 0 [ SA KE No N(NATD_S_IP) N(NATD_D_IP) N(FRAG_SUP) N(HASH_ALG) ]
Nov 04 15:54:43 x.stark-industries.solutions charon[115176]: 13[IKE] 1.1.1.90 is initiating an IKE_SA
Nov 04 15:54:43 x.stark-industries.solutions charon[115176]: 13[IKE] 1.1.1.90 is initiating an IKE_SA
Nov 04 15:54:43 x.stark-industries.solutions charon[115176]: 13[IKE] remote host is behind NAT
Nov 04 15:54:43 x.stark-industries.solutions charon[115176]: 13[IKE] DH group MODP_4096 unacceptable, requesting MODP_2048
Nov 04 15:54:43 x.stark-industries.solutions charon[115176]: 13[ENC] generating IKE_SA_INIT response 0 [ N(INVAL_KE) ]
Nov 04 15:54:43 x.stark-industries.solutions charon[115176]: 13[NET] sending packet: from 2.2.2.41[500] to 1.1.1.90[45177] (38 bytes)
Nov 04 15:54:44 x.stark-industries.solutions charon[115176]: 12[NET] received packet: from 1.1.1.90[29661] to 2.2.2.41[500] (816 bytes)
Nov 04 15:54:44 x.stark-industries.solutions charon[115176]: 12[ENC] parsed IKE_SA_INIT request 0 [ SA KE No N(NATD_S_IP) N(NATD_D_IP) N(FRAG_SUP) N(HASH_ALG) ]
Nov 04 15:54:44 x.stark-industries.solutions charon[115176]: 12[IKE] 1.1.1.90 is initiating an IKE_SA
Nov 04 15:54:44 x.stark-industries.solutions charon[115176]: 12[IKE] 1.1.1.90 is initiating an IKE_SA
Nov 04 15:54:44 x.stark-industries.solutions charon[115176]: 12[IKE] remote host is behind NAT
Nov 04 15:54:44 x.stark-industries.solutions charon[115176]: 12[ENC] generating IKE_SA_INIT response 0 [ SA KE No N(NATD_S_IP) N(NATD_D_IP) N(FRAG_SUP) N(HASH_ALG) N(CHDLESS_SUP) N(MULT_AUTH) ]
Nov 04 15:54:44 x.stark-industries.solutions charon[115176]: 12[NET] sending packet: from 2.2.2.41[500] to 1.1.1.90[29661] (472 bytes)
Nov 04 15:54:44 x.stark-industries.solutions charon[115176]: 16[NET] received packet: from 1.1.1.90[9336] to 2.2.2.41[4500] (528 bytes)
Nov 04 15:54:44 x.stark-industries.solutions charon[115176]: 16[ENC] parsed IKE_AUTH request 1 [ IDi IDr N(MOBIKE_SUP) SA TSi TSr CPRQ(ADDR ADDR6 DNS DNS6 MASK VER) ]
Nov 04 15:54:44 x.stark-industries.solutions charon[115176]: 16[IKE] initiating EAP_IDENTITY method (id 0x00)
Nov 04 15:54:44 x.stark-industries.solutions charon[115176]: 16[IKE] peer supports MOBIKE
Nov 04 15:54:44 x.stark-industries.solutions charon[115176]: 16[IKE] authentication of '2.2.2.41' (myself) with RSA_EMSA_PKCS1_SHA2_384 successful
Nov 04 15:54:44 x.stark-industries.solutions charon[115176]: 16[IKE] sending end entity cert "CN=2.2.2.41"
Nov 04 15:54:44 x.stark-industries.solutions charon[115176]: 16[ENC] generating IKE_AUTH response 1 [ IDr CERT AUTH EAP/REQ/ID ]
Nov 04 15:54:44 x.stark-industries.solutions charon[115176]: 16[ENC] splitting IKE message (1920 bytes) into 2 fragments
Nov 04 15:54:44 x.stark-industries.solutions charon[115176]: 16[ENC] generating IKE_AUTH response 1 [ EF(1/2) ]
Nov 04 15:54:44 x.stark-industries.solutions charon[115176]: 16[ENC] generating IKE_AUTH response 1 [ EF(2/2) ]
Nov 04 15:54:44 x.stark-industries.solutions charon[115176]: 16[NET] sending packet: from 2.2.2.41[4500] to 1.1.1.90[9336] (1236 bytes)
Nov 04 15:54:44 x.stark-industries.solutions charon[115176]: 16[NET] sending packet: from 2.2.2.41[4500] to 1.1.1.90[9336] (756 bytes)
Nov 04 15:54:44 x.stark-industries.solutions charon[115176]: 14[NET] received packet: from 1.1.1.90[9336] to 2.2.2.41[4500] (80 bytes)
Nov 04 15:54:44 x.stark-industries.solutions charon[115176]: 14[ENC] parsed IKE_AUTH request 2 [ EAP/RES/ID ]
Nov 04 15:54:44 x.stark-industries.solutions charon[115176]: 14[IKE] initiating EAP_MSCHAPV2 method (id 0x37)
Nov 04 15:54:44 x.stark-industries.solutions charon[115176]: 14[ENC] generating IKE_AUTH response 2 [ EAP/REQ/MSCHAPV2 ]
Nov 04 15:54:44 x.stark-industries.solutions charon[115176]: 14[NET] sending packet: from 2.2.2.41[4500] to 1.1.1.90[9336] (112 bytes)
Nov 04 15:54:44 x.stark-industries.solutions charon[115176]: 11[JOB] deleting half open IKE_SA with 1.1.1.90 after timeout

Почему на домашнем вай-фае работает, а с мобильного - нет? пробовал на разных операторах.

Отнеситесь к новичку снисходительно пожалуйста.

 , ,

Zef
()

ratarmount 1.0.0

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

Программа ratarmount (random access tar mount) предназначена для монтирования архивных файлов в файловую систему и позволяет монтировать через FUSE не только файлы tar (сжатые bz2, gz, xz или zstd) TAR, но и zip и rar. Новый релиз 1.0.0 доступен к установке из pip и AppImage.

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

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

 , , , ,

linuks
()

Видео искалка - reptube

Форум — Talks

Студия Колобо.. кхм. Конгломерат корпораций "000 На Коленочке ЛТД" от создателей "И таааак сойдёёёт" представляяяееет! Очередную, но уникальную во всей солнечной системе, а может быть даже галактике, фигню!
Короче суть проста как две палки, часто кидают ссылки на ютуб которые нифига не работают, но иногда есть аналогичное видео на rutube/platforma/my.mail/etc и для автоматизации поиска накалякалось. Главное чтобы youtube.com не блокировался полностью, чтобы по ссылке можно было извлечь название видео. Можно просто искать видео на rutube/platforma/my.mail/etc с разным форматом вывода, пайпы, m3u вывод для mpv и прочее Собственно воть и всё. Конечно, можно просто использовать браузер и использовать поиск в нём, но вот зачем это делать, если это можно не делать! Гениально, где моя шоколадная медалька.

Недоисходники

Чет я приболел, лень писать смешульки так что я тут тупо скопирую readme дабы не запаривать Ъ своим очередным высеро…шедевром


Зависимости

Любая версия Lua и утилита curl

  • Lua5.1
  • Luajit
  • Lua5.2
  • Lua5.3
  • Lua5.4

Использование

  • Аргументы опциональные
    • -h Отобразить справку
    • -d Отключить цветной вывод
    • -n [NUMBER] Количество результатов для вывода, в каждом из ресурсов
    • -v Подробный вывод, описание, имя канала, категория
    • -m Вывод в формате m3u (удобно для передачи в mpv)
    • -s Искать только точное совпадение с запросом
    • -l Отображать вывод в виде списка чистых ссылок
    • -ru --rutube Отобразить результаты с rutube.ru
    • -pl --platforma Отобразить результаты с platforma.ru
    • -my --mymail Отобразить результаты с my.mail.ru
    • -ok --okru Отобразить результаты с ok.ru
    • -dz --dzen Отобразить результаты с dzen.ru
    • -co --coub Отобразить результаты с coub.com

По умолчанию поиск ведётся везде, если вы выберите -ru будет показан
только вывод с rutube, если вы выберите больше ключей например ‘-pl -ru’
то будет выведено только то что выбрано, и в том порядке в котром идут ключи

Примеры

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

reptube Рецепты салатов -n 10 -v

Получить только 1 вариант с названием

reptube -n 1 Почему надо выключать телефоны на борту самолета

Найти видео по ссылке из youtube

reptube https://www.youtube.com/watch?v=jN1fA6zupOM

Найти видео по ссылке из youtube в строгом режиме, 100% совпадение или ничего

reptube -s https://www.youtube.com/watch?v=jN1fA6zupOM

Оформить вывод в формат m3u, полезно для передачи видеоплеерам, например mpv

reptube -m https://www.youtube.com/watch?v=jN1fA6zupOM | mpv -

Можно использовать pipe удобно для скриптов

echo 'Фильмы' | reptube -m | mpv -

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

mpv $(reptube -l Мультики)

Примеры вывода

  • Первое попавшееся видео
dron@gnu:~$ reptube Фильм Матрица -n 1 
* [1] Матрица (фильм, 1999)
  https://rutube.ru/video/307c52af7c3e122855aea0899c247971/
  • Тоже самое только с подробным выводом
dron@gnu:~$ reptube Фильм Матрица -n 1 -v
* [1] Матрица (фильм, 1999)
  [Фильмач — фильмы и сериалы онлайн][Фильмы]
  Культовый киберпанк братьев Вачовски, стабильно занима
  ющий высокие места во всевозможных топах лучших фильмов. 
  Философский подтекст фильм так глубок, что его корни ищут
   не только в классической мысли, но и более спорных источ
  никах — от классического аниме до «Алисы в стране чудес».
  Днём Томас Андерсон пишет код в одной из поглотивших мир 
  корпораций, а по ночам взламывает цифровые системы. В мир
  е закулисья он носит имя Нео, и в сети для него нет ни од
  ной тайны. Однажды Нео приходит таинственное сообщение= «
  Ты увяз в Матрице», а также указание следовать за белым к
  роликом. Вскоре он находит того самого кролика на спине н
  екой Тринити, и она предлагает ему погрузиться в новую ре
  альность. После этого жизнь Нео разделяется на «до» и «по
  сле».Год выпуска= 1999Жанр= фантастика, боевикПродолжител
  ьность= 136 мин.Режиссёр= Лана Вачовски, Лилли ВачовскиВ 
  ролях= Киану Ривз, Лоренс Фишбёрн, Кэрри-Энн Мосс, Хьюго 
  Уивинг, Глория Фостер, Джо Пантольяно, Маркус Чонг, Джули
  ан Араханга, Мэтт Доран, Белинда МакКлориCтрана= США, Авс
  тралияCтудия= Groucho II Film Partnership, Warner Bros. P
  ictures Co., Bullet Time, Silver PicturesЗдесь вы можете 
  посмотреть фильм Матрица в русском синхронном переводе в 
  хорошем качестве (4k, 2k, Full HD, 1080p) совершенно бесп
  латно.
  https://rutube.ru/video/307c52af7c3e122855aea0899c247971/
  • В фомате m3u
dron@gnu:~$ reptube Фильм Матрица -n 1 -m
#EXTM3U
#EXTINF:-1,'Матрица (фильм, 1999)'
https://rutube.ru/video/307c52af7c3e122855aea0899c247971/
  • Чистая ссылка
dron@gnu:~$ reptube Фильм Матрица -n 1 -l
https://rutube.ru/video/307c52af7c3e122855aea0899c247971/
  • Поиск по ссылке на youtube с точным совпадением
dron@gnu:~$ reptube -s 'https://www.youtube.com/watch?v=jN1fA6zupOM'
* [1] Почему надо выключать телефоны на борту самолета
  https://rutube.ru/video/3f329d37994e4f1c9e148028c1bf5d7a/
* [2] Почему надо выключать телефоны на борту самолета
  https://rutube.ru/video/4c87a2ea11f92883cfcfabd63a79c794/
dron@gnu:~$ 
  • Тупа мультики детю врубить (нет фильтра по возрату, на свой страх и риск)
reptube добрые мультфильмы -m | mpv -

Надеюсь кому пригодится
Досвиданья ::)

 , , , ,

LINUX-ORG-RU
()

Программы, которые не тормозят

Форум — Desktop

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

Предлагаю составить список программ, которые работают быстро, или терпимо.

Но для начала я напишу то чего стоит избегать

  • qt5, qt6, gtk3, gtk4 они тормозят, открываются с задержкой, есть ощутимый лаг при взаимодействии
  • electron
  • wxWidgets если в качестве бекенда используется gtk3 или qt5
  • старые версии программ, например xfce до перехода на gtk3, или xpdf до перехода на qt5. они не тормозили, но они уже не развиваются, интереснее узнать что есть из живого, или хотя бы такого что будет легко установить без перекомпиляции

Программы которые работают терпимо

  • xfe файловый менеджер (не путать с xfce http://roland65.free.fr/xfe/ )
  • (x)nedit простой текстовый редактор c номерами строк и подсветкой
  • grafx2 рисовалка, ориентирована на pixelart
  • mpv просмотр видео
  • palemoon браузер. с отключенным javascript, ощущается приятно, открывает больше чем какой нибудь netsurf
  • OpenOffice офис. тормозит но тормозит намного быстрее чем LibreOffice
  • xdm дисплейный менеджер
  • jwm, icewm оконные менеджеры похожие на windows, быстрые и не требующие сложной настройки
  • cmus аудиоплеер с двухпанельностью. консольный что минус, но быстро работает с библиотекой, сканирует, поддерживает cp1251
  • mutt+msmtprc консольный почтовик, относительно легко настроить и управлять

Пользователь d советует рассмотреть проекты

  • suckless
  • pwmt

Пользователь xsaeta рекомендует

  • zzzfm двухпанельный файловый менеджер
  • nsxiv просмотрщик изображений
  • mpd для музыки
  • ClawsMail почтовик
  • приложения Trinity
  • приложения LXDE
  • Pidgin — мультипротокольный IM-клиент на GTK+2

Пользователь tiinn подсказывает XPaint программу для рисования

Пользователь posixbit рекомендует

  • SpaceFM (очень быстрый и мощный файловый менеджер GTK+ 2 с большим количеством плагинов).
  • Double Commamder (версия GTK+ 2; быстрый двухпанельный файловый менеджер, почти полная копия Total Commander).
  • Sylpheed (классический и самый быстрый почтовый клиент; GTK +2).
  • LillyTerm (терминал с настройкой через графический интерфейс на GTK+ 2), st (самый простой терминал; не использует Qt и GTK), Kitty (простой терминал, но с GPU-ускорением) {{MOPKOBKA: Kitty у меня тормозит}}.
  • Rainbow-CM, Parcelite (менеджеры буфера обмена на GTK+ 2).
  • Zathura-PDF-MUPDF (самая быстрая читалка PDF — именно эта версия с MuPDF, а не Poopler).
  • LXTask (диспетчер задач; можно собрать с GTK+ 2).
  • Cinelerra GG (самый быстрый, но довольно функциональный видеоредактор под Linux; не использует Qt и GTK).
  • GMPC (музыкальный плеер — быстрый и мощный графический клиент GTK+ 2 к mpd).
  • TransGUI (самый быстрый и лёгкий торрент-клиент; использует GTK+ 2, требует для работы установленный и запущенный transmission-daemon).
  • CudaText-GTK2 (довольно быстрый и развивающийся текстовый редактор, вдохновлённый SublimeText). {{MOPKOBKA: У меня тормозит}}
  • LiteXL (довольно быстрый текстовый редактор на Lua; не использует Qt и GTK). {{MOPKOBKA: на SDL2 думаю будет тормозить, не пробовал}}
  • Abiword (лёгкий и функциональный текстовый процессор) и Gnumeric (самый быстрый и функциональный табличный процессор под Linux; великолепная совместимость с xls/xlsx) — обе эти программы можно собрать с GTK+ 2. {{MOPKOBKA: У меня тормозит}}
  • Dia (лёгкий редактор диаграмм, схем и графиков; на GTK+ 2).
  • FreeOffice (самый быстрый офисный пакет под Linux, имеет хорошую совместимость с файлами Microsoft Office; использует Xlib, а не Qt или GTK).
  • ImageMagick-GUI (различные быстрые операции над изображениями; не использует Qt и GTK).
  • AzPainter (быстрый, но мощный графический редактор на Xlib).
  • Oculante (быстрый просмотрщик изображений; не использует Qt и GTK). {{MOPKOBKA: Rust}}
  • maim (простая, но гибкая утилита для создания скриншотов с настройкой через консольные команды; не использует GTK и Qt); {{MOPKOBKA: Не пробовал, но мне нравится scrot}}
  • Dunst (простейший центр уведомлений; не использует Qt и GTK).
  • FTP/SFTP-менеджер gFTP (GTK+ 2)
  • IRC-клиенты HexChat (GTK+ 2) и XChat-SE (Xlib) {{MOPKOBKA: HexChat все }}

Пользователь firkax советует свой WM https://dev.m1089.ru/fwmx

Коллективный анон советует

  • moc(p) - TUI
  • mpg123/ogg123 - CLI
  • xcalc - калькулятор {{MOPKOBKA: Входит в набор X11 Applications, там все хорошо работает, но не все актуально}}
  • https://codeberg.org/newsraft/newsraft - rss читалка

Пользователь vbcnthfkmnth123 рекомендует

Пользователь stabilitron рекомедует

  • ffplay - игрок видео, аудио, стримов, гифок, картинок и пр. {{MOPKOBKA: Программка проекта ffmpeg}}

Пользователь SPRATAY исползует

  • Bluetui - TUI for managing bluetooth on Linux
  • Lazygit - simple terminal UI for git commands

У пользователя dhubsith на скриншоте в LQ обнаружил

  • Avidemux - Редактор видеофайлов

Якобы не тормозят, но у меня тормозят еще как

  • gpu ускоренные терминалы
  • xterm, rxvt, vte терминалы
  • AbiWord замена ворда
  • SublimeText текстовый редактор
  • vim, emacs в любом виде

 , ,

MOPKOBKA
()

Бесплатный хостинг / Бесплатный домен :)

Форум — Talks

Кто какими пользуется, какие бывают. Поисковики выдают хренову тучу вариантов. Все их проверять удел сильных духом. Чтобы локация была в РФ, если дают ssh то клёво. Дохлость ресурсов, аптайм в целом по барабану. Кое-как работает и ладно. Интересно узнать как и о просто хостингах куда можно залить статику хоть по FTP и всё без всяких CMS (или если цмски как опция) так и VPS,VDS. Я выпал из всего этого, просто интересно было-бы узнать что сейчас ну стабильное что ли, пусть и скромное.

Ну и чтобы без всяких приколов типа, превышен некий лимит и тебе выставляют счёт. Не скажу что сильно надо, но на перспективу узнать хорошо бы. Если не знаете «хорошие» места, но знаете плохие места, то тоже будет полезно узнать. И не только мне. Гы ::)

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

 , , , ,

LINUX-ORG-RU
()

LOReader - андроид-читалка

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

«Чем больше звёзд, тем больше странностей.»

Читаю ЛОР, в основном, как новости, т.е. зачастую на ходу и в свободное время. Запускать десктоп или доставать ноут лениво, поэтому смартфон. Мобильные браузеры не радуют, возиться со стилями «ну его».

Было время, попробовал набросать клиента (честно, не смотрел есть подобное или нет, в тапаталке вроде ЛОРа нет), и вот что получилось (см. скриншот) - клиент-читалка исключительно для ЛОРа.

Что требуется:

  • андроид-смартфон, не очень старый (ибо, React Native), FHD+.

Что есть:

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

Чего нет:

  • регистрации и авторизации, трекинга и прочего фингерпринтинга;
  • рекламы;
  • постинга;
  • уведомлений;
  • подписок на теги;
  • фильтра тегов и юзеров.

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

  • никакого бэка, тупо парсит HTML https://www.linux.org.ru
  • скорее всего багов достаточно;
  • не идеально рендерит комментарии, особенно вставки code и ссылки.

Ссылки:

>>> Просмотр (1920x810, 862 Kb)

 , ,

vvn_black
()

LSP Plugins 1.2.18

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

Вышла новая версия 1.2.18 пакета эффектов LSP Plugins.

Плагины предназначены для обработки звука при сведении и мастеринге аудиозаписей, в условиях живых выступлений, а также при организации вещания и подкастов. Пакет совместим с форматами LADSPA, LV2, VST2 (LinuxVST), VST3, CLAP и GStreamer, а также предоставляет standalone-версии с поддержкой JACK.

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

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

 , , , ,

sadko4u
()

Состояние дисассемблинга сегодня

Форум — Talks

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

 , , , ,

Patifon_Kakao
()

Тулкит для графической утилитки

Форум — Development

На чём сейчас можно написать небольшой настольны фронт для приложения в стеке Linux и C?

На фронте будет пара табличек и формочки редактирования, управления, отображения состояния бакенда

 ,

fMad
()

Хочется отдохнуть...

Форум — Games

Устал играть во всякие Eve, WoW, Dota etc.
Кто во что отдыхает играет, чтобы мозг отдохнул?

 , , ,

Eulenspiegel
()