ZeroNet Blogs

Static ZeroNet blogs mirror

ZN vs Firefox

- Posted in Микроблог Balancer'а by with comments

Печалька. ZN не работает в Firefox 20.0 :)

Lucid_Lynx_29_12_2018_00_03_49.png (1280x919)

Привет! Эта запись пишется в Haiku, установленной на ноутбуке. ZeroNet взят из git. Для его запуска понадобилось поставить пару модулей через pip, с указанием библиотеки сетевых функций:

-> LIB=-lnetwork pip install msgpack gevent

zeronet-haiku.png (1366x768)


Сам текст набирается в консольной версии emacs, с включённым flyspell-mode. Правда, чтобы это стало возможным, мне пришлось внести правки в порты aspell и emacs.

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

Апология

Зачем? Если ответить лаконично, то я чувствую, что как программист я давно не нужен Linux'у. Linux уже продолжительное время не испытывает недостатка ни в фичах, ни в разработчиках. Haiku напротив, остро нуждается в поддержке.

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

Например, я пользуюсь Emacs (а до этого -- Vim) не потому, что это лучший редактор на свете (хотя наверное, это близко к действительности). А просто потому, что изучение таких вещей как Vim и Emacs не даёт расслабиться. Хотя, если вы ищете прагматической пользы, то и она при желании, конечно же, найдется. Но для меня необходимости в таком поиске -- нет.

screenshot2.png (1366x768)

Итак, моя апология проста -- Haiku интересная ОС!

Меня заинтересовала система и я начал её изучать. В этом смысле, какие-то проблемы и ошибки воспринимаются не как препятствие, а как лишний повод помочь проекту.

Миниатюрность

Haiku обладает изяществом. На моём далеко не новом ноутбуке установлена Ubuntu и Haiku. Давайте замеряем скорость загрузки.

-> shutdown -r
# прошло немного времени...

Ubuntu загружалась 30 секунд до GDM и еще где-то 7 секунд до рабочего стола. Haiku загрузилась до рабочего стола примерно за 20 секунд.

У меня есть второй древний ноутбук на Pentium. Haiku стартует на нём примерно за те же 20 секунд.

Haiku не поддерживает никакого режима сна. Но скорость загрузки (и моментальное выключение) это частично компенсирует.

Я уже писал, что исходные коды системы занимают пару сотен мегабайт.

Я был не вполне прав. Часть редко изменяемых компонентов (например, WebKit) поставляются в виде готовых собранных пакетов, что сильно ускоряет сборку. Тем не менее, как и в случае с BSD, вся система представляет из себя единый проект, что упрощает её изучение.

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

Итак, система миниатюрна. Но ей вполне можно пользоваться на реальном железе (если, конечно, заработает ваше оборудование). Откровенно говоря, я всё еще испытываю проблемы с некоторым железом. Что, правда, не мешает мне пользоваться этой ОС.

Однопользовательская система

Да, система однопользовательская. Да, можно написать rm -rf / и я думаю, это приведёт к проблемам, так как сотрёт пакеты и на следующей загрузке они не подмонтируются. С другой стороны, в Unix можно стереть свой домашний каталог, а это ведь и есть самые важные файлы в системе. :)

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

Впечатления от использования

Пользоваться системой можно. Типовые программы, которыми я пользуюсь чаще всего:

  • терминал;
  • emacs (flyspell, w3m);
  • Браузеры Qupzilla и Dooble (в целом, адекватны современному интернету);
  • Telegram клиент;
  • Vision (irc клиент);
  • LibreOffice;
  • ZeroNet;
  • qbittorrent;
  • MediaPlayer;
  • Mail;
  • INSTEAD.

Чего нет, и я это заметил:

  • gimp (вообще, нет ничего gtk-шного, так как этот тулкит не перенесён. Но есть Krita);
  • inkscape;
  • darktable;
  • firefox.

В плане энергопотребления, система ест точно не больше Ubuntu.

Пакеты и обновление системы

