LINUX.ORG.RU

Сообщения wandrien

 

Отлаживаю кодогенератор

 , ,

В свободное время попиливаю компилятор ЯП для разминки мозгов и чтобы не забыть ассемблер окончательно.

По семантике ЯП Си-подобный, по синтаксису больше похож на что-то из линейки Паскаль/Модула/Оберон.

За основу брал 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… что-то из этого.

Задавайте ваши вопросы.

wandrien
()

ненормальное программирование

 , ,

wandrien
()

The letter Q in Firefox stands for Quality

 

Просто скормите ему бесконечный html файл с сервера, и он сожрёт сначала всю память, затем весь своп, и потом повиснет, почему-то не убившись об OOM Killer.

/me пристально смотрит на год в календаре

АААААА!

wandrien
()

Safely iterating over WeakKeyDictionary and WeakValueDictionary

 

Интернеты пишут:

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

Терминологическое

 ,

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

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

wandrien
()

FOX Desktop (Ловите наркомана!)

 , , ,

Есть такой FOX Toolkit, очень давний кроссплатформенный тулкит на C++, который разрабатывается единственным разработчиком-энтузиастом. Тулкит не заброшен, хотя и не разрабатывается в активном темпе.

С самим тулкитом поставляются:

  • Файловый менеджер PathFinder.
  • Текстовый редактор Adie с простой подсветкой синтаксиса.
  • Инженерный калькулятор FOX Calculator.
  • Скриншотилка shutterbug. Вроде что особенного ждать от скриншотилки, но довольно удобная. Можно, например, с экрана анимацию записывать в gif.
  • И утилита ControlCenter, отвечающая за некоторые базовые настройки тулкита.

Есть еще двухпанельный ФМ XFE (free.fr) на этом тулките. Он укомплектован просмотрщиком изображений и еще одним простым редактором.

Раньше был еще проект fxdesktop — попытка сделать на этом тулките DE. Не знаю, насколько глобальные были планы у автора, но удалось сделать только часть базовых функций экранной панели, и проект был заброшен. Всё это умерло где-то к концу 00-х.

Еще есть fxprocessview — диспетчер процессов в полуработающем состоянии, тоже заброшен.

На самом деле я вспомнил о fxdesktop только потому, что у меня на машине остался неудаленный пакет с ним еще со времен до миграции с 32-битного на 64-битный Арч. (Я без переустановки ОС мигрировал; через принудительную переустановку всех системных пакетов.) Ну и тут я решил упороться, и понеслось…

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

Пока что было сделано:

У ControlCenter исправил цветовую схему, чтобы она точно имитировала цвета Windows. Потом на этом не остановился и запилил все варианты:

  • Redmond 95 (цветовая схема Windows 95, 98)
  • Redmond 2000 (цветовая схема Windows ME, 2000, а также классических стилей XP и 7)
  • Redmond XP (эта цветовая схема соответствует той, какую выбирает XP-ха, когда в ней настроена Luna, а приложение умеет только в классику.)
  • Redmond XP Olive, Redmond XP Silver (аналогично для этих вариантов оформления)
  • Redmond 7 (аналогично — если в семерке настроена Аэро, а приложение умеет только в классику, то семерка ставит такой набор цветов — вот его и имитируем)

Следом добавил цветовые схемы для классических стилей gtk2: Raleigh, Crux, Clearlooks, Industrial, ThinIce. То есть в сами эти стили FOX, разумеется, не умеет. Но при выборе соответствующих цветовых схем он, по крайней мере, использует такие же опорные цвета для окон и текста. Для Adwaita тоже добавил.

Плохая новость в том, что цветовые схемы хранятся не в конфигах, а вшиты прямо в ControlCenter. Выбранный набор цветов программа пишет в конфиг, чтобы другие приложения могли им пользоваться. А вот сами наборы — это массив в исходниках. Неудобно.

Кстати говоря, бесполезный факт, но внешний вид элементов управления практически с попиксельной точностью воспроизводит классическую Windows. Так вот по скрину окна (без рамок openbox-а) даже не знаю, можно ли отличить от Винды. Например, стиль Redmond в gtk2 сразу палится, что не винда — он совсем не pixel perfect.

