LINUX.ORG.RU

Сообщения EXL

 

Инструмент для выявления различий в SDK

Форум — Development

Кратко:

Есть десяток SDK в которых сишные хедеры с разными сущностями в виде функций, структур, макросов, переменных и др. которые делали разные разработчики. Нужно аккуратно сравнить их между собой. Сравнить грамотно, то есть пропуская разное именование аргументов функций и разный стиль кодирования разработчиков. И на основе этих разниц сделать всеобъемлющий SDK, включающий в себя наработки всех этих десяти SDK. Есть ли какие-нибудь инструменты для решения подобных задач?

TL;DR:

В середине нулевых было сообщество по реверсу прошивок под некоторые железки. Сообщество пилило приложения на C/C++, но как это и было ожидаемо от тех лет, разработчики из этого сообщества были рассредоточены в превалирующем большинстве на Windows. Отсюда вытекают проблемы разработки тех лет: Win-1251 вместо Unicode, RAR-архивы вместо использования VCS, обмазанность BAT-скриптами с адовой логикой вида запишем результат в файлик чтобы прочитать его и отправить в следующую утилиту, регистронезависимость в именах хедеров и прочее подобное, те кто сталкивался с этим, тот знает.

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

Собственно я решил в качестве хобби для сообщества ROM-хакеров объединить эти древние разрозненные SDK и сделать инструментарий кросс-платформенным, доступным и для Linux.

И вот столкнулся с интересной задачей по сравнению SDK. Я конечно ручками и git diff перенёс и всё более-менее полно и работает, но хочется проверить как себя, так и просто подумать над частичной автоматизацией подобной задачи.

То есть, к примеру, сделать такой инструмент, которому я бы кормил директорию SDK, он бы проходил по каждому .h-файлику в нём, собирал информацию о сущностях в этих файлах не смотря на стиль кодирования, названия аргументов и прочие незначительные вещи и выдавал сортированный листинг используемых сущностей. Сравнивая подобные листинги между собой, мне было бы очень просто выявить различия и на их основе собрать всеобъемлющий SDK, который бы охватывал изменения всех разработчиков и я ничего бы не потерял.

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

 , , , ,

EXL
()

Пал последний оплот Mercurial (hg)

Форум — Talks

!Ъ: https://www.opennet.ru/opennews/art.shtml?num=60061

Ъ: Mozilla переводит разработку Firefox с Mercurial на Git. Вот так вот умерла последняя значимая DCVS на Python, популярность которой, к слову, серьёзно пошатнул переход с Python 2 на Python 3.

Кто-то там из слоупоков остался? Nginx только? Когда он мигрирует на Git у Mercurial больше не будет никаких крупных и значимых проектов?

Смежные новости:

Старое обсуждение: Пал один из последних оплотов Mercurial (Hg)

 , , ,

EXL
()

Программирование древнего и экзотического big-endian ARM

Форум — Development

Нашёл в условном ящике стола мобильник Motorola SLVR L6, которому почти 20 лет. Протёр пыль, зарядил батарейку «лягушкой» – до сих пор рабочий чертяка. Оказалось, что под него можно кодить не только на унылом подмножестве Java – J2ME, но и на православной сишке и даже плюсцах. Скачал кросс-компилятор и SDK, доступные как под Linux, так и под Windows и решил написать пару GUI-программок и подёргать функции из прошивки телефона, но столкнулся с одной странной особенностью, про которую хочу уточнить у специалистов.

Есть у меня следующий минимально-неработающий пример и функция wtf_foo(), которую по хорошему нужно инлайнить, но похоже что в кросс-компиляторе вообще не работают инлайны:

#define SWAP_UINT32(x) (((x) >> 24) | (((x) & 0x00FF0000) >> 8) | (((x) & 0x0000FF00) << 8) | ((x) << 24))

static uint8_t bmp_header[70] = {
	0x42, 0x4D, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, 0x38, 0x00,
	0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x10, 0x00, 0x03, 0x00,
	0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0xE0, 0x07, 0x00, 0x00, 0x1F, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};

static void wtf_foo(uint8_t *start_address, uint32_t start_offset, uint32_t value) {
	*((uint32_t *) &start_address[start_offset]) = value;
	/* start_address[start_offset + 0x00] = (value >>  0) & 0x000000FF; */
	/* start_address[start_offset + 0x01] = (value >>  8) & 0x000000FF; */
	/* start_address[start_offset + 0x02] = (value >> 16) & 0x000000FF; */
	/* start_address[start_offset + 0x03] = (value >> 24) & 0x000000FF; */
}

void main(void) {
	print_hex();
	wtf_foo(bmp_header, 0x02, SWAP_UINT32(41030));
	wtf_foo(bmp_header, 0x12, SWAP_UINT32(128));
	wtf_foo(bmp_header, 0x16, SWAP_UINT32(160));
	wtf_foo(bmp_header, 0x22, SWAP_UINT32(40960));
	print_hex();
}

Результаты исполнения кода:

42 4D |FF FF FF FF| 00 00 00 00 46 00 00 00 38 00
00 00 |FF FF FF FF FF FF FF FF| 01 00 10 00 03 00
00 00 |FF FF FF FF| 00 00 00 00 00 00 00 00 00 00         (1)
00 00 00 00 00 00 00 F8 00 00 E0 07 00 00 1F 00
00 00 00 00 00 00

