Снова аппаратное шерето
Пока вы тут фантазируете про tiinn и Альфу, в эту вашу компьютерную безопасность снова постучали и сверху, и снизу.
Пока вы тут фантазируете про tiinn и Альфу, в эту вашу компьютерную безопасность снова постучали и сверху, и снизу.
Я просто оставлю это здесь: http://www.windows93.net/
…которая не будет выглядеть ни как SEO-шный лэндинг, ни как «хакерский блог» без стиля и оформления.
Что-то стиле блога EXL: http://exlmoto.ru
Сверху узкая шапка, сбоку лаконичное меню, по центру ясно видимый текст. Что-то в таком духе.
Что-то полистал списки готовых тем, и там всё печально.
Давайте, что ли, откроем локальный филиал башорга и твиттера на тему разработки. Можно рассказывать занимательные и не очень истории из жизни, байки, мемы и просто «как я провел день».
Начну.
История первая.
У меня кусок админки управляет кучкой фоновых процессов. Не напрямую, а через прослойку-супервизора. Прослойку я написал на PHP, чтобы задействовать уже готовые функции админки. А чтобы управлять фоновыми процессами, потребовалось на php из подручных средств соорудить аналог pidfile_open (3). Вот такой:
function readPidfile($pidfile) {
/* XXX: Race conditions are everywhere. But who cares? */
if (!file_exists($pidfile)) {
/* No such file - daemon not running */
return false;
}
$f = fopen($pidfile, "r");
if (!$f) {
/* Failed to open file - daemon probably not running */
return false;
}
if (flock($f, LOCK_EX | LOCK_NB)) {
/* Able to acuire lock - daemon not running */
fclose($f);
return false;
}
/* Return PID */
$pid = fgets($f);
return $pid;
}
Вот смотрю и думаю: какое-то нецелевое использование «макропроцессора для HTML-страниц». Ну а почему бы и нет. Работает же.
История вторая.
Сегодня пришлось повоевать с кодировками в icecast. icecast к кодировкам оказался не очень приспособлен. Вот написал им, может замерджат мой патч: https://gitlab.xiph.org/xiph/icecast-server/-/issues/2423
Но что-то сомнительно. Ход очевидный, но почему-то сами они его не делали.
Знаю про вот такую программу для этих целей: https://github.com/fsquillace/kyrat
Есть ли более проработанный аналог?
В свободное время попиливаю компилятор ЯП для разминки мозгов и чтобы не забыть ассемблер окончательно.
По семантике ЯП Си-подобный, по синтаксису больше похож на что-то из линейки Паскаль/Модула/Оберон.
За основу брал Context Хохлова, но перепилил практически все сорцы.
Компилятор многопроходный. Сначала строится синтаксическое дерево. Потом на нём выполняются некоторые простые оптимизации. Потом запускается бэкэнд. (Другой подход применён, например, в tcc, где программа компилируется за один проход — ради скорости компиляции.)
Некоторые вещи вычисляются/оптимизируются сразу при парсинге. Например, логическое отрицание вообще не сохраняется в синтаксическое дерево, если может быть заменено на эквивалентную трансформацию отрицаемого выражения:
word Not(word P)
switch Node[P].ID of
case iOR: Node[P].ID = iAND; Not(Node[P].pLeft); Not(Node[P].pRight);
case iAND: Node[P].ID = iOR; Not(Node[P].pLeft); Not(Node[P].pRight);
case iXOR: Node[P].ID = iEQV;
case iEQV: Node[P].ID = iXOR;
case iLT: Node[P].ID = iGE;
case iLE: Node[P].ID = iGT;
case iEQ: Node[P].ID = iNE;
case iNE: Node[P].ID = iEQ;
case iGE: Node[P].ID = iLT;
case iGT: Node[P].ID = iLE;
default:
word P2 = Peek();
Node[P2].ID = iNOT;
Node[P2].pLeft = P;
return P2;
end:switch
return P;
end
Бэкэнд не строит промежуточного представления, на котором можно было бы гонять умные алгоритмы, соответственно 90% оптимизаций, описанных в «Книге дракона» невозможны. Пока я пытаюсь выжать максимум из компиляции на основе синтаксического дерева.
Ассемблерный листинг строится рекурсивным обходом дерева. При этом оптимизация осуществляется локально, в каждом отдельном узле, исходя только из информации доступной для узла и пары его дочерних элементов (или иногда — заглядывая чуть глубже).
Хочу показать, чего удалось добиться с этим подходом на примере компиляции арифметических выражений:
Оптимизация умножения на константу при помощи add, shl и lea. Пример умножения на 15 при помощи lea:
mov EAX, dword [EBP-24]
lea EAX, [EAX*2+EAX]
lea EAX, [EAX*4+EAX]
push EAX
call @10013
Компиляция выражения put_word(v100 * 18 + v1 * 27);:
mov EAX, dword [EBP-24]
lea EAX, [EAX*8+EAX]
add EAX, EAX
mov EBX, dword [EBP-8]
lea EBX, [EBX*2+EBX]
lea EBX, [EBX*8+EBX]
add EAX, EBX
push EAX
call @10013
Здесь умножения заменены более оптимальными инструкциями и разумно распределены регистры.
Компиляция выражения word v500 = v2 * v100 + v3 * v100;:
mov EAX, dword [EBP-12]
mul dword [EBP-24]
push EAX
mov EAX, dword [EBP-16]
mul dword [EBP-24]
pop EBX
add EAX, EBX
mov dword [EBP-32], EAX
Более оптимальным кодом был бы вариант:
mov EAX, dword [EBP-12]
mul dword [EBP-24]
mov EBX, EAX
mov EAX, dword [EBP-16]
mul dword [EBP-24]
add EAX, EBX
mov dword [EBP-32], EAX
Но компилятору в текущей реализации недоступна информация, потребуется ли EBX при вычислении второго слагаемого. Поэтому он сохраняет EAX на стек и затем восстанавливает оттуда значение в EBX уже после того как второе слагаемое вычислено.
Компиляция выражения put_word(v500 - v100 * v5);:
mov EAX, dword [EBP-24]
mul dword [EBP-20]
mov EBX, dword [EBP-32]
xchg EAX, EBX
sub EAX, EBX
push EAX
call @10013
Компилятор требует от выражения результат во вполне определённом регистре. Поэтому столкнувшись с тем, что операнды оказались в обратном порядке, он вынужден вставлять лишний xchg. Ситуацию можно решить, если разрешить выражению в ряде случаев свободно выбирать регистр для результата. Тогда код был бы таким:
mov EAX, dword [EBP-24]
mul dword [EBP-20]
mov EBX, dword [EBP-32]
sub EBX, EAX
push EBX
call @10013
Компиляция выражения put_word((v500 * 2 + v2) + (v200 & v1) + (v200 - 100) * 10 - 100 - v200 - v100);:
mov EAX, dword [EBP-32]
add EAX, EAX
add EAX, dword [EBP-12]
mov EBX, dword [EBP-28]
and EBX, dword [EBP-8]
add EAX, EBX
mov EBX, dword [EBP-28]
sub EBX, 100
lea EBX, [EBX*4+EBX]
add EBX, EBX
add EAX, EBX
sub EAX, 100
sub EAX, dword [EBP-28]
sub EAX, dword [EBP-24]
push EAX
call @10013
Пример компиляции ветвлений для блока switch (табличная реализация switch пока отсутствует) :
mov EAX, dword [@@DATA+EAX+7177840]
sub EAX, 0xD
je @11097
sub EAX, 0x3
je @11098
sub EAX, 0xFFFFFFFE
je @11099
dec EAX
je @11100
sub EAX, 0x5
je @11101
dec EAX
je @11102
dec EAX
je @11103
dec EAX
je @11104
dec EAX
je @11105
dec EAX
je @11106
jmp @11107
Пример переиспользования значения константы в регистре вместо загрузки другой константы:
word v0 = 0;
word v1 = 1;
word v2 = 2;
word v3 = 3;
word v5 = 5;
word v100 = 100;
word v200 = 200;
xor EAX, EAX
mov dword [EBP-4], EAX
inc EAX
mov dword [EBP-8], EAX
inc EAX
mov dword [EBP-12], EAX
inc EAX
mov dword [EBP-16], EAX
mov EAX, 5
mov dword [EBP-20], EAX
mov EAX, 100
mov dword [EBP-24], EAX
add EAX, EAX
mov dword [EBP-28], EAX
Сам компилятор полностью работоспособен, запускается в 32-разрядном режиме под виндой и линуксом и, в принципе, легко может быть портирован на другие ОС. Написан на самом себе (self-hosted) и частично обвешан тестами. Далее в планах научить его генерировать код для какой-нибудь другой системы команд. ARM, MIPS, RISC-V… что-то из этого.
Задавайте ваши вопросы.
Просто скормите ему бесконечный html файл с сервера, и он сожрёт сначала всю память, затем весь своп, и потом повиснет, почему-то не убившись об OOM Killer.
/me пристально смотрит на год в календаре
АААААА!
Интернеты пишут:
It is actually safe to iterate over a WeakKeyDictionary, WeakValueDictionary, or WeakSet in Python 2.7 or Python 3.1+. They put in an iteration guard that prevents weakref callbacks from removing references from the underlying dict or set during iteration all the way back in 2010, but the docs never got updated.
With the guard in, if an entry dies before iteration reaches it, iteration will skip that entry, but it won’t result in a segfault or a RuntimeError or anything. Dead entries will be added to a list of pending removals and handled later.
Мда? Это, мять, тогда что?!
File "/root/src/Site/SiteHelpers.py", line 84, in processReqs
for key, req in self.peer_reqs.items():
File "/usr/lib/python3.8/weakref.py", line 208, in items
for k, wr in self.data.items():
RuntimeError: dictionary changed size during iteration
Не верьте интернетам.
Вариант с for k,v in list(d.items()) тоже не прокатит. На последней итерации сборщик мусора может хлопнуть list() и следом начать удалять слабые ссылки из словаря.
list() нужно хранить отдельно на протяжении итерирования:
items = list(d.items())
for k,v in items:
Подскажите, существует ли общеупотребительное название для класса уязвимостей, когда программа не фильтрует .. в пути, и атакующий получает возможность читать/писать файлы вне разрешенного каталога?
Мне надо этот кейс в документации описать, и что-то я не соображу, как этот тип бага называется.
Пишут вот:
Компания Virtuozzo, разрабатывающая серверное ПО для виртуализации на основе открытых проектов, опубликовала выпуск дистрибутива Virtuozzo Linux 8.4, построенного путём пересборки исходных текстов пакетов Red Hat Enterprise Linux 8.4. Дистрибутив полностью бинарно совместим и идентичен по функциональности с RHEL 8.4, и может использоваться для прозрачной замены решений на базе RHEL 8 и CentOS 8. Для загрузки доступны iso-образы, размером 1.6 ГБ и 4.2 ГБ.
Virtuozzo Linux позиционируется как замена CentOS 8, готовая для рабочих внедрений. Ранее дистрибутив применялся в качестве базовой операционной системы для развиваемой компанией Virtuozzo платформы виртуализации и различных коммерческих продуктов. Теперь Virtuozzo Linux поставляется без ограничений, бесплатен и развивается при участии сообщества. Цикл сопровождения соответствует циклу выпуска обновлений для RHEL 8.
Изменения в Virtuozzo Linux 8.4 полностью соответствуют изменениям в RHEL 8.4, включая поддержку работы поверх TCP в VPN IPsec на базе Libreswan, стабилизацию декларативного API nmstate для управления сетевыми настройками, Ansible-модули для автоматизации управления доступом на основе ролей (RBAC) в IdM (Identity Management), AppStream-модули с новыми ветками Python 3.9, SWIG 4.0, Subversion 1.14, Redis 6, PostgreSQL 13, MariaDB 10.5, GCC Toolset 10, LLVM Toolset 11.0.0, Rust Toolset 1.49.0, Go Toolset 1.15.7.
В качестве альтернатив классическому CentOS 8, кроме VzLinux, также позиционируются AlmaLinux (развивается компанией CloudLinux, совместно с сообществом), Rocky Linux (развивается сообществом под руководством основателя CentOS при поддержке специально созданной компании Ctrl IQ) и Oracle Linux. Кроме того, компания Red Hat предоставила возможность бесплатного использования RHEL в организациях, развивающих открытое ПО, и в окружениях индивидуальных разработчиков, насчитывающих до 16 виртуальных или физических систем.
Я из криокамеры про такую даже не слышал. Про Oracle Linux давно знаю, про AlmaLinux и Rocky Linux тоже знаю.
В чем актуальные различия между этим формально совместимым друг с другом зоопарком? И на что теперь ориентироваться?
Курсор стоит внутри фрагмента текста с некоторым форматированием. Хотелось бы по хоткею иметь возможность выделить весь фрагмент, имеющий это форматирование.
Курсор стоит внутри фрагмента текста с некоторым форматированием. Хотелось бы по хоткею найти все другие вхождения такого же форматирования в документе. (Ну или по одному хотя бы.)
Есть готовые решения для этого?
В поисках любой удалённой работы
leave, я там топикстартеру дал рабочий совет, как искать работу, которая ему нужна.
Тем не менее, это, значит, оффтопик, а то что там другие модераторы флудят не по делу — это всё нормально.
Какого черта?
Приветствую!
Как многие из местных в курсе, у меня есть частичный форк LXDE, который я так и не довел до состояния логической завершенности.
Проект ориентирован на старые компьютеры. Код написан на Си с использованием gtk2. Миграция на другие версии тулкита не рассматривается.
У меня нет большого бюджета на проект, поэтому ищется не столько сотрудник на зарплату, сколько волонтёр, которому интересен такой проект сам по себе, и для которого оплата станет дополнительным бонусом. Это возможно, если:
Скилы, которые потребуются для работы:
ИЛИ:
У меня нет распланированного постоянного бюджета, я могу выделять средства только по мере их наличия. Скорость от вас не требуется, нужен только результат.
По оплате. Скажем, 10 долларов за один простой таск.
Пример такого таска:
Собственно, это наверное и будет первым таском по проекту.
По более сложным фичам — требует обсуждения. Разумеется, я не ожидаю, что вы будете работать бесплатно, например, если задача в том, чтобы отыскать и исправить гонку в многопоточном запутанном коде. Но сколько такая работа может стоить, я сам пока не очень представляю.
ТАКЖЕ
Если найдутся те, кому интересно финансово вложиться в этот проект, чтобы получить реализацию нужных им фич, то соответственно можно всем вместе скинуться и расширить бюджет проекта.
У меня самого есть довольно длинный список фич, включающих в том числе модуляризацию и довольно нетривиальную интеграцию различных частей проекта.
Простите, но я тут снова с дебильными мыслями. Пока вся прогрессивная общественность упарывается по федеративности, я честно пытаюсь вникнуть в предложенное.
Фундаментом нашего объединения является идея, изложенная в эссе «Protocols, Not Platforms»
И именно поэтому существует целый выводок реализаций как раз движков-платформ. Я и правда не понимаю, какое дело конечному пользователю будет до протокола, если он взаимодействует с конкретной платформой, к которой привязана его учётка. Код исполняется не на его машине и не под его контролем. Данные пользователя подконтрольны не ему, а черт знает кому. То, что там будет СПО, абсолютно параллельно. Суть СПО не святости концепции, а в том, чтобы знать, что за код работает с твоими данными. Не тот случай.
А может быть, всё проще, и это Mastodon спроектирован неправильно.
В реальной жизни вот он есть я, и вот они есть кружки по интересам, сообщества друзей и так далее. Но в каком бы круге общения я не находился, идентификация меня как конкретного человека остаётся неизменной.
Mastodon нам предлагает сначала побродить поискать сервер по интересам, а потом уже там регистрироваться. А если сервер вас не устроит, то идти и регистрироваться в другом месте. Спасибо, конечно. Но мне хотелось бы обойтись без раздвоения личности при управлении своими данными и учетными записями.
Что мешало сразу сделать дизайн, в котором пользователь — это универсальный криптографический ключ, не прибитый к платформе? А кружки по интересам… просто кружки по интересам!
Внутренняя политика […] Рассмотрим какой-нибудь инстанс. У него есть внутренняя политика. Она регулирует то, что происходит в стенах этого инстанса, между его пользователями. К ней относятся правила поведения, на каждом инстансе они свои. Регистрируясь на конкретном инстансе, ты соглашаешься с его конкретными правилами.
Проблема не в том, что в «тематической группе» (назовём это так) есть правила поведения. Проблема в том, что эта группа претендует на то, чтобы быть оператором моих данных, а не просто принуждать меня к правилам для участия в группе. Сам я в сети ничего собой не представляю. За меня всё делает сервер. Как самостоятельная единица в сети федерации я не существую. Пользователь как был бесправным в Фейсбуке, так и остался.
И если раньше админ группы в Фейсбуке был ограничен во власти по отношению к участникам группы средствами самого Фейсбука, то теперь «админ группы» обладает полной властью вместо Фейсбука.
А как известно, тираны в маленькой стране намного опаснее для жителей, чем тираны в большой.
Внешняя политика […] Тут, конечно, начинаются всякие страсти. Это комплекс всего, что происходит при общении между серверами. К вам, как гражданину своего инстанса, внутренней политикой скорее всего приставлен долг не порочить честь своего сообщества на междусерверной арене. […] Глушение. […] Отклонение медиа. […] Блокировка.
Тут тоже всё, мать вашу, прекрасно. Сеть, спроектированная порождать страсти и бурления, их и порождает. Раздолье для маленьких царьков, которым выдалась возможность поуправлять паствой и поучаствовать в «международных» отношениях. Глушения, блокировки, честь сервера и скрепы. Пойду лучше проголосую за Путина.
Да, и наконец, мне скажут типа: просто подними свой сервер, и своими данными управлять будешь только ты. Во-первых, не только я. Любому серверному приложению необходим хостинг с белым IP. А во-вторых, вот только технически это решение ничем не отличается от старого доброго блога на вордпресс и ленты RSS для экспорта всем желающим. Изобретение нового мира вышло каким-то… неубедительным.
В общем, я такой человек, который во всём найдёт изъяны. С ходу могу вспомнить только три примера, когда дизайн продукта меня полностью устраивал при знакомстве. Первый был, когда я познакомился с Ruby. Второй, когда открыл для себя Docker. И третий, когда увидел обновленный JS с let, const и стрелками.
Но конкретно тут… ребята, я не знаю, может это лично я слишком аутист, но мне казалось, что в начале 3-го десятилетия XXI века технически продвинутым людям в сети уже должно поднадоесть жрать этот кактус в виде доли маленького бесправного винтика в большой сети. И ходить под начальством очередной шишки, не важно, маленькая она или большая.
Самое главное, чего не делает федиверс, он не провозглашает пользователя как объект первого класса в своей семантической модели. Всё так же объекты первого класса — это сервера, сервера, сервера.
В то же время ZeroNet как платформа и протокол провела полное разделение этой каши на чёткие слои модели, и такие явления как «хранилище», «приложение» и «пользователь» проявляются там независимо друг от друга. Вам больше не нужен доверенный сервер, который будет представлять ваши интересы и принуждать соблюдать правила. Вы сам по себе участник сети.
Очень печально выслушивать этот бред на тему того, что одному не нравится код на JS, второму — код на Питоне, а третьему не хватает возможности поставить аватарку на форуме. Хоть бы один задумался об архитектуре и о последствиях развития той или иной технологии для человечества.
В то же время, приложение на ZeroNet при желании можно продаунгрейдить до федеративного сервера, точно так же как федеративный сервер при желании архитектурно даунгрейдится до «Фейсбука». А вот обратно — не получится. Если в исходном дизайне не выполнено соответствующее разделение абстракций, то без полной переделки дизайна им просто неоткуда будет взятся. «Лишние» степени свободы платформы при желании можно скрыть, а вот несуществующие нарисовать не получится.
ZeroNet сейчас это макет самой себя, в котором ничего еще только не работает. Но блин… дайте мне 5 кодеров на питоне за еду и финансирование, чтобы им полгода было что есть. И вы обалдели бы от результата.
Допилить ZeroNet до убойной технологии не сложнее, чем с нуля реализовать стек Gemini вместе с сервером и браузером на GTK. Реально нужно 5-6 заинтересованных лиц и немного времени.
Сейчас ситуация такова, что на всей Земле не нашлось этих пяти лиц.
В общем, ладно… у меня нет желания размышлять, почему всё так вышло, и почему вместо действительно чумовой технологии, от которой сами «продвинутые пользователи» бы визжали, у пользователей выстреливает очередное… вот это. В конечном счёте, как тащить людей туда, куда они не хотят? Ну не хотят, и не надо.
Пойду куплю пива в связи со сдачей очередного проекта. Пошло оно всё подальше.
Спасибо commagray & CO за предоставленные для цитирования буквы.
Я снова наступил на эти грабли.
Пример кода:
$array = [1, 2, 3];
foreach ($array as &$value) {} // by reference
echo implode(',', $array), "\n";
foreach ($array as $value) {} // by value (i.e., copy)
echo implode(',', $array), "\n";
Результат:
1,2,3
1,2,2
Почему? По качану. Между первой и второй нужен unset($value);.
Замечательный язык вообще. И отсутствие у переменных областей видимости уровня блока — отдельная победа на пути к говнокоду. Зато отлично учишься каждые 5 строк кода выносить в отдельную функцию.
PHP и JS, сладкий твикс страдания. JS, правда, боль-мень вылечили.
Спрашивайте ваши ответы.
Сабж.
https://techcrunch.com/2021/03/30/youtube-tests-hiding-dislike-counts-on-videos/
In response to creator feedback around well-being and targeted dislike campaigns, we’re testing a few new designs that don’t show the public dislike count.
Напоминаю, что в ZeroNet есть филиал LOR.
Без установки приложения посмотреть форум можно через прокси:
https://zeronet.now.im/1BpFtPez7mSiShtXfb4wPfMT1dZTuRybfZ/
И написать, в принципе, тоже можно оттуда же. Только при создании учётки помните, что:
ZeroNet — это децентрализованная платформа для создания веб-приложений (сайтов), работающих в браузере и использующих приложение самой ZeroNet в качестве бекэнда. Можно выделить основные особенности платформы:
Теперь к сути вопроса.
Апстрим проекта в настоящее время находится в стагнации. Судьба главного разработчика, имевшего право подтверждать пулл-реквесты, туманна. То ли он просто забил на проект. То ли с ним что-то случилось.
Активной разработки не ведётся уже более полугода. Изредка кто-то подтверждает мелкие PR, а значит, у кого-то всё же есть доступ к его учетной записи. На этом основании можно строить разные коспирологические теории, но мы сейчас не об этом.
Я взялся рефакторить код ядра и планирую выпуск форка, продолжающего развитие в заданном русле и закрывающего многие долгоиграющие недоработки.
Текущий драфт ченджлога можно посмотреть здесь: https://github.com/zeronet-enhanced/ZeroNet/blob/massive-rework/ZNE-ChangeLog/ChangeLog-0.8.0.md
Всё, что там описано, уже реализовано. Впереди еще многое другое.
Всех заинтересованных лиц призываю присоединиться к работе.
А давайте обсудим идею добавить на ЛОР reactions, по типу как на github?
Чтобы не провоцировать срачи и хейт, предлагаю запилить только позитивные или нейтральные реакции типа таких: 👍, 😄, ❤️, 😕, но не таких: 👎.
| ← назад | следующие → |