Дальше я поржал с русской локализации XFE с опечатками типа «Измененять» и «Сравнитель файлов» и сел её править. Потом уперся в то, что часть бреда исправить не могу, потому что бред также в английском оригинале. (Разработчик из Франции, возможно, в этом дело.) Тут нужно будет писать письма в апстрим, ладно, это потом…

Ну и наконец я взялся за fxdesktop. Сам код компилируется без проблем спустя 10+ лет, пришлось только кривой configure-скрипт переписать. На скриншоте видно рабочий стол (оранжевый фон без ничего) и панель вверху — это всё, что есть в этой программе. Иконки на рабочем столе программа рисовать не умеет, но умеет меню по ПКМ, где планировалось что-то полезное, но почти ничего нет. На панели слева направо видно:

  • Кнопка вызова меню приложений. Не работает. С современной организацией меню приложений не пашет.
  • Кнопка «Свернуть все окна». На сворачивание работает. На разворачивание обратно ­— нет.
  • 4 кнопки-лаунчера. Вот над лаунчером сейчас работаю. Научил его отображать иконку каталога, если лаунчер ведет на каталог. Научил отображать специальные иконку каталогов, если лаунчер ведет на специальный каталог (HOME, XDG_DESKTOP_DIR, XDG_DOCUMENTS_DIR, XDG_DOWNLOAD_DIR и т.п.). Научил лаунчер распознавать и подставлять соответствующие специальные переменные окружения в путях. Научил примитивной логике загрузки иконок по имени. Пока без полной поддержки тем иконок.
  • Переключатель рабочих столов. Работает.
  • Шестеренка — выпадающее меню со списком открытых окон. Работает.
  • Часы. Работают, никаких настроек формата времени не имеют.
  • Сама панель должна быть гибко конфигурируемой (в плане добавления/удаления виджетов), но это недоделано.

Что еще видно на скриншоте. «FOX Desktop Setup» — это утилита ControlCenter. А «FOX Desktop Settings» — это настройки самого fxdesktop. Надо их какое-то более очевидно переименовать, что ли. Для скриншота открыл калькулятор и PathFinder. Текстовый редактор в композицию на мой монитор уже не влез.

PathFinder вот так по хардкору имитирует иконки то ли от 95-й винды, то ли вообще от 3.11-й. XFE пытается выглядеть чуть современнее и в свежем релизе даже обещали поддержку HiDPI.

Это никакое не DE, разумеется. Но некий смысл в этом сборнике недописанных программ всё же есть. Во-первых, их интересно дописывать. :D Во-вторых, на старом компе это должно летать. Кто-то тут у нас коллекционировал старые пни и всё такое?..

P.S. Дорогой движок форума, да какие я метки сюда поставлю? Тега «fox toolkit» у тебя, к сожалению, нет, а добавить его мне число звезд не даёт. Тега «практическая некромантия» тоже не подвезли.

wandrien
()

Центосей расплодилось

 , , , ,

Пишут вот:

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