42 4D |46 A0 00 00| 00 00 00 00 46 00 00 00 38 00
00 00 |80 00 00 00 A0 00 00 00| 01 00 10 00 03 00
00 00 |00 A0 00 00| 00 00 00 00 00 00 00 00 00 00         (2)
00 00 00 00 00 00 00 F8 00 00 E0 07 00 00 1F 00
00 00 00 00 00 00

|46 A0 00 00| FF FF 00 00 00 00 46 00 00 00 38 00 
|80 00 00 00 A0 00 00 00| FF FF 01 00 10 00 03 00 
|00 A0 00 00| FF FF 00 00 00 00 00 00 00 00 00 00         (3)
00 00 00 00 00 00 00 F8 00 00 E0 07 00 00 1F 00 
00 00 00 00 00 00
  1. Оригинальный массив без изменений.
  2. Результат работы кода на x86_64, little-endian, хост.
  3. Результат работы кода на ARMv4T, big-endian, целевая железка.

Примечание: Макрос SWAP_UINT32() используется только на целевом устройстве. Код функции wtf_foo() который закомментирован отрабатывает везде одинаково и нормально.

Не понимаю откуда тут берётся сдвиг влево, почему он именно на два байта? Хочется разобраться в чём именно причина этой ошибки? Где-то моя невнимательность при работе с ARM и big-endian или что-то другое, к примеру, баг в компиляторе?

Дополнительная информация, если кому интересно:

Компилятор:
     ARM C/C++ Compiler, ADS1.2 [Build 848]
     Thumb C/C++ Compiler, ADS1.2 [Build 848]
Железо:
     SOC: Freescale/Motorola Neptune LTE
     CPU: ARM7TDMI | ARMv4T | big-endian | 52 MHz
     RAM: (4) 8 MB, 1.5 MB free.
     DSP: 104 MHz StarCore DSP
Операционная система:
     P2K OS: Synergy Environment + VRTXmc RTOS Kernel.

P.S. Внутри девайса не Linux, но есть какой-то кастрированный libc и UNIX-подобная регистрозависимая файловая система.

 , , ,

EXL
()

Brian Kernighan добавляет в AWK поддержку Unicode

Форум — Talks

Не видел обсуждения на ЛОРе, пропустили?

Ъ: Дедушка в 80 лет хочет разобраться с Git и GitHub, чтобы сформировать Pull Request с добавлением поддержки Unicode в тот самый AWK.

Оригинал статьи и интервью: https://www.theregister.com/2022/08/23/universal_unix_tool_awk_gets/

Обсуждение на HackerNews: https://news.ycombinator.com/item?id=32534173

Перевод на Хабре: Брайан Керниган добавляет в AWK поддержку юникода.

 , , ,

EXL
()

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

Форум — Talks

Речь идёт про какие-то там жонглирования состояниями фокусов при открытых контекстных меню, которые вызываются по правой кнопке мыши или через главное меню программы, там где File, Edit, View, Help и т. д.

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

С полгода назад я установил Ubuntu 22.04 LTS с дефолтным Wayland-сеансом и вот только сейчас заметил что куда-то пропало то раздражение, которое я всегда испытывал при попытке заскринить что-либо в Linux. Оказывается что баг этот зафиксили! К хорошему быстро привыкаешь, поэтому я переключился на X.Org-сеанс и решил протестировать поведение в различных приложениях там. Кто знает, вдруг и там пофиксили эту срань?! Ага, хрен там:

  1. Gedit
    Открываем контекстное меню по правой кнопке мыши, нажимаем Prt Sc – ноль реакции.
    А вот главное меню программы по кнопке «бутерброд» даёт себя скриншотить.
  2. GNOME Terminal
    Поведение аналогичное Gedit.
  3. Nautilus
    Поведение аналогичное Gedit.
  4. Firefox
    Открываем контекстное меню по правой кнопке мыши, нажимаем Prt Sc – меню пропадает.
    Открываем главное меню по нажатию Alt, открываем любой пункт, нажимаем Prt Sc – меню тупо закрывается.
  5. Chrome
    Открываем контекстное меню по правой кнопке мыши или главное меню по кнопке «бутерброд», нажимаем Prt Sc – оно пропадает и лишь изредка в скриншот попадает белый прямоугольник без текста.
  6. Qt Creator
    При открытом контекстном или главном меню нет вообще никакой реакции на нажатия кнопки Prt Sc.
  7. GIMP
    Аналогично, нет реакции на Prt Sc при открытом главном и контекстном (оно там тоже главное) меню.
  8. Telegram
    Поведение аналогичное тому что в Qt Creator, ничего не работает, хотя казалось что там все меню имплементированы поверх QPainter.

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

https://baat.exlmoto.ru/~exl_lab/screens/Wayland_Menus.png

Напомните пожалуйста, какую там шизу публикуют различные луддиты в оправдание этого иксового бага? И ладно бы этот баг был какой-то там недавней регрессией, так нет, вот уже как ~20 лет в этом иксовом позоре Linux-десктопа он присутствует и всех раздражает. Я его ещё во времена KDE 3 и GNOME 2 помню, а воз и ныне там.

Со спокойной душой переключаюсь обратно в Wayland-сеанс: да там тоже есть шероховатости и свои глюки, но то, что вот это дурацкое поведение и детские баги иксового говнокода наконец-то подфикшены, не может не радовать.

 , , , ,