Я переключился на ночные сборки репозиториев. Это можно сделать через GUI или прямо в консоли. После этого, обновление делается просто:

-> pkgman update
-> shutdown -r # если обновилась система

Я уже писал, что установка пакета -- это его монтирование. Это, кроме красоты, несёт и полезное свойство -- возможность откатываться к прошлым состояниям. Например, после одного из обновлений системы, мой второй ноутбук стал виснуть на загрузке. Чтобы вернуться к рабочему состоянию, я просто нажал "пробел" в момент работы загрузчика и выбрал предыдущее состояние из списка... То-есть, система поддерживает журнал состояний системы в смысле установленных пакетов. Правда, если этот журнал разростётся, это начнёт замедлять работу загрузчика.

Состояния записываются в /boot/system/packages/administrative и вы можете их почистить.

Часто бывает нужно заменить какой-то один из компонентов пакета. Например, драйвер. Для этого предусмотрен каталог /boot/system/non-packaged. Например, таким образом я отлаживал драйвер wifi. Чтобы не пересобирать всю систему, я собирал только драйвер и клал его в non-packaged.

Разработка портов

sopwith.png (1366x768)

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

Вы забираете дерево haikuports и haikuporter из github. Читаете инструкцию и вот, вы уже готовы собирать пакеты из исходников.

Если нужно изменить какой-то пакет, то к вашим услугам функции haikuporter по автоматическому созданию патчсетов. Добавить новый порт -- тоже не проблема. Дальше -- делаем PR и ждем...

Есть, конечно, свои нюансы и вопросы:

  • как должна выглядеть структура каталогов пакета;
  • как создать векторную иконку;
  • где хранить настройки программы;
  • и т.д.

Но во всём этом несложно разобраться, а описание процесса создания пакета -- отдельная история.

В качестве примера, вот как выглядит рецепт для INSTEAD.

К счастью, когда я писал эту статью появилась подробная статья по портам от EXL. Вы можете прочитать её здесь.

Сборка системы

Систему очень просто собрать. Причём сделать это можно как изнутри самой Haiku, так и на Linux-машине. Во втором случае вам придётся собрать сначала тулчейн. Но сделать это нужно будет один раз. Сборка на Debian не вызвала проблем. На i7 она прошла довольно быстро. Для собрки образа, который можно записать на флешку используйте цель @nightly-anyboot.

-> jam -q @nightly-anyboot

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

-> jam -q iprowifi4965
-> cp objects/haiku/x86_64/release/add-ons/kernel/drivers/network/wlan/iprowifi4965/ipro
wifi4965 /system/non-packaged/add-ons/kernel/drivers/bin/iprowifi4965

Вот и весь цикл разработки. В общем, это всё создаёт приятное ощущение того, что ты владеешь системой. То чувство, которого почти не осталось в Linux. Я приведу пару примеров.

Пример 0: xhci

Когда я только поставил систему на ноут и сделал:

-> tail -f /var/log/syslog

То увидел постоянные сообщения от ядра системы... Мне это не понравилось. Я скачал исходный код и нашёл сообщения в коде. После этого я собрал haiku.hpkg с отладочными сообщениями xhci и начал искать проблему. Довольно быстро удалось найти ошибку и исправить её.

Кстати, это не тот syslog, что используется в Unix. Например, в него сохраняются сессии из отладчика ядра KDL.

Пример 1: iprowifi2100

После того, как я поигрался с гаечкой на своем основном ноутбуке, я попробовал поставить её на другой древний ноутбук. К сожалению, система намертво зависала на загрузке. Покопавшись несколько дней, я нашёл несколько проблем и исправил их. Интересно, что одна из проблем оказалась регрессией в кодовой базе FreeBSD. Драйвер iprowifi210, как и остальные сетевые драйверы, работает в Haiku через прослойку совместимости.

Теперь адаптер iprowifi2100 снова работает во FreeBSD и в Haiku.

Пример 2: почта

Встроенная в Haiku почта работает довольно занятным образом. Почта забирается специальным демоном mail_daemon:

~> launch_roster info x-vnd.be-post

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