(https://www.opennet.ru/opennews/art.shtml?num=55445)

Я из криокамеры про такую даже не слышал. Про Oracle Linux давно знаю, про AlmaLinux и Rocky Linux тоже знаю.

В чем актуальные различия между этим формально совместимым друг с другом зоопарком? И на что теперь ориентироваться?

wandrien
()

LibreOffice: выделить текст, имеющий заданное форматирование

 

  1. Курсор стоит внутри фрагмента текста с некоторым форматированием. Хотелось бы по хоткею иметь возможность выделить весь фрагмент, имеющий это форматирование.

  2. Курсор стоит внутри фрагмента текста с некоторым форматированием. Хотелось бы по хоткею найти все другие вхождения такого же форматирования в документе. (Ну или по одному хотя бы.)

Есть готовые решения для этого?

wandrien
()

leave, ну какой нафиг оффтопик?

 

В поисках любой удалённой работы

@leave, я там топикстартеру дал рабочий совет, как искать работу, которая ему нужна.

Тем не менее, это, значит, оффтопик, а то что там другие модераторы флудят не по делу — это всё нормально.

Какого черта?

wandrien
()

Ищется программист для доработки open-source проекта

 , ,

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

Как многие из местных в курсе, у меня есть частичный форк LXDE, который я так и не довел до состояния логической завершенности.

Проект ориентирован на старые компьютеры. Код написан на Си с использованием gtk2. Миграция на другие версии тулкита не рассматривается.

У меня нет большого бюджета на проект, поэтому ищется не столько сотрудник на зарплату, сколько волонтёр, которому интересен такой проект сам по себе, и для которого оплата станет дополнительным бонусом. Это возможно, если:

  • Вы являетесь энтузиастом СПО, и у вас есть желание поучаствовать в свободном проекте в качестве хобби.
  • По какой-то причине вам интересна разработка GUI-приложений на Си, на устаревшем тулките и под почти уже устаревший X11.

Скилы, которые потребуются для работы:

  • Знание Си.
  • Знакомство со сборочной средой autotools.
  • Умение собирать софт под Linux и FreeBSD.
  • Знакомство с GLIB2, GTK2, X11.
  • Навыки вдумчивого поиска багов и анализа архитектуры.
  • Работа с git.

ИЛИ:

  • Наличие головы и желания научиться всему необходимому.

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

По оплате. Скажем, 10 долларов за один простой таск.

Пример такого таска:

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

Собственно, это наверное и будет первым таском по проекту.

По более сложным фичам — требует обсуждения. Разумеется, я не ожидаю, что вы будете работать бесплатно, например, если задача в том, чтобы отыскать и исправить гонку в многопоточном запутанном коде. Но сколько такая работа может стоить, я сам пока не очень представляю.

ТАКЖЕ

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

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

wandrien
()

Федеративность vs P2P

 , ,

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

Фундаментом нашего объединения является идея, изложенная в эссе «Protocols, Not Platforms»

И именно поэтому существует целый выводок реализаций как раз движков-платформ. Я и правда не понимаю, какое дело конечному пользователю будет до протокола, если он взаимодействует с конкретной платформой, к которой привязана его учётка. Код исполняется не на его машине и не под его контролем. Данные пользователя подконтрольны не ему, а черт знает кому. То, что там будет СПО, абсолютно параллельно. Суть СПО не святости концепции, а в том, чтобы знать, что за код работает с твоими данными. Не тот случай.

Возможно, ты используешь Mastodon неправильно

А может быть, всё проще, и это Mastodon спроектирован неправильно.

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

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

Что мешало сразу сделать дизайн, в котором пользователь — это универсальный криптографический ключ, не прибитый к платформе? А кружки по интересам… просто кружки по интересам!

Внутренняя политика […] Рассмотрим какой-нибудь инстанс. У него есть внутренняя политика. Она регулирует то, что происходит в стенах этого инстанса, между его пользователями. К ней относятся правила поведения, на каждом инстансе они свои. Регистрируясь на конкретном инстансе, ты соглашаешься с его конкретными правилами.

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

И если раньше админ группы в Фейсбуке был ограничен во власти по отношению к участникам группы средствами самого Фейсбука, то теперь «админ группы» обладает полной властью вместо Фейсбука.

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

Внешняя политика […] Тут, конечно, начинаются всякие страсти. Это комплекс всего, что происходит при общении между серверами. К вам, как гражданину своего инстанса, внутренней политикой скорее всего приставлен долг не порочить честь своего сообщества на междусерверной арене. […] Глушение. […] Отклонение медиа. […] Блокировка.

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

Да, и наконец, мне скажут типа: просто подними свой сервер, и своими данными управлять будешь только ты. Во-первых, не только я. Любому серверному приложению необходим хостинг с белым IP. А во-вторых, вот только технически это решение ничем не отличается от старого доброго блога на вордпресс и ленты RSS для экспорта всем желающим. Изобретение нового мира вышло каким-то… неубедительным.


В общем, я такой человек, который во всём найдёт изъяны. С ходу могу вспомнить только три примера, когда дизайн продукта меня полностью устраивал при знакомстве. Первый был, когда я познакомился с Ruby. Второй, когда открыл для себя Docker. И третий, когда увидел обновленный JS с let, const и стрелками.

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

Самое главное, чего не делает федиверс, он не провозглашает пользователя как объект первого класса в своей семантической модели. Всё так же объекты первого класса — это сервера, сервера, сервера.

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

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

В то же время, приложение на ZeroNet при желании можно продаунгрейдить до федеративного сервера, точно так же как федеративный сервер при желании архитектурно даунгрейдится до «Фейсбука». А вот обратно — не получится. Если в исходном дизайне не выполнено соответствующее разделение абстракций, то без полной переделки дизайна им просто неоткуда будет взятся. «Лишние» степени свободы платформы при желании можно скрыть, а вот несуществующие нарисовать не получится.

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

Допилить ZeroNet до убойной технологии не сложнее, чем с нуля реализовать стек Gemini вместе с сервером и браузером на GTK. Реально нужно 5-6 заинтересованных лиц и немного времени.

Сейчас ситуация такова, что на всей Земле не нашлось этих пяти лиц.

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

Пойду куплю пива в связи со сдачей очередного проекта. Пошло оно всё подальше.


Спасибо commagray & CO за предоставленные для цитирования буквы.

wandrien
()

И снова самый лучший ЯП

 ,

Я снова наступил на эти грабли.

Пример кода:

$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, правда, боль-мень вылечили.

Спрашивайте ваши ответы.

wandrien
()

YouTube собрался убрать дизлайки

 ,

Сабж.

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.

wandrien
()

LOR в ZeroNet

 

Напоминаю, что в ZeroNet есть филиал LOR.

Без установки приложения посмотреть форум можно через прокси:

https://zeronet.now.im/1BpFtPez7mSiShtXfb4wPfMT1dZTuRybfZ/

И написать, в принципе, тоже можно оттуда же. Только при создании учётки помните, что:

  • Приватный ключ от неё временный и хранится на самом прокси. Не создавайте постоянную учетку с «красивым» именем.
  • Ваш IP известен прокси, а кто владелец прокси, можно только догадываться.
wandrien
()

ZeroNet — p2p платформа хостинга сайтов и соцсеть

 , ,

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

  • Хранение данных осуществляется в простых текстовых файлах (JSON) с кэшированием в sqlite для быстрого доступа. Кроме JSON, разумеется, возможно также использование любых текстовых или бинарных форматов, но уже без поддержки автоматического построения таблиц sqlite.
  • Все данные подписаны ключами своих авторов, таким образом подделать авторство сайта невозможно. Также невозможно модифицировать чужой сайт.
  • Сайты хранятся по принципу торрента — любыми заинтересованными участниками сети. Отключить сайт, выведя из строя какой-либо сервер, невозможно.
  • Сайт остаётся работоспособен даже если остался на единственном узле или если компьютер посетителя сайта вообще отключен от интернета.
  • Если связи нет, можно продолжать работу с сайтом в обычном режиме: писать посты в блог, комментарии на форум и т.п. При появлении связи данные будут синхронизированы автоматически.
  • Передача данных между пирами осуществляется напрямую через IP-соединения и/или через Tor на усмотрение пользователя.
  • Первичный поиск пиров для сайта выполняется на трекерах собственного типа, либо на произвольных торрент-трекерах по всему миру. После установления связи, узлы обмениваются списками пиров и известных трекеров между собой.

Теперь к сути вопроса.

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

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

Я взялся рефакторить код ядра и планирую выпуск форка, продолжающего развитие в заданном русле и закрывающего многие долгоиграющие недоработки.

Текущий драфт ченджлога можно посмотреть здесь: https://github.com/zeronet-enhanced/ZeroNet/blob/massive-rework/ZNE-ChangeLog/ChangeLog-0.8.0.md

Всё, что там описано, уже реализовано. Впереди еще многое другое.

Всех заинтересованных лиц призываю присоединиться к работе.

wandrien
()

reactions

А давайте обсудим идею добавить на ЛОР reactions, по типу как на github?

Чтобы не провоцировать срачи и хейт, предлагаю запилить только позитивные или нейтральные реакции типа таких: 👍, 😄, ❤️, 😕, но не таких: 👎.

wandrien
()

Ретрошара

 

Кто-нибудь пользуется? С кем обменяться ключиками?

cast @mertvoprog

wandrien
()

Где нынче регистрировать домен...

 

…под личный бложик и пет-проекты?

Давным-давно брал на 2domains.ru.

Лучше брать домен у зарубежного регистратора? У какого? Какие подводные камни могут быть с оплатой или еще чем-нибудь?

wandrien
()

HDD дохнет?

 

Подхожу к компу, а там хомяк в RO. Ну и /var за компанию тоже.

В логах такое:

мар 10 13:48:26 aquila systemd-logind[898]: Lid closed.
мар 10 13:48:32 aquila kernel: ata3.00: exception Emask 0x10 SAct 0x1000 SErr 0x4040000 action 0xe frozen
мар 10 13:48:35 aquila kernel: ata3.00: irq_stat 0x00000040, connection status changed
мар 10 13:48:35 aquila kernel: ata3: SError: { CommWake DevExch }
мар 10 13:48:35 aquila kernel: ata3.00: failed command: WRITE FPDMA QUEUED
мар 10 13:48:35 aquila kernel: ata3.00: cmd 61/18:60:30:31:11/00:00:1b:00:00/40 tag 12 ncq dma 12288 out
                                           res 50/00:00:00:00:00/00:00:00:00:00/00 Emask 0x10 (ATA bus error)
мар 10 13:48:35 aquila kernel: ata3.00: status: { DRDY }
мар 10 13:48:35 aquila kernel: ata3: hard resetting link
мар 10 13:48:35 aquila kernel: ata3: SATA link down (SStatus 1 SControl 300)
мар 10 13:48:35 aquila kernel: ata3: hard resetting link
мар 10 13:48:35 aquila kernel: ata3: SATA link up 3.0 Gbps (SStatus 123 SControl 300)
мар 10 13:48:35 aquila kernel: ata3.00: configured for UDMA/133
мар 10 13:48:35 aquila kernel: ata3: EH complete
мар 10 13:48:41 aquila kernel: ata3.00: exception Emask 0x10 SAct 0x40000 SErr 0x4040000 action 0xe frozen
мар 10 13:48:41 aquila kernel: ata3.00: irq_stat 0x00000040, connection status changed
мар 10 13:48:41 aquila kernel: ata3: SError: { CommWake DevExch }
мар 10 13:48:41 aquila kernel: ata3.00: failed command: WRITE FPDMA QUEUED
мар 10 13:48:41 aquila kernel: ata3.00: cmd 61/88:90:00:ad:d2/00:00:5f:00:00/40 tag 18 ncq dma 69632 out
                                           res 50/00:00:00:00:00/00:00:00:00:00/00 Emask 0x10 (ATA bus error)
мар 10 13:48:41 aquila kernel: ata3.00: status: { DRDY }
мар 10 13:48:41 aquila kernel: ata3: hard resetting link
мар 10 13:48:42 aquila kernel: ata3: SATA link up 3.0 Gbps (SStatus 123 SControl 300)
мар 10 13:48:42 aquila kernel: ata3.00: configured for UDMA/133
мар 10 13:48:42 aquila kernel: ata3: EH complete
.
.
.
.
.
.
мар 10 13:54:17 aquila kernel: ata3.00: exception Emask 0x10 SAct 0x100000 SErr 0x450100 action 0x6 frozen
мар 10 13:54:17 aquila kernel: ata3.00: irq_stat 0x08000000, interface fatal error
мар 10 13:54:17 aquila kernel: ata3: SError: { UnrecovData PHYRdyChg CommWake Handshk }
мар 10 13:54:17 aquila kernel: ata3.00: failed command: WRITE FPDMA QUEUED
мар 10 13:54:17 aquila kernel: ata3.00: cmd 61/50:a0:58:f2:56/00:00:43:00:00/40 tag 20 ncq dma 40960 out
                                           res 50/00:50:58:f2:56/00:00:43:00:00/40 Emask 0x10 (ATA bus error)
мар 10 13:54:17 aquila kernel: ata3.00: status: { DRDY }
мар 10 13:54:17 aquila kernel: ata3: hard resetting link
мар 10 13:54:17 aquila kernel: ata3: SATA link up 3.0 Gbps (SStatus 123 SControl 300)
мар 10 13:54:17 aquila kernel: ata3.00: configured for UDMA/133
мар 10 13:54:17 aquila kernel: ata3: EH complete
мар 10 13:54:27 aquila kernel: ata3: limiting SATA link speed to 1.5 Gbps
мар 10 13:54:27 aquila kernel: ata3.00: exception Emask 0x10 SAct 0x20 SErr 0x450100 action 0x6 frozen
мар 10 13:54:27 aquila kernel: ata3.00: irq_stat 0x08000000, interface fatal error
мар 10 13:54:27 aquila kernel: ata3: SError: { UnrecovData PHYRdyChg CommWake Handshk }
мар 10 13:54:27 aquila kernel: ata3.00: failed command: WRITE FPDMA QUEUED
мар 10 13:54:27 aquila kernel: ata3.00: cmd 61/58:28:30:f3:56/00:00:43:00:00/40 tag 5 ncq dma 45056 out
                                           res 50/00:58:30:f3:56/00:00:43:00:00/40 Emask 0x10 (ATA bus error)
мар 10 13:54:27 aquila kernel: ata3.00: status: { DRDY }
мар 10 13:54:27 aquila kernel: ata3: hard resetting link
мар 10 13:54:27 aquila kernel: ata3: SATA link up 1.5 Gbps (SStatus 113 SControl 310)
мар 10 13:54:27 aquila kernel: ata3.00: configured for UDMA/133
мар 10 13:54:27 aquila kernel: ata3: EH complete

Потом еще пара страниц не относящихся к делу сообщений, и дальше журнала нет по понятным причинам.

SMART:

smartctl 7.2 2020-12-30 r5155 [x86_64-linux-5.10.19-1-lts] (local build)
Copyright (C) 2002-20, Bruce Allen, Christian Franke, www.smartmontools.org

=== START OF INFORMATION SECTION ===
Model Family:     HGST Travelstar 7K1000
Device Model:     HGST HTS721010A9E630
Serial Number:    JR1004BNJKM6VM
LU WWN Device Id: 5 000cca 8e6e43178
Firmware Version: JB0OA3U0
User Capacity:    1 000 204 886 016 bytes [1,00 TB]
Sector Sizes:     512 bytes logical, 4096 bytes physical
Rotation Rate:    7200 rpm
Form Factor:      2.5 inches
Device is:        In smartctl database [for details use: -P show]
ATA Version is:   ATA8-ACS T13/1699-D revision 6
SATA Version is:  SATA 3.0, 6.0 Gb/s (current: 3.0 Gb/s)
Local Time is:    Wed Mar 10 19:42:30 2021 +07
SMART support is: Available - device has SMART capability.
SMART support is: Enabled

=== START OF READ SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED

General SMART Values:
Offline data collection status:  (0x00)	Offline data collection activity
					was never started.
					Auto Offline Data Collection: Disabled.
Self-test execution status:      (   0)	The previous self-test routine completed
					without error or no self-test has ever 
					been run.
Total time to complete Offline 
data collection: 		(   45) seconds.
Offline data collection
capabilities: 			 (0x5b) SMART execute Offline immediate.
					Auto Offline data collection on/off support.
					Suspend Offline collection upon new
					command.
					Offline surface scan supported.
					Self-test supported.
					No Conveyance Self-test supported.
					Selective Self-test supported.
SMART capabilities:            (0x0003)	Saves SMART data before entering
					power-saving mode.
					Supports SMART auto save timer.
Error logging capability:        (0x01)	Error logging supported.
					General Purpose Logging supported.
Short self-test routine 
recommended polling time: 	 (   2) minutes.
Extended self-test routine
recommended polling time: 	 ( 170) minutes.
SCT capabilities: 	       (0x003d)	SCT Status supported.
					SCT Error Recovery Control supported.
					SCT Feature Control supported.
					SCT Data Table supported.

SMART Attributes Data Structure revision number: 16
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
  1 Raw_Read_Error_Rate     0x000b   100   100   062    Pre-fail  Always       -       0
  2 Throughput_Performance  0x0005   100   100   040    Pre-fail  Offline      -       0
  3 Spin_Up_Time            0x0007   119   119   033    Pre-fail  Always       -       2
  4 Start_Stop_Count        0x0012   100   100   000    Old_age   Always       -       1122
  5 Reallocated_Sector_Ct   0x0033   100   100   005    Pre-fail  Always       -       0
  7 Seek_Error_Rate         0x000b   100   100   067    Pre-fail  Always       -       0
  8 Seek_Time_Performance   0x0005   100   100   040    Pre-fail  Offline      -       0
  9 Power_On_Hours          0x0012   086   086   000    Old_age   Always       -       6553
 10 Spin_Retry_Count        0x0013   100   100   060    Pre-fail  Always       -       0
 12 Power_Cycle_Count       0x0032   100   100   000    Old_age   Always       -       1115
191 G-Sense_Error_Rate      0x000a   100   100   000    Old_age   Always       -       0
192 Power-Off_Retract_Count 0x0032   100   100   000    Old_age   Always       -       36
193 Load_Cycle_Count        0x0012   078   078   000    Old_age   Always       -       223725
194 Temperature_Celsius     0x0002   157   157   000    Old_age   Always       -       38 (Min/Max 11/51)
196 Reallocated_Event_Count 0x0032   100   100   000    Old_age   Always       -       0
197 Current_Pending_Sector  0x0022   100   100   000    Old_age   Always       -       0
198 Offline_Uncorrectable   0x0008   100   100   000    Old_age   Offline      -       0
199 UDMA_CRC_Error_Count    0x000a   200   200   000    Old_age   Always       -       39
223 Load_Retry_Count        0x000a   100   100   000    Old_age   Always       -       0

SMART Error Log Version: 1
ATA Error Count: 39 (device log contains only the most recent five errors)
	CR = Command Register [HEX]
	FR = Features Register [HEX]
	SC = Sector Count Register [HEX]
	SN = Sector Number Register [HEX]
	CL = Cylinder Low Register [HEX]
	CH = Cylinder High Register [HEX]
	DH = Device/Head Register [HEX]
	DC = Device Command Register [HEX]
	ER = Error register [HEX]
	ST = Status register [HEX]
Powered_Up_Time is measured from power on, and printed as
DDd+hh:mm:SS.sss where DD=days, hh=hours, mm=minutes,
SS=sec, and sss=millisec. It "wraps" after 49.710 days.

Error 39 occurred at disk power-on lifetime: 6547 hours (272 days + 19 hours)
  When the command that caused the error occurred, the device was active or idle.

  After command completion occurred, registers were:
  ER ST SC SN CL CH DH
  -- -- -- -- -- -- --
  84 51 01 07 90 cc 0d  Error: ICRC, ABRT at LBA = 0x0dcc9007 = 231510023

  Commands leading to the command that caused the error were:
  CR FR SC SN CL CH DH DC   Powered_Up_Time  Command/Feature_Name
  -- -- -- -- -- -- -- --  ----------------  --------------------
  61 08 50 00 90 cc 40 00      03:50:09.783  WRITE FPDMA QUEUED
  ef 10 03 00 00 00 a0 00      03:50:09.783  SET FEATURES [Enable SATA feature]
  ec 00 00 00 00 00 a0 00      03:50:09.782  IDENTIFY DEVICE
  ef 03 42 00 00 00 a0 00      03:50:09.782  SET FEATURES [Set transfer mode]
  ec 00 00 00 00 00 a0 00      03:50:09.781  IDENTIFY DEVICE

Error 38 occurred at disk power-on lifetime: 6547 hours (272 days + 19 hours)
  When the command that caused the error occurred, the device was active or idle.

  After command completion occurred, registers were:
  ER ST SC SN CL CH DH
  -- -- -- -- -- -- --
  84 51 01 07 90 cc 0d  Error: ICRC, ABRT at LBA = 0x0dcc9007 = 231510023

  Commands leading to the command that caused the error were:
  CR FR SC SN CL CH DH DC   Powered_Up_Time  Command/Feature_Name
  -- -- -- -- -- -- -- --  ----------------  --------------------
  61 08 68 00 90 cc 40 00      03:50:09.413  WRITE FPDMA QUEUED
  ef 10 03 00 00 00 a0 00      03:50:09.413  SET FEATURES [Enable SATA feature]
  ec 00 00 00 00 00 a0 00      03:50:09.412  IDENTIFY DEVICE
  ef 03 42 00 00 00 a0 00      03:50:09.412  SET FEATURES [Set transfer mode]
  ec 00 00 00 00 00 a0 00      03:50:09.411  IDENTIFY DEVICE

Error 37 occurred at disk power-on lifetime: 6547 hours (272 days + 19 hours)
  When the command that caused the error occurred, the device was active or idle.

  After command completion occurred, registers were:
  ER ST SC SN CL CH DH
  -- -- -- -- -- -- --
  84 51 01 07 90 cc 0d  Error: ICRC, ABRT at LBA = 0x0dcc9007 = 231510023

  Commands leading to the command that caused the error were:
  CR FR SC SN CL CH DH DC   Powered_Up_Time  Command/Feature_Name
  -- -- -- -- -- -- -- --  ----------------  --------------------
  61 08 28 00 90 cc 40 00      03:50:09.033  WRITE FPDMA QUEUED
  ef 10 03 00 00 00 a0 00      03:50:09.033  SET FEATURES [Enable SATA feature]
  ec 00 00 00 00 00 a0 00      03:50:09.032  IDENTIFY DEVICE
  ef 03 42 00 00 00 a0 00      03:50:09.032  SET FEATURES [Set transfer mode]
  ec 00 00 00 00 00 a0 00      03:50:09.031  IDENTIFY DEVICE

Error 36 occurred at disk power-on lifetime: 6547 hours (272 days + 19 hours)
  When the command that caused the error occurred, the device was active or idle.

  After command completion occurred, registers were:
  ER ST SC SN CL CH DH
  -- -- -- -- -- -- --
  84 51 01 07 90 cc 0d  Error: ICRC, ABRT at LBA = 0x0dcc9007 = 231510023

  Commands leading to the command that caused the error were:
  CR FR SC SN CL CH DH DC   Powered_Up_Time  Command/Feature_Name
  -- -- -- -- -- -- -- --  ----------------  --------------------
  61 08 18 00 90 cc 40 00      03:50:08.663  WRITE FPDMA QUEUED
  ef 10 03 00 00 00 a0 00      03:50:08.663  SET FEATURES [Enable SATA feature]
  ec 00 00 00 00 00 a0 00      03:50:08.662  IDENTIFY DEVICE
  ef 03 42 00 00 00 a0 00      03:50:08.662  SET FEATURES [Set transfer mode]
  ec 00 00 00 00 00 a0 00      03:50:08.661  IDENTIFY DEVICE

Error 35 occurred at disk power-on lifetime: 6547 hours (272 days + 19 hours)
  When the command that caused the error occurred, the device was active or idle.

  After command completion occurred, registers were:
  ER ST SC SN CL CH DH
  -- -- -- -- -- -- --
  84 51 00 00 00 00 00

  Commands leading to the command that caused the error were:
  CR FR SC SN CL CH DH DC   Powered_Up_Time  Command/Feature_Name
  -- -- -- -- -- -- -- --  ----------------  --------------------
  ec 00 00 00 00 00 a0 00      03:50:03.301  IDENTIFY DEVICE
  61 08 01 07 90 cc 0d ff      03:50:02.961  WRITE FPDMA QUEUED
  61 08 28 00 90 cc 40 00      03:50:02.923  WRITE FPDMA QUEUED
  ef 10 03 00 00 00 a0 00      03:50:02.923  SET FEATURES [Enable SATA feature]
  ec 00 00 00 00 00 a0 00      03:50:02.922  IDENTIFY DEVICE

SMART Self-test log structure revision number 1
Num  Test_Description    Status                  Remaining  LifeTime(hours)  LBA_of_first_error
# 1  Extended offline    Interrupted (host reset)      80%      4412         -
# 2  Short offline       Completed without error       00%      3199         -
# 3  Extended offline    Completed without error       00%        24         -
# 4  Short offline       Completed without error       00%         4         -

SMART Selective self-test log data structure revision number 1
 SPAN  MIN_LBA  MAX_LBA  CURRENT_TEST_STATUS
    1        0        0  Not_testing
    2        0        0  Not_testing
    3        0        0  Not_testing
    4        0        0  Not_testing
    5        0        0  Not_testing
Selective self-test flags (0x0):
  After scanning selected spans, do NOT read-scan remainder of disk.
If Selective self-test is pending on power-up, resume after 0 minute delay.

Какой вердикт? Срочно бэкапиться?

P.S.

После перезагрузки стали падать вкладки в лисе. Вроде к HDD не относится, хотя хз…

wandrien
()

Утечка данных через кольцевую шину CPU Intel

 

Пацаны, к нам снова традиционный дуршлаг с подогревом от Интел подъехал:

https://www.opennet.ru/opennews/art.shtml?num=54717

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

Ай, хорошо!

wandrien
()

RSS подписка на новые темы