EXL
()

Dropbear SSH vs wolfSSH, что выбрать для Embedded?

Форум — General

По мотивам прошлой темы: Ubuntu 22.04 LTS теряет сетевой коннект с USBNET-устройством, где удалось решить проблемы с подключением к древним телефонам Motorola на платформе EZX посредством USBLAN, USBNET.

Теперь хочется собрать для них SSH-сервер и похоже что кроме Dropbear и wolfSSH, других всё ещё развивающихся минималистичных SSH-серверов для embedded сегодня и не осталось. Или всё-таки есть что-нибудь ещё интересное?

Собственно, вопрос, есть у кого опыт работы с этими SSH-серверами? Что минималистичнее и быстрее, какой проще настраивается? Слышал что в OpenWRT используется Dropbear, но можно поставить wolfSSH тоже. Есть ли какие-нибудь подводные камни в их работе, поделитесь пожалуйста опытом.

 , , , wolfssh

EXL
()

Ubuntu 22.04 LTS теряет сетевой коннект с USBNET-устройством

Форум — Admin

Собственно ближе к сути: есть интересный мобильный девайс Motorola MING A1200e, внутри которого крутится Linux с поддержкой технологии USBNET, благодаря которому при подключении по USB телефон видится сетевой карточкой и позволяет заходить внутрь себя по Telnet, FTP, Samba, SSH и VNC.

При подключении устройства ситуация в dmesg:

$ sudo dmesg
...
[ 8986.727030] usb 2-1.2: new high-speed USB device number 12 using ehci-pci
[ 8986.841739] usb 2-1.2: New USB device found, idVendor=22b8, idProduct=6027, bcdDevice= 0.00
[ 8986.841751] usb 2-1.2: New USB device strings: Mfr=5, Product=2, SerialNumber=0
[ 8986.841755] usb 2-1.2: Product: Motorola USBLAN
[ 8986.841758] usb 2-1.2: Manufacturer: Motorola
[ 8986.845071] usb 2-1.2: bad CDC descriptors
[ 8986.845926] zaurus 2-1.2:1.0 usb0: register 'zaurus' at usb-0000:00:1d.0-1.2, pseudo-MDLM (BLAN) device, 1a:01:5d:2f:1c:2d

По ip a следующая картина:

$ ip a
...
usb0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1494 qdisc fq_codel state UNKNOWN group default qlen 1000
    link/ether 1a:01:5d:2f:1c:2d brd ff:ff:ff:ff:ff:ff
    inet6 fe80::44c0:ae0e:9ea3:de0a/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

Назначаю IP-адрес:

$ sudo ip a add 192.168.16.1/255.255.255.0 dev usb0

Картина после этой команды в ip a следующая:

$ ip a
...
usb0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1494 qdisc fq_codel state UNKNOWN group default qlen 1000
    link/ether 1a:01:5d:2f:1c:2d brd ff:ff:ff:ff:ff:ff
    inet 192.168.16.1/24 scope global usb0
       valid_lft forever preferred_lft forever
    inet6 fe80::44c0:ae0e:9ea3:de0a/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

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

Но через несколько секунд подключение рвётся, в ip a при этом снова так, теряется IPv4 адрес:

usb0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1494 qdisc fq_codel state UNKNOWN group default qlen 1000
    link/ether 1a:01:5d:2f:1c:2d brd ff:ff:ff:ff:ff:ff
    inet6 fe80::44c0:ae0e:9ea3:de0a/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

Выполняю ещё раз sudo ip a add 192.168.16.1/255.255.255.0 dev usb0, соединение восстанавливается даже «на горячую», в ip a такая картина:

usb0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1494 qdisc fq_codel state UNKNOWN group default qlen 1000
    link/ether 1a:01:5d:2f:1c:2d brd ff:ff:ff:ff:ff:ff
    inet 192.168.16.1/24 scope global usb0
       valid_lft forever preferred_lft forever

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

В чём может быть проблема? Она точно не в этом устройстве, а где-то в Ubuntu 22.04 LTS, потому что в Fedora 33 таких проблем с этим же устройством у меня не было, коннект был стабильный и постоянный.

 , , usblan,

EXL
()

Ключи для SSH: ED25519 vs RSA

Форум — General

Я слабо разбираюсь в криптографии, но давно заметил тенденцию что всякие GitHub и GitLab настоятельно советуют использовать ED25519 вместо RSA. При этом использующим RSA уже давно вставляют палки в колёса, как сами сервисы (Bitbucket), так и само ПО вроде OpenSSH:

Refuse RSA keys <1024 bits in length and improve reporting for keys that do not meet this requirement. | OpenSSH Release Notes

Я ещё 10 лет назад сгенерировал себе 8192-битный RSA ключ, который везде использую и пока не знаю проблем, но кто его знает как оно будет в «постквантовом» будущем. Следовательно вопрос: нужно ли обновлять свои ключи на ED25519 или остаться ретроградом? Наверняка вы тоже стояли перед этим решением.

P.S. GPG-ключи, наверное, тоже стоит обновить? Там вроде как 4096-битные RSA по умолчанию.

 , , , ,

EXL
()

Markdown: использовать hard break вместо soft break

Форум — Linux-org-ru

@maxcom, может быть сделать цитирование в Markdown более удобным для пользователей, как это сделано на GitHub? Пример форматирования:

>тест
>тест

проверка

На GitHub это отрендерится в:

тест
тест

проверка

Тогда как на ЛОРе получится следующее:

тест тест

проверка

В итоге, чтобы цитата выглядела как на GitHub пользователям ЛОРа при цитировании приходится явно обозначать конец строки или через \, или через висячие пробелы, а это довольно неудобно.

По сути за это отображение в библиотеке Flexmark, которую ты используешь на ЛОРе, отвечает опция HtmlRenderer.SOFT_BREAK, которая описана в начальном примере: BasicSample.java, в итоге пример выше рендерится в HTML с этой и без этой опции так:

<!-- options.set(HtmlRenderer.SOFT_BREAK, "\n") // (DEFAULT) -->

<blockquote>
<p>тест
тест</p>
</blockquote>
<p>проверка</p>

<!-- options.set(HtmlRenderer.SOFT_BREAK, "<br />\n"); -->

<blockquote>
<p>тест<br />
тест</p>
</blockquote>
<p>проверка</p>

В коде движка ЛОРа есть уже это:

https://github.com/maxcom/lorsource/blob/d38c91df3206d51156fb274c18f0dc37af3e4614/src/main/scala/ru/org/linux/util/markdown/FlexmarkMarkdownFormatter.scala#L73-L74

Ты пробовал включать эту опцию? Просто я не знаю как именно хранятся комментарии и заглавные посты в базе данных, в отрендеренном HTML или рендерятся после извлечения. Если второе, то есть риск поломать где-нибудь старую разметку, в общем нужно потестить и проверить всё.

 ,

EXL
()

Linux-дистрибутивы и дистрибьюция коммерческого ПО

Форум — Talks

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

Давеча понадобилось мне открыть несколько изображений весьма специфичного и редкого формата – MBM (MultiBitMap), который в древние века предназначался для хранения нескольких растровых изображений формата BMP и их масок в одном файле со сжатием. Этот формат был распространён в Symbian OS и его предке EPOC, по сути он был примитивным аналогом современных форматов вроде ICNS из macOS или ICO из Windows.

Стандартные программы вроде GIMP’а или Image Viewer’а в Fedora 33 открывать подобные файлы не умеют. В репозиториях дистрибутива тоже ничего путного не нашлось (хотя может быть плохо искал), а вот лёгкое гугление показало что открыть такой файл может просмотрщик изображений XnView.

Программа XnView является проприетарной и коммерческой, хоть и бесплатной для личного использования. Потому она и отсутствует в репозиториях. Но не беда! Идём на официальный сайт программы в раздел загрузок и видим, что её автор не забил (как это обычно бывает) на Linux, а заботливо приготовил помимо DEB-пакетов несколько TAR-ball’ов и даже самодостаточный пакет AppImage соорудил. Вот ведь молодец какой.

Сперва скачиваем AppImage, потому что сам Linus Torvalds с официального сайта AppImage кричит нам «This is just very cool.», а потому предвкушая быстрое решение своей проблемы, делаем:

$ chmod +x XnView_MP.glibc2.18-x86_64.AppImage
$ ./XnView_MP.glibc2.18-x86_64.AppImage 
/tmp/.mount_XnView3k4rdy/usr/XnView/XnView: symbol lookup error: /lib64/libkrb5.so.3: undefined symbol: krb5int_push_fscreatecon_for, version krb5support_0_MIT

Ой. Вот такая у нас хвалёная «самодостаточность». Ну ладно, может быть разработчики как-то криво собрали AppImage, бывает, я сам как-то раз криво их собирал, ничего. Технология-то ещё совсем свежая и молодая, 17 лет всего ей.

Ладно, скачиваем TAR-ball. Тут на форуме некоторые линуксоды постоянно кричат, мол пусть разработчики коммерческого софта своё ПО в TAR-ball’ах распространяют, а то пакеты делают только для Ubuntu или вообще их не делают. Если верить им, то случае архива всё должно пройти максимально гладко.

$ tar -xf XnViewMP-linux-x64.tgz
$ ./XnView
./XnView: error while loading shared libraries: libQtAV.so.1: cannot open shared object file: No such file or directory

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

$ sudo dnf install libqtav
$ ./XnView
./XnView: error while loading shared libraries: libQtAVWidgets.so.1: cannot open shared object file: No such file or directory

Это уже начинает надоедать. Ладно:

$ sudo dnf install libqtavwidgets
$ ./XnView
./XnView: /lib64/libQt5Network.so.5: version `Qt_5_PRIVATE_API' not found (required by ./XnView)

Ясно, понятно. И как теперь быть? Да просто скачиваем с официального сайта XnView версию для Windows и запускаем её:

$ sudo dnf install wine
$ unzip XnViewMP-win-x64.zip
$ wine XnView.exe

Программа работает, нужное мне изображение открывается, проблема решена. А если бы я не трахался с попытками запуска нативных Linux’овых версий, то решил бы её ещё быстрее.

Послесловие

Неужели великий Джон Кармак был прав, когда говорил о том, что развитие и улучшение WINE – лучший путь для Linux-дистрибутивов, а продавливание нативных портов различных коммерческих программ обречено на провал с этим зоопарком ВСЕГО?

И ведь если бы эти пакеты XnView были собраны на отвались, так нет же, авторы программы постоянно собирают баг-репорты ([1], [2]) пользователей Linux и стараются помочь всем этим несчастным людям.

Вдвойне обидно, что XnView это как раз тот редкий случай, когда программа изначально разработанная специально для Linux (и ещё IRIX) вышла за пределы этой операционной системы и стала популярна на Windows и macOS. Это какой-то позор.

 , , dll hell, ,

EXL
()

Что же случилось с OpenNET'ом?

Форум — Talks

Очень часто доводилось слышать, мол ЛОР и вообще многие русскоязычные сообщества не особо дружелюбны к своим пользователям, как это сейчас модно говорить – являются «токсичными». В Интернете на эту тему даже часто встречаются ролики, например, из последнего я видел какое-то популярное «вертикальное видео» в местном Telegram-чатике про наш ЛОР из б-гомерзкого TikTok’а, да и бородатые анекдоты всецело отражают суть этого явления.

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

Плавно перейдём к ситуации на OpenNET’е. Каждый раз когда я хочу прочитать обсуждение чего-либо на OpenNET, я сталкиваюсь с раздражением и непониманием. Нет, новости они пишут и переводят просто отлично – максимально подробно, качественно и своевременно, скорее всего их написанием занимаются материально заинтересованные люди.

Но обсуждения к этим прекрасным новостям… Это просто какой-то кошмар и позор для российского IT-сообщества. Сплошная клоунада и абсолютное отсутствие каких-либо технических обсуждений, конструктивной и аргументированной критики. Одна многочисленная группировка клоунов отыгрывает каких-то старых маразматиков с мировозрением вида «libX11.so наше всё, а те кто придумал GTK+ и Qt – еретики, предать их анафеме и надругаться», им оппонируют многочисленные фрактальные клоуны с «сишными дыренями» в каждом их комментарии. Всё это зачастую изрядно приправлено политотой, взаимными оскорблениями, флеймом и шутками «за 300», найти зачатки разумных обсуждений в этой горе мусора просто нереально.

Там что, полностью отсутствует модерация? Это тот самый случай, когда отключение возможности комментирования или жёсткая премодерация сделает сайт лучше и скорее всего даже популярнее. А ведь когда-то OpenNET был сильным IT-ресурсом, наполненным не клоунами, а различными техническими специалистами, у которых тоже были интересные проекты и которые занимались различными полезными делами, вроде написания технической литературы, мануалов и гайдов. Ещё они переводили документацию и man-странички, на которые до сих пор натыкаешься при поиске в Google. А сейчас что? Наверное все те, кто мог что-то делать полезное, просто покинули OpenNET.

Собственно, к чему это всё? Я не хочу чтобы ЛОР когда-нибудь постигла судьба OpenNET’а, чтобы его сегодняшняя публика выродилось в то, во что она выродилась на этом ресурсе. Неужели подобные метаморфозы – естественный процесс эволюции русскоязычных IT-сообществ?

 , , , ,

EXL
()

Loop Hero

Форум — Games

В кои-то веки российский Indie-игропром породил компьютерную игру, которая понравилась куче народу и стала весьма популярной в Steam, YouTube и Twitch. Вдвойне интересно то, что это игра весьма непопулярного Nerd-жанра «рогалик», западный игрожур не стесняется в высказываниях и называет эту игру одним из лучших когда-нибо созданных Roguelike и даже возродителем этого жанра.

https://store.steampowered.com/app/1282730

Разработчики завезли нативную версию под Linux, а треда на ЛОРе до сих пор о ней всё ещё нет, непорядок.

P.S. Графика в игре по стилю мне почему-то напоминает помесь творчества H. R. Giger с некоторыми элементами славянской мифологии.

 , , loop hero, ,

EXL
()

Почему Huawei ничего не предпринял после ситуации с CentOS?

Форум — Talks

Для тех, кто в танке, напомню предысторию: CentOS всё | CentOS 8 станет CentOS Stream.

TL;DR: Не так давно Red Hat похерил идею CentOS, дропнул срок поддержки дистрибутива CentOS 8 с 2029 до 2021, после чего куча коммерческих компаний начала заявлять о создании схожих по философии с CentOS дистрибутивов. Некоторые давно подсуетились, чтобы в случае чего занять место на рынке, например, довольно агрессивный Oracle со своим OL: https://linux.oracle.com/switch/centos/

Так вот, у Huawei очень давно имеется дистрибутив EulerOS, который базируется на CentOS. Ещё он является единственным более-менее современным дистрибутивом Linux, который сертифицирован The Open Group и может считаться тем самым православным UNIX’ом.

Измени они свою полтику на ту, что используется в OL от Oracle, и они могли бы вполне себе набрать аудиторию и даже занять какую-то часть вот этого громадного рынка Linux-серверов: https://w3techs.com/technologies/details/os-linux, где CentOS идёт вровень с Debian после Ubuntu.

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

Однако со стороны Huawei вроде как было полное молчание, несмотря на то, что их дистрибутив EulerOS напрямую зависит от этого судьбоносного решения RedHat.

Хочется услышать ваши соображения на этот счёт.

 , , , ,

EXL
()

Опыт объединения Java, JavaScript, Python и Ruby с использованием GraalVM

Форум — Development

В ноябре этого года вышел более-менее стабильный LTS-релиз GraalVM 20.3.0 от Oracle и я решил с ним поэкспериментировать. Для тех кто не в курсе, GraalVM позволяет использовать в едином окружении различные популярные языки программирования и обеспечивает их разностороннее взаимодействие в рамках некоторой общей среды выполнения. Платформа GraalVM вместе с исполняемой программой на смеси самых разных языков может быть представлена в виде автономного и самодостаточного исполняемого файла, либо работать поверх OpenJDK, Node.js или даже внутри Oracle Database. Наглядная схема из официальной документации:

https://www.graalvm.org/docs/img/graalvm_architecture.png

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

  • Java, Kotlin, Scala и других языков JVM-платформы.
  • JavaScript вкупе с Node.js и сопутствующим инструментарием.
  • C, C++, Rust и других языков, которые могут быть скомпилированы в LLVM bitcode.

Экспериментальная поддержка заявлена для Python, Ruby, R и WebAssembly.

Собственно, хватит лирики, вот простенький прототип, использующий из экосистем JavaScript, Python и Ruby батарейки, реализующие server-side подсветку синтаксиса фрагментов исходного кода. Подобные библиотеки с богатым охватом языков программирования, которые они могут подсвечивать, отсутствуют на JVM-платформе:

// Highlighter.java, no comments, no checks.
// $ javac Highlighter.java
// $ jar -cvfe highlighter.jar Highlighter *.class
// $ cat hello.py | java -jar highlighter.jar rouge python
import org.graalvm.polyglot.Context;

import java.io.File;
import java.io.FileNotFoundException;

import java.util.Scanner;

public class Highlighter {
  private abstract class Highlight {
    protected final Context polyglot =
      Context.newBuilder("js", "python", "ruby").allowAllAccess(true).allowIO(true)
        .build();

    protected abstract String language();
    protected abstract String renderHtml(String language, String rawCode);

    protected String execute(String sourceCode) {
      try {
        return polyglot.eval(language(), sourceCode).asString();
      } catch (RuntimeException re) { re.printStackTrace(); }
      return sourceCode;
    }

    protected void importValue(String name, String value) {
      try {
        polyglot.getBindings(language()).putMember(name, value);
      } catch (RuntimeException re) { re.printStackTrace(); }
    }
  }

  private class Hjs extends Highlight {
    @Override
    protected String language() { return "js"; }

    @Override
    public String renderHtml(String language, String rawCode) {
      importValue("source", rawCode);

      String hjs = "";
      try {
        hjs = new Scanner(new File("highlight.min.js")).useDelimiter("\\A").next();
      } catch (FileNotFoundException fnfe) { fnfe.printStackTrace(); }

      final String renderLanguageSnippet =
        hjs + "\n" +
        "hljs.highlight('" + language + "', String(source)).value";
      return execute(renderLanguageSnippet);
    }
  }

  private class Rouge extends Highlight {
    @Override
    protected String language() { return "ruby"; }

    @Override
    public String renderHtml(String language, String rawCode) {
      importValue("$source", rawCode);
      final String renderLanguageSnippet =
        "require 'rouge'" + "\n" +

        "formatter = Rouge::Formatters::HTML.new" + "\n" +
        "lexer = Rouge::Lexer::find('" + language + "')" + "\n" +
        "formatter.format(lexer.lex($source.to_str))";
      return execute(renderLanguageSnippet);
    }
  }

  private class Pygments extends Highlight {
    @Override
    protected String language() { return "python"; }

    @Override
    public String renderHtml(String language, String rawCode) {
      importValue("source", rawCode);
      final String renderLanguageSnippet =
        "import site" + "\n" +
        "from pygments import highlight" + "\n" +
        "from pygments.lexers import get_lexer_by_name" + "\n" +
        "from pygments.formatters import HtmlFormatter" + "\n" +

        "formatter = HtmlFormatter(nowrap=True)" + "\n" +
        "lexer = get_lexer_by_name('" + language + "')" + "\n" +
        "highlight(source, lexer, formatter)";
      return execute(renderLanguageSnippet);
    }
  }

  public String highlight(String library, String language, String code) {
    switch (library) {
      default:
      case "hjs": return new Hjs().renderHtml(language, code);
      case "rouge": return new Rouge().renderHtml(language, code);
      case "pygments": return new Pygments().renderHtml(language, code);
    }
  }

  public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in).useDelimiter("\\A");
    if (scanner.hasNext()) {
      String code = scanner.next();
      if (!code.isEmpty()) {
        System.out.println(new Highlighter().highlight(args[0], args[1], code));
      }
    }
  }
}

Как видно, тут смешаны сразу четыре разных языка программирования. Утилита принимает на вход stdin в виде текста исходного файла, передаваемые аргументы определяют используемую библиотеку для подсветки и язык фрагмента, затем подсвечивается код и выводится готовый HTML на stdout терминала.

Подсветка фрагментов кода на стороне сервера лишь простейший пример использования библиотек, которые недоступны для определённой платформы, но доступны на нескольких других. С тем же успехом можно рассматривать какую-нибудь гораздо более полезную научную батарейку, написанную на Python или R, что-нибудь из ML и т. д. Получается, что JVM-платформу со своей кучей библиотек мы можем обогатить батарейками из экосистем других языков программирования и использовать их эксклюзивные библиотеки, альтернативы которых просто недоступны на нашей платформе.

Рецепт установки GraalVM, поддержки языков и библиотек, компиляция и запуск прототипа:

curl -LOJ https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-20.3.0/graalvm-ce-java8-linux-amd64-20.3.0.tar.gz
# curl -LOJ https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-20.3.0/graalvm-ce-java11-linux-amd64-20.3.0.tar.gz
cd /opt/
sudo mkdir graalvm
sudo chown `whoami`:`whoami` graalvm
cd /opt/graalvm/
tar -xvzf ~/graalvm-ce-java8-linux-amd64-20.3.0.tar.gz
rm ~/graalvm-ce-java8-linux-amd64-20.3.0.tar.gz

export GRAALVM_HOME=/opt/graalvm/graalvm-ce-java8-20.3.0
export JAVA_HOME=$GRAALVM_HOME
export PATH=$GRAALVM_HOME/bin:$PATH

gu install python
gu install ruby
# /opt/graalvm/graalvm-ce-java8-20.3.0/jre/languages/ruby/lib/truffle/post_install_hook.sh

graalpython -m ginstall install setuptools
curl -LOJ https://github.com/pygments/pygments/archive/2.7.3.tar.gz
tar -xvzf pygments-2.7.3.tar.gz
cd pygments-2.7.3/
graalpython setup.py install --user
cd ..
rm -Rf pygments-2.7.3/ pygments-2.7.3.tar.gz

gem install rouge

curl -LOJ https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.4.1/highlight.min.js

javac Highlighter.java
jar -cvfe highlighter.jar Highlighter *.class

cat hello.py
#!/usr/bin/env python
print("Hello, World!")

cat hello.py | java -jar highlighter.jar hjs python
<span class="hljs-comment">#!/usr/bin/env python</span>
print(<span class="hljs-string">"Hello, World!"</span>)

cat hello.py | java -jar highlighter.jar rouge python
<span class="c1">#!/usr/bin/env python
</span><span class="k">print</span><span class="p">(</span><span class="s">"Hello, World!"</span><span class="p">)</span>

cat hello.py | java -jar highlighter.jar pygments python
<span class="ch">#!/usr/bin/env python</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">"Hello, World!"</span><span class="p">)</span>

Благодаря поддержке AOT-компиляции в GraalVM можно даже собрать автономный нативный исполняемый файл из JAR-пакета:

sudo yum install gcc glibc-devel zlib-devel libstdc++-static

gu install native-image
# gu rebuild-images polyglot libpolyglot

native-image --language:js -jar highlighter.jar

cat Highlighter.java | ./highlighter hjs java

Вместо Java VM там будет использована легковесная и низкоуровневая Substrate VM, но с преимуществами JIT-компилятора в случае AOT придётся попрощаться. Зато запуск просто молниеносный, как у всех нативных программ. Стоит отметить, что пока у меня удалось сформировать подобный исполняемый файл лишь для связки JavaScript + Java. Создание подобных нативных образов довольно продолжительная и ресурсоёмкая операция, особенно по памяти. Для сборки примера потребовалось где-то 6 GB RAM, а в более сложных случаях требуется и целых 20 GB RAM.

Прототип постепенно оброс разной функциональностью и благодаря фреймворку Spring, который вполне себе работает на платформе GraalVM, превратился в простенький pastebin-сайт на котором можно обмениваться фрагментами исходного кода.

Все исходники и рецепты я выложил на GitHub: https://github.com/EXL/CodePolyglot
На Хабре имеется скучная и длинная статья про мои изыскания, может кому-нибудь будет интересно её почитать: https://habr.com/ru/post/534044/
Потыкать палочкой прототип в виде сайтика на GraalVM и Spring Boot можно тут: https://code.exlmoto.ru/
Примечание: не факт, что я долго буду держать сайт в онлайне, так что не рассчитывайте сохранять там что-то ценное.

Мне интересно ближайшее будущее GraalVM, похоже Oracle настроен очень серьёзно. Пока проект позиционируется им как альтернативная и идеальная платформа для микросервисов, но уже сейчас его разработка имеет влияние и на классический OpenJDK, например, в релизе JDK 15 была дропнута поддержка JavaScript-движка Nashorn, а в качестве его замены Oracle предлагает попробовать именно GraalVM. Кто знает, вдруг GraalVM в будущем будет предлагаться в качестве рекомендуемой JVM-платформы по умолчанию вместо OpenJDK? Время нам покажет.

Предлагаю обсудить эту грандиозную затею Oracle, пригодится ли кому-нибудь использовать все эти фичи GraalVM на практике? На официальном сайте платформы есть интересное заявление о том, что наша отечественная социальная сеть «Одноклассники» уже использует GraalVM в продакшене для server-side рендеринга React.js, что позволяет добиться хорошей отзывчивости на медленных интернет соединениях.

P.S. Поздравляю с наступающим Новым Годом анонимных и зарегестрированных пользователей ЛОРа. Счастья и крепкого сибирского здоровья вам, ребята!

 graalvm, , , ,

EXL
()

Что-нибудь слышно про Jython 3 или IronPython 3?

Форум — Development

Господа, может кто использует эти проекты?

Никто не в курсе как там у них идет разработка 3 ветки Python? Насколько активно, будет ли релиз в ближайшие пару лет?

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

 , , ,

EXL
()

Quake II Dedicated Server сопряжение перезапуска с systemd

Форум — Games

Как известно, сервер для Quake II нуждается в периодическом рестарте:

One thing to keep in mind is that the server must be restarted at least every 49 days, because the Quake II network protocol represents the interal time as a 32 bit integer and after 49 days that integer overflows, leading to all kinds of trouble.

This problem has always existed in Quake II and is not fixable (at least not without breaking compatibility with the existing network protocol), but back in Win9x days this was less of a problem because Windows crashed frequently anyways and Win9x had the same bug and crashed after 49 days or so...

Как это можно сделать красиво?

Я сделал через crontab, вроде такого:

0 0 1 * * /usr/bin/systemctl restart q2ded

Но интересует, существуют ли более элегантные решения?

ENV: CentOS 7, systemd 219.

q2ded.service:

[Unit]
Description=Quake II Server
Wants=network-online.target
After=network.target network-online.target

[Service]
User=opc
WorkingDirectory=/srv/quake2
ExecStart=/usr/bin/stdbuf -i0 -o0 -e0 /srv/quake2/q2ded
StandardOutput=journal
StandardError=journal
SyslogIdentifier=q2ded
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target

 , ,

EXL
()

GitHub похоже начал процесс переименовывания master на main

Форум — Talks

Уже обсуждали? Я думал спустят эту хрень на тормозах, ан нет!

При создании нового репозитория теперь:

…or create a new repository on the command line

echo "#BlackLivesMatter" >> README.md
git init
git add README.md
git commit -m "First commit to the our Trans Community! ^_~"
git branch -M main                                                   <=========== !
git remote add origin git@github.com:eat/shit.git
git push -u origin main                                              <=========== !  

…or push an existing repository from the command line

git remote add origin git@github.com:eat/shit.git
git branch -M main                                                   <=========== !
git push -u origin main                                              <=========== !

ШТОШ, ждем когда начнется добровольно-принудительная кампания по смене ветки master на main в наших существующих репозиториях. Угрозы-то будут? Вроде таких: «да ты используешь ветку master, ъуъ сука расист!»

Update, 30-Mar-2021: Уже и в ванильный git рекомендация добралась. Скоро видимо master-ветку отменят: GitHub похоже начал процесс переименовывания master на main (комментарий)

 blm, , , идиократия

EXL
()

Скриншоты рабочих окружений известных в тусовке UNIX-like людей

Форум — Talks

Собственно, суть: один шведский блогер (в хорошем смысле этого слова) как-то попросил именитых людей мира UNIX-like показать свой рабочий стол и окружение и дать пару комментариев насчёт него:

https://anders.unix.se/2015/10/28/screenshots-from-developers--unix-people-2002/

На ЛОРе уже мелькала несколько раз эта ссылка: [1], [2]; однако обновление опроса, которое в 2015 году сделал этот же блоггер, к сожалению, осталось незамеченным и прошло без обсуждения.

https://anders.unix.se/2015/12/10/screenshots-from-developers--2002-vs.-2015/

Собственно, исправляем ситуацию. По ссылкам выше можно посмотреть как выглядели в 2002 и 2015 годах рабочие окружения именитых людей:

  • Dennis Ritchie (creator of C, co-creator of Unix)
  • Brian Kernighan (Unix legend, the K in K&R and AWK)
  • Richard Stallman (creator of GCC, GDB, GPL, FSF, etc.)
  • Bram Moolenaar (author of Vim)
  • Rasmus Lerdorf (creator of PHP)
  • Matthias Ettrich (founder of the KDE and LyX projects)
  • Warren Toomey (Unix historian)
  • Jordan Hubbard (FreeBSD co-founder, later Director of UNIX Technology at Apple)
  • Jon “maddog” Hall (Linux International, Open Source Initiative)
  • Luke Mewburn (then NetBSD core team member)
  • Timothee “TTimo” Besset (then id Software’s Linux port maintainer)
  • John Baldwin (then FreeBSD core team member)
  • Rob “CmdrTaco” Malda (co-founder of Slashdot)
  • Jun-ichiro “itojun” Hagino (IPv6 & BSD hero)
  • Michael Lesk (SMART, Lex, UUCP)

К превеликому сожалению Dennis Ritchie и itojun покинули нас и поэтому их скриншоты в новую подборку не смогли войти.

 , , , ,

EXL
()

Chrom{e,ium} на Wayland можно попробовать в два клика уже сейчас

Форум — Talks

Если кто-то интересовался что там, как и чего ожидать в будущем. Так вот, для страждущих, кому уже не терпится попробовать:

https://download-chromium.appspot.com/?platform=Linux_x64&type=snapshots (130 MiB)

unzip chrome-linux.zip
cd chrome-linux/
./chrome --ozone-platform=wayland --enable-features=UseOzonePlatform --user-data-dir=/tmp/chrome-wayland

Анимации плавненькие, графика без тиринга, не единого разрыва, вот тут вообще красота, любо-дорого стало смотреть: https://phoboslab.org/wipeout/

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

P.S. Сборки идут прямо из транка, поэтому могут быть странные глюки.

 , , ozone,

EXL
()

Пал один из последних оплотов Mercurial (Hg)

Форум — Talks

!Ъ: Разработка OpenJDK переведена на Git и GitHub

Кто там остался из релевантных на ртути? Mozilla Firefox и SDL2?

– SDL2 (update 10-Feb-2021):

Главный разработчик SDL2 заявил, что они переезжают с Mercurial (Hg) и Bugzilla на Git и GitHub.

Получается, остались лишь Firefox да Nginx?

 , , , ,

EXL
()

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