mail-attr.png (832x436)

Если вы выберете какое-то из сообщений -- откроется программа просмотра (и написания) почты. Красиво и просто.

К сожалению, почта у меня не работала с mail.ru и частенько валилась. После марафона отладки появилась серия патчей, которая позволяет мне пользоваться почтой на постоянной основе.

Отладка

Если ядро по какой-то причине упадёт, то вы попадаете в отладчик уровня ядра. Вы можете вызвать его и без ожидания падения, конечно. Для этого нажмите: alt+PrtSc+d. Для продолжения работы наберите cont. Я не буду подробно описывать отладчик. Если вы разработчик уровня ядра, то разберётесь. Я просто упоминаю сам факт наличия этого отладчика из коробки. Это здорово!

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

segfault-mail.png (1366x768)

В общем, установив систему, вы сразу готовы к полезной деятельности. ;)

Рассмотрение патчей

Патчи для Haiku (ядро и окружение) принимаются через систему gerrit по адресу: https://review.haiku-os.org,

screenshot4.png (1366x768)

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

Но на самом деле gerrit оказался удобной и полезной штукой. Кратко, алгоритм действия такой:

  • Регистрируетесь на https://review.haiku-os.org
  • Добавляете свой открытый ssh ключ
  • Забираете проект git clone ssh://user@git.haiku-os.org/haiku
  • Далее, можно пустить бранч и делать изменения
  • $ git commit
  • $ git push origin HEAD:refs/for/master

Далее, вам могут написать замечания, которые вы отрабатываете.

  • Отработали замечания
  • $ git commit -a --amend
  • Убедиться что в комментариях к коммиту есть "Change-Id: ID тикета в gerrit"
  • $ git push origin HEAD:refs/for/master

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

Также будет полезен Development FAQ.

Вместо заключения

Эта статья -- долгострой. Она планировалась совсем другой. Более подробной и интересной, но... Идеальная статья, написанная никогда все-таки хуже несовершенной, но написанной сейчас. Поэтому я собрал волю в кулак и дописал статью до более-менее завершённого состояния.

Мы живём в мире, где ценность принято мерить коммерческой эффективностью. Я лично не разделяю такого взгляда на мир. История развития ИТ знает много примеров, когда отличные, красивые решения были вытеснены громоздкими и уродливыми продуктами. Похожие вещи можно найти и в других сферах человеческой деятельности... Так или иначе, Haiku -- очень интересная система, которой не хватает внимания свободных разработчиков. И кто знает, может быть, вы и есть такой разработчик? :) И если моя статья вас заинтересовала -- я достиг своей цели.

Changelog: December 13, 2018

- Posted in ZeroBlog by with comments

Rev3739

  • Multilanguage, self hosted documentation with ongoing Fr/Zh translation + ZeroNet mirror: https://www.zerogate.tk/1DocsYf2tZVVMEMJFHiDsppmFicZCWkVv1 [Thanks to Lola, blurHY]
  • Fix sandbox escape vulnerability [Thanks, reported by ivanq/ZeroLSTN]
  • Restrict script execution by using Content security policy: It prevents code execution in case of sandbox escape/html injection.
  • Make Sidebar, Multiuser, UiConfig, UiPassword plugin compatible with hardened security changes.
  • Use chromedriver for testing as phantomjs does not supports sites with new content security policy.
  • Auto escape variables in template underscore helper
  • Cleanup entries older than 6 month from charts.db
  • New certList admin API call
  • Don't delete optional files from owned sites
  • Fix signing when --data_dir contains window-style path separators.
  • Fix setLocalStorage call before websocket connection is created
  • Fix saving user mutes
  • ZeroFrame.js 1.3.0: Support monkey patching Fetch API

I started the modifications that will be necessary to move ZeroNet codebase to Python 3. This will also include other major changes:

  • Move sqlite database connection to separate thread: make the UI more responsive and avoid blocking on db heavy operations (eg. rebuilding)
  • New database sync mode: Avoid db corruption on power loss or hw error
  • Support libsecp256k1: ~10x speed boost in file and certificate validation
  • Remove included third-party Python libraries (src/lib)
  • Update source code from ZeroNet by default

If everything goes well, then ETA: 2-3wk

Есть, всё же, такое ощущение стабильности, которое может порождаться только годами информационных потерь. Можно смело давать ссылки на чужие ZN-ресурсы, понимая, что пока жив твой ресурс, то и ссылки на чужие, скорее всего, будут живы. Не превратятся через год-пять-десять в тыкву. Это очень позитивное ощущение :) Которое сильно сближает, сколь бы анонимен тот, на кого ссылаешься, не был.

Рождено алкогольными парАми в посте о пиксельной графике.

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

А вот нынешние дети формировались уже в среде реалистичного отображения. И для них такое упрощение — это именно art-эффект. Поэтому у них так и популярны Minecraft и пиксельная графика. Это для них компьютерная экзотика, форма эскапизма :)

2117438874.jpg (727x727)

Это я вспомнил сейчас, после того, как писал про пиксельную графику, что дочка делала

Протрезвею, может, пополню пост и запощу в Храм Информационного Фронтира :)

WS2812 and children :)

- Posted in DIY@Balancer by with comments

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

Sorry for a hell of a mixture of Russian and English, but I still do not know how I better do a bilingual blog. And in order to divide the blog into two in different languages there is not enough material. And then I will definitely be lazy to translate it into English :)

Ещё весной я заказал для тестов китайскую светодиодную матрицу на базе светодиодов WS2812b. Это на которых RGB-ленты делают, в которые данные по одному проводочку грузятся и каждый светодиод своим цветом зажигается. Тогда я не мудрствуя лукаво прицепил матрицу к уже готовой ESP8266, которой рулил светодиодной лентой, написал простейший код для вывода плоских битмапов в шестнадцатеричном виде и надолго забыл.

Back in the spring, I ordered a Chinese LED matrix based on WS2812b for testing. These are on which RGB tapes are made, in which data on one wire is loaded and each LED lights up in its own color. Then, without further ado, I hooked the matrix to the ready-made ESP8266, which I was driving with LED tape, wrote the simplest code for outputting flat bitmaps in hexadecimal and forgot for a long time.

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

My daughter is sick now, physical exertion is excluded, I didn’t take a special walk down the street - I started to figure out what to do. I remembered this matrix. First, together with it, they put the matrix and the solderless breadboard on the hot-melt glue on the Lego part, so that you can assemble a more or less stable structure:

07-6949953-20181207-113655.jpg (1200x900)


Дальше была идея показать ей, как делать картинки формата 8x8 в спрайтовом редакторе, экспортировать в шестнадцатеричном виде и грузить их в программы на Lua в ESP8266. Но я же зануда. Я ей с очень низкого уровня показал, как программируют на Lua, что такое двоичный и шестнадцатеричный код, что такое RGB и как шестнадцатеричные цифры превращаются в пиксели. Внезапно дочка вместо работы через редактор стала редактировать с телефона картинки прямо в шестнадцатеричном виде :D Вот так:

Next was the idea to show her how to make 8x8 pictures in the sprite editor, export in hexadecimal and load them into Lua programs in ESP8266. But I'm a bore. I showed her from a very low level how to program on Lua, what a binary and hexadecimal code is, what RGB is and how hexadecimal numbers turn into pixels. Suddenly, instead of working through the editor, the daughter began to edit the pictures from the phone directly in hex :D Like this:

07-6950477-2018-12-07-17-00-10.png (1194x498)

07-6950477-20181207-170150.jpg (1200x900)

А сегодня пошла и записала ролик на YouTube (про матрицу — с 0:55)

And today she recorded a video on YouTube (about the matrix - from 0:55)

https://youtu.be/U6rPl9CT38I

2018-12-11_01-47-03.jpg (1212x898)

Забавно получилось — дочка устроила стресс-тест «Web-IDE». Оказывается, если там много файлов в ФС (штук под 40), то для формирования HTML-страницы не хватает памяти и NodeMCU уходит в рестарт. Т.е. понаписала файлов с картинками, а потом больше запускать их не смогла. При попытке открыть в браузере IDE, микроконтроллер сразу уходит в рестарт. Мне сегодня костылять пришлось, пока просто ограничил тупо число выводимых файлов, потом надо будет или переписать на поблочный вывод, или с разбивкой на страницы.

It turned out funny - the daughter arranged a stress test for the "Web-IDE". It turns out that if there are a lot of files in the FS (40 pieces), then there is not enough memory to form the HTML page and the NodeMCU goes to restart. My daughter wrote a lot of files with pictures, and then she couldn’t run them anymore. When you try to open the IDE in the browser, the microcontroller immediately goes into restart. Today I had to dirty fix, until I just stupidly limited the number of output files, then I would have to either rewrite it by block output, or paginated.

pandoc без ghc

- Posted in Flood@Balancer by with comments

​​​​​​​2018-12-09_19-13-58.png (674x396)

Жена на сайте делает ссылки на разделы в виде картинок. И накладывает на них надписи вручную в графическом редакторе:

2018-12-08_13-37-47.png (0x0)

Сейчас ей, похоже, надоело и она спросила, нельзя ли это как-то автоматизировать :)

Пишет страницы она в Grav'е в разметке Markdown. Понятно, что при этом можно делать вставки на чистом HTML и написать что угодно, но это не спортивно! Мне давно интересно реализовывать что-то расширенное в рамках синтаксиса и идеологии Markdown.

Картинки в Markdown вставляются с таким синтаксисом:

![](http://ссылка)

Или, в неурезанном варианте:

![Alt-текст](http://ссылка)

Ага! Первое же, что приходит в голову, использовать Alt-текст для визуального вывода поверх картинки. Ну и сама картинка может быть произвольного формата, а выводить нужно в фиксированном размере, в нашем случае 250x200px. Укажем всю эту обработку, задав CSS-класс картинки:

![Лабораторные животные](lab-mouse.jpg){.cover}

Транслируется оно в HTML вида:

<img src="lab-mouse.jpg" alt="Лабораторные животные" title="" class="cover">

Оформление

Сперва опишем лимит размера картинки. Делаем её без полей, вписывая и обрезая лишнее в 250x500. Это сегодня совсем просто:

img.cover {
    width: 250px;
    height: 200px;
    object-fit: cover;
}

А вот дальше — сложнее. Вытащить поле alt из img средствами CSS невозможно. Нужно переходить к JavaScript. На том же jQuery поле alt достаётся в одно действие. И, раз мы уже это делаем, то оформим картинку с подписью в рамках современных стандартов. Сегодня это рекомендуется делать примерно так:

<figure>
  <img src="image.jpg" alt="Картинка">
  <figcaption>Заголовок картинки</figcaption>
</figure>

Поехали:

$('img.cover').each(function()
{
    var img=$(this);
    var alt = img.attr('alt');
    img.wrap("<figure class=\"cover\"></figure>");
    img.after("<figcaption>"+alt+"</figcaption>");
});

Готово. Теперь после загрузки страницы текст из поля alt рисуется под картинкой в виде:

<figure class="cover">
    <img src="lab-mouse.jpg" alt="Лабораторные животные" title="" class="cover"> 
    <figcaption>Лабораторные животные</figcaption>
</figure>

Осталось только раскрасить надпись и наложить её поверх картинки:

figure.cover {
    position: relative;
    width: fit-content;
    display: inline-block;
}

figure.cover figcaption {
    position: absolute;
    bottom: 0;
    color: white;
    font-size: 24px;
    padding: 0 4px 4px 4px;
    display: block;
    width: 100%;
    text-align: center;
    text-shadow: 2px 2px 8px rgba(0, 0, 0, 0.9), 0 0 2em rgba(0, 0, 0, 0.7);
    line-height: 1.0;
}

Результат:

​​​​​​​​​​​​​​2018-12-08_14-13-45.jpg (786x215)