Pages: 1 2
RSS
# Re: Plan 9: экстремальный KISS #1
std.hugeping
hugeping(ping,1) — Difrex
2020-10-28 16:24:44


Difrex> Кстати, а нет ли порта bash под plan9?

Я этого не знаю, но заменять rc, в котором преодолены проблемы bash (и очень изящно) снова на bash - не имеет смысла по-моему. :)

http://doc.cat-v.org/plan_9/4th_edition/papers/rc посмотри здесь раздел Quotation, и сравни с тем же bash. Да в bash ад, просто, на фоне простоты rc!

# Re: Ставлю цели на лето и копаюсь в себе (+org-mode)
pipe.2032
hugeping(ping,1) — vvs
2020-10-27 12:57:13


vvs> Поэтому меня крайне удручает тот факт, что я не вижу способа объективно оценить философские критерии, такие как материализм и идеализм.

А я воспринимаю это как ещё один "признак" того, что Богом нам дана свобода. Если, под давлением фактов (например, Земля была бы центром Вселенной) или логики ты вынужден поверить в то, что Бог сотворил мир и нас в нём, какой в этом смысл? Бог к сердцу обращается.

А так, кто то может считать что Земля это центр (антропный принцип), кто то - флуктуациями материи, на которые слепой вселенной наплевать. И выбор этот обусловлен не одним лишь разумом. Разум идёт вслед.

# Re: Ставлю цели на лето и копаюсь в себе (+org-mode)
pipe.2032
hugeping(ping,1) — vvs
2020-10-27 08:27:10


vvs> Боюсь, что и сравнение науки с религией тоже слишком искусственно.

Ну, беседа уже зашла в дебри. Я вообще спорю только против нападок со стороны "научного мировоззрения" на религию. Причём против "грубых" и "вульгарных" форм материализма. Даже писал на эту тему: ii://CVvGRZBv7ZzMIm0TFWeY

Сам я считаю, что, например, трудную проблему сознания решать "материалистично" не получится. Что познание - многогранно и т.д. Но я это не навязываю. Нервничаю только на заведомо грубые упрощения.

# Re: Ставлю цели на лето и копаюсь в себе (+org-mode)
pipe.2032
hugeping(ping,1) — vvs
2020-10-26 16:17:10


vvs> Вы ломитесь в открытую дверь. Я нигде не утвердал, что они друг друга отрицают. Как раз вопрос был в другом: как отличить религию в науке? Несмотря на другие отличия у них достаточно и общих вопросов. Я утвердал и утвердаю, что единственным надежным критерием являются методы исследований. Философские взгляды конкретных исследователей слишком субъективны.

А я пока запилил более нормальное квотирование, а то непонятно уже было кто что написал и кто кого зацитировал. :)

# Re: Ставлю цели на лето и копаюсь в себе (+org-mode)
pipe.2032
hugeping(ping,1) — vvs
2020-10-25 19:57:55


> Ну, тут, как раз, все просто. Ученые - это еще не наука. Все мы люди и полны противоречий. Приведу другую аналогию: коррумпированный юрист. Разве он - это закон?

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

# Re: Ставлю цели на лето и копаюсь в себе (+org-mode)
pipe.2032
hugeping(ping,1) — vvs
2020-10-25 18:40:16


> Задача-то у всех одна - познание мира, а вот философия разная. Наука опирается на материализм, а религия - на идеализм.

Ну тоже не так просто. Во первых, среди учёных были и есть верующие. А так-же просто идеалисты. Например, Пенроуза, похоже, можно отнести к идеалистам.

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

Всё-таки, философия -- не религия. Другое дело, что вера в то, что есть "небо" и "земля" и что будут новые небо и земля, вроде бы предполагает идеализм. Но, кажется, тут не всё так просто. И может быть, даже, не так важно.

# Re: тест меня видо
ping.local
hugeping(ping,1) — oldpc
2020-10-24 18:11:20


> Посмотрю генератор, вдруг там стили интересные :)

Когда я делал "дизайн" ii-go, я заметил что хорошо идут таблицы. Как в старых-добрых 2000-х. То-есть, если у нас табличный дизайн - то и используем их, а не всякие новомодные div с float и бутстрапы. :)

# Re: Plan 9: экстремальный KISS #1
std.hugeping
hugeping(ping,1) — btimofeev
2020-10-24 09:07:04


> Шелл конечно аскетичный, надоедает каждый раз вводить команду заново, особенно когда ФС изучаешь.

Частично помогает " и "". Это показ последней команды (а потом мышка, да) или повтор последней команды.

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

# Re: Ставлю цели на лето и копаюсь в себе (+org-mode)
pipe.2032
hugeping(ping,1) — vvs
2020-10-23 20:21:51


> Идеализм на то и идеализм, что с реальностью имеет мало общего.

Если в философском смысле, то как раз мир идей более реален (идея первичней). Если ты идеалист, конечно.

> Физики делят материю, но конца не находят, а если найдут, то сразу возникнет вопрос: а что же дальше?.

Идея? :)

> Хорошо быть романтиком в молодости, а с возрастом становишься циником.

Становиться циником или нет, всё-таки, зависит в том числе и от нас.

# Re: Plan 9: экстремальный KISS #2
std.hugeping
hugeping(ping,1) — oldpc
2020-10-21 10:54:56


У меня настолько много расплодилось блогов, что я просто пишу теперь в std.hugeping и дублирую на zeronet. Если кому-то нравится, можно перепостить. Но я часто редактирую свои статьи, так что проще просто ссылку кидать на оригинал.

# Plan 9: экстремальный KISS #2
std.hugeping
hugeping(ping,1) — All
2020-10-21 10:07:36


Постепенно осваиваюсь в 9front. Стало понятно, что кое-где есть неточности в предыдущей статье. Но не ошибается только тот, кто ничего не делает! Так что продолжу свой цикл статей про жизнь в форке Plan 9 -- 9front.

http://hugeping.tk/lib/uploads/acme-mail.png

# Простота кода

Мне не повезло. На eeepc 1000px не работал ни wifi ни ethernet. Поэтому мне пришлось портировать драйверы alc и athn с OpenBSD. В случае athn, для скорости, я перенёс только код для своей карты AR2427. Все наработки по Plan9 я выкладываю сюда: https://github.com/gl00my/plan9hacks

Я понимаю, что этот путь доступен не для всех, но хочу отдельно заострить внимание на простоте кода Plan9. Там, где в Linux/OpenBSD написано 10 строк, в Plan9 будет одна.

OpenBSD:
	/*
	 * Create DMA stuffs for TX ring
	 */
	error = bus_dmamap_create(sc->sc_dmat, ALC_TX_RING_SZ, 1,
	    ALC_TX_RING_SZ, 0, BUS_DMA_NOWAIT, &sc->alc_cdata.alc_tx_ring_map);
	if (error)
		return (ENOBUFS);

	/* Allocate DMA'able memory for TX ring */
	error = bus_dmamem_alloc(sc->sc_dmat, ALC_TX_RING_SZ,
	    ETHER_ALIGN, 0, &sc->alc_rdata.alc_tx_ring_seg, 1,
	    &nsegs, BUS_DMA_NOWAIT | BUS_DMA_ZERO);
	if (error) {
		printf("%s: could not allocate DMA'able memory for Tx ring.\n",
		    sc->sc_dev.dv_xname);
		return error;
	}

	error = bus_dmamem_map(sc->sc_dmat, &sc->alc_rdata.alc_tx_ring_seg,
	    nsegs, ALC_TX_RING_SZ, (caddr_t *)&sc->alc_rdata.alc_tx_ring,
	    BUS_DMA_NOWAIT);
	if (error)
		return (ENOBUFS);

Linux:
	alx->descmem.virt = dma_zalloc_coherent(&alx->hw.pdev->dev,
						alx->descmem.size,
						&alx->descmem.dma,
						GFP_KERNEL);

9front:
        ctlr->tx_ring = mallocalign(sizeof(TxDesc) * DSCN, 8, 0, 0);

А вот ещё один очень наглядный пример из ACPI.

Linux:
	args[0] =
	    acpi_ut_create_integer_object((u64)region_obj->region.space_id);
	if (!args[0]) {
		status = AE_NO_MEMORY;
		goto cleanup1;
	}

	args[1] = acpi_ut_create_integer_object((u64)function);
	if (!args[1]) {
		status = AE_NO_MEMORY;
		goto cleanup2;
	}

	args[2] = NULL;		/* Terminate list */

	/* Execute the method, no return value */

	ACPI_DEBUG_EXEC(acpi_ut_display_init_pathname
			(ACPI_TYPE_METHOD, info->prefix_node, NULL));

	status = acpi_ns_evaluate(info);
	acpi_ut_remove_reference(args[1]);

9front:
	p = amlwalk(dot, "^_REG");
	if (p != nil) {
		amleval(p, "ii", 0x3, 1, nil);
	}
Это не шутка, это эквивалентный код. Код из 9front это мой код, который внесён в 9front, который я писал изучая аналогичный код Linux.

Конечно, с одной стороны можно сказать, что это следствие примитивности, но не только. Весь код системы следует этой идее -- не усложнять!

Немного отвлекаясь, хочу рассказать, что похожие эмоции я испытал, когда смотрел код утилиты cat одной из ранних версий Unix. Исходный код делал именно то, что и должна делать утилита cat. Не больше и не меньше. Сегодня же, можно посмотреть на https://www.gnu.org/software/hello/ чтобы убедиться, насколько технологии переусложнены. Кто-то скажет, что это неизбежно. У нас появились локали, gettext, разные варианты системных вызовов и так далее... Всё это, конечно, так. Но... Как программисту, мне хочется спросить -- адекватна ли цена? В общем, архитектурная простота Plan9 сквозит во всём. Plan9 -- не продукт.

Итак, если вы программист (на C) -- проблем с доработками кода не будет. Кодовая база небольшая, доступна в /sys/src из коробки и очень быстро собирается/обновляется по mercurial даже на eeepc. C компилятор (вернее, даже серия компиляторов для разных архитектур) в Plan9 очень быстрый! Я так понимаю, написан он Кен Томпсоном. Система mk (аналог make) -- тоже очень быстрая и лаконичная. Ну, давайте что-нибудь соберём?

# Выход в сеть

Если у вас qemu установка, то сеть скорее всего просто работает. Попробуйте:

cat /net/ndb
ip/ping ya.ru

Я поднимаю wifi руками, скриптом. Мне так удобнее. Делается это очень просто:

bind -a '#l1' /net # l1 это моя wifi карта, cat /dev/kmesg
aux/wpa -s ACCESS_POINT -p /net/ether1 # ether1 моя wifi карта
ip/ipconfig ether /net/ether1 # dhcp

Как посмотреть доступные точки доступа?

cat /dev/ether1/ifstats

На самом деле bind '#l1' я делаю в lib/profile, до старта rio. Помните? У каждого процесса своё дерево файловой системы. А так, все процессы в rio будут наследовать его и /dev/ether1 станет доступным везде.

Дальше, разберётесь. :)

# git/mercurial

В 9front уже входит mercural. Давайте воспользуемся им, чтобы забрать проект 9front ports, там есть много чего полезного. Открываем окно rio. (Или запускаем win в acme).

cd /sys/
hg clone http://code.9front.org/hg/ports
cd 9ports/dev-vcs/git9
mk install

Теперь у нас есть git! На самом деле, есть второй способ сделать это, подмонтировав к себе один из сетевых ресурсов по 9p, например 9front.

9fs 9front
cd /n/extra
lc

Здесь вы найдёте git9.tgz, который можно распаковать и собрать. Для тренировки (и пользы!) предлагаю собрать irc7.tgz из extra. Скопировать себе в $home, распаковать, собрать (mk install) и зайти на канал #instead сервера irc.freenode.net.

Реализация git своя. Конечно, в виде файловой системы. :) Давайте заберём какой-нибудь проект по git. Я предлагаю попробовать собрать браузер netsutf.

cd
mkdir Devel
cd Devel
git/clone https://github.com/netsurf-plan9/nsport
git/clone -- это не опечатка! lc /bin/git/ да...

Ох, чуть не забыл. Все пароли (от ssh, http, wpa, от _всего_) хранит специальная служба factotum! Вы можете добавлять в неё свои пароли/ключи при запуске, чтобы не вводить пароли руками. Я делаю это через скрипт из lib/profile, который читает файлик и добавляет пароли в factotum. Это небезопасно, т.к. мой файлик -- открытый. Для безопасного способа смотрим man secstore.

Пример добавления пароля github:
echo 'key proto=pass realm=GitHub server=github.com service=http user=gl00my !password=password' > /mnt/factotum/ctl

Для сборки netsurf нужно следовать инструкциям: https://github.com/netsurf-plan9/nsport

Но, не буду разжёвывать и лишать вас радости исследования. :)

В портах вы найдёте golang свежей версии. Полезная в быту вещь.

// На данный момент, кстати, он собирается только если закомментировать строку CLEANCOMMAND в mkfile.

На eeepc мне удалось собрать только go14 (мало памяти), но в qemu установке собрал современную версию. Так что можно собирать софт для eeepc в qemu.

# Браузеры

"Современных" браузеров в 9front нет. Для многих "пользователей" это невыносимая потеря. А для меня это делает 9front настоящей отдушиной. В этой системе нет окна в зашлакованный современный веб! По-моему, это даже здорово.

Если серъёзно, у меня уже был опыт использования урезанных браузеров, так что был подготовлен. Для государственных сайтов и банков придётся использовать другие ОС или запускать в виртуалке (man vmx) OpenBSD. На eeepc я этого не делал. Ну, конечно, можно ещё по vnc ходить куда-то...

Итак, браузеры которые я пробовал.

## abaco

Канонический plan9 браузер. Если честно, чисто эстетически, очень понравился! Но, увы, в 9front он падуч. И, кажется, не поддерживает png. Короче, не рекомендую.

## mothra

Сначала не понравился. Но потом, оказалось, что он удобен. И есть у него кое-какие биндинги на клавиши, что удобно. Например: a ввод - однооконный режим. m ввод - режим скачивания (режим mothra). Выглядел он страшненько в основном из-за русских символов. Но мы уже умеем патчить код:

cd /sys/src/cmd/mothra
acme rdhtml.c
# меняем шрифты, я рекомендую везде dejavusans(it,bd)/unicode.12 и .14
mk install

Мой вариант изменений лежит на https://github.com/gl00my/plan9hacks

Короче, можно пользоваться.

http://hugeping.tk/lib/uploads/opennet-mothra.png

## netsurf

Работает, только для показа картинок нужно раскомментировать jpeg/png библиотеки в mkfile/mkfile.native и добавить флаги -DWITH_PNG -DWITH_JPEG.

Рендерит странички неплохо, но нет многих удобных фич mothra. Подходит для просмотра сайтов, с которыми не справилась mothra.

# gemini: ещё одна сеть эскапистов
pipe.2032
hugeping(ping,1) — All
2020-10-19 13:59:28


Натолкнулся тут на очередное "подполье".

Похоже, перегруженные современными технологиями гики-эскаписты -- это распространённое явление.

Встречайте: GEMINI ( https://gemini.circumlunar.space/ )

Гуглится тяжело. По факту -- что-то среднее между gopher и базовым http. Технологически возможен CGI. Нужен свой клиент (которых есть масса). Есть поисковики (gemini://gus.guru).

Русскоязычных страничек практически не нашёл (только одна или две), но англоязычных довольно много (по меркам подполья). Есть веб-прокси, в которых можно получить некоторое представление о том, на что это всё похоже...

https://portal.mozz.us/gemini/gemini.circumlunar.space
Но, конечно, из нативного клиента это выглядит аутентичней.

Вот такой вот, заповедник.

P.S. Сам пишу этот пост из Plan9 ;)

# Re: Старое железо. Заметка №2: OpenBSD 6.8
oldpc.51t.ru
hugeping(ping,1) — oldpc
2020-10-19 08:10:20


> Круто. Обзоры были? Или будут?

Пока написал вот это: ii://TF9RuFRon9u7ps9Owka3

Правда, по мере изучения уже вижу там ляпы. Хочу написать ещё несколько статей.

> А golang поддерживает этот процессор?

Старая версия собралась, по крайней мере. Та, что ещё на си. (1.04)

> Странно. gtk2-версии вообще работали прилично.

Вот и я не понял, что это было. В любом случае, рад Plan'у. Очень интересная система. :) В 9front, кстати, и питон есть (какой-то старый. правда).

# Re: Старое железо. Заметка №2: OpenBSD 6.8
oldpc.51t.ru
hugeping(ping,1) — oldpc
2020-10-18 12:39:37


По поводу разных систем на старом железе.

Есть у меня eeepc 1000px. Не сказать, что совсем старый. Atom N450, 1Гб памяти. Лет 10 ему.

После долгого перерыва, попал ко мне в руки. Пробовал там NetBSD, Haiku, OpenBSD, alpine Linux.

Haiku работала прилично. Остальные (брал текущие, последние версии) -- вроде терпимо, но только до иксов.

Например, netsurf (gtk версия) сразу пожаловался на нехватку памяти. Скорее всего, потому что был вариант с gtk. Прикол в том, что на этом же нетбуке когда-то крутилась убунта, и не жаловалась.

В итоге, я поставил на него 9front (форк Plan9). Правда, чтобы всё заработало, мне пришлось портировать wifi/ethernet драйверы из OpenBSD и ещё попатчить кое-что по мелочи. Зато теперь, нетбуком действительно интересно пользоваться! И памяти хватает! (Хотя, на сборку последних версий golang её не хватило).

# Re: Краткая информация по этому узлу
ping.local
hugeping(ping,1) — oldpc
2020-10-18 12:25:17


Выбери эху, потом вверху в шапке нажми на её название. Это будет эха в виде ленты, а не тем. И тут уже будет в шапке RSS ссылка.

Ещё если на главной нажать на время сообщения, то сразу попадаешь в режим ленты.

# Re: ii-txt-0.8.tar.gz
oldpc.51t.ru
hugeping(ping,1) — oldpc
2020-10-18 11:53:46


> а так, я у себя просто грохну файл эхи и заново всё скачаю
Я отредактировал, теперь в http версии можно просто ткнуть на ссылку и скачать. А в "сырой" - base64

# Re: Редактирование сообщений
idec.talks
hugeping(ping,1) — hugeping
2020-10-18 11:05:37


Ещё вариант: как то вести отдельно список отредактированных сообщений, и тогда те, кто поддерживают такую фичу, просто скачают эти сообщения повторно и добавят в свои списки... Ну, списки сделать как u/e, ещё одну схему...

# Редактирование сообщений
idec.talks
hugeping(ping,1) — All
2020-10-18 11:02:17


Привет, All!

Как думаете, есть ли смысл думать а внесении в стандарт возможности редактирования сообщений?

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

Может быть, есть смысл сделать что-то вроде такого:

- Редактирование, это создание нового сообщения, с новым msg id;
- В тегах этого сообщения прописан msgid сообщения, которое оно заменяет.

Тогда клиенты, которые не поддерживают этой фичи просто получат новую копию.

Но что делать с отображением этих двух (или больше) сообщений? Скрывать при визуализации "заплаточные", но раздавать их по fetch? Как-то странно...

Что думаете? Есть ли смысл думать в эту сторону, или это только усложнит простую технологию?

Мне кажется, это всё слишком сложно для идеи ii, но может у кого-то будут ещё варианты? Редактирование сообщений, всё-таки, полезная вещь в быту...

# Re: ii-txt-0.8.tar.gz
oldpc.51t.ru
hugeping(ping,1) — oldpc
2020-10-18 10:46:16


> а у сообщения id после редактирования изменится? оно ко мне новое придёт?
> я то из текстового клиента сижу :)
id не меняется и сообщение не придёт. Это, на самом деле, вопрос вообще к ii/idec - поддержка изменения сообщений. Наверное, если делать, это многое усложнит. (Надо чтобы новый id как-то ссылался на старый, может тегами?)

Сейчас это просто добавление новой версии в базу, а http морда показывает всегда новую версию.

# Re: ii-txt-0.8.tar.gz
oldpc.51t.ru
hugeping(ping,1) — oldpc
2020-10-18 10:38:55


> ага, я видел такое в описании, но подумал, что текстом каноничнее

А, ну ок. Я на всякий случай сказал.

# Re: Обновления ii-go (движка узла ping)
ping.local
hugeping(ping,1) — hugeping
2020-10-18 10:28:39


Добавил подсветку

# Заголовок

## Заголовок 2

### Заголовок 3

И другой способ:

= Заголовок

== Заголовок 2

=== Заголовок 3

Тело сообщения не меняется, изменение только в css.

# Re: ii-txt-0.8.tar.gz
oldpc.51t.ru
hugeping(ping,1) — oldpc
2020-10-18 10:11:46


> файл-то я у себя выложу, а вот наскальный аттач останется навсегда :)

У меня это на отображение только влияет. Сообщение такое-же, в тело прямо внедрено base64.. Но перед ним стоит строка (тег @base64: имя файла) и нода, при показе через http(s) сделает ссылку на скачку файла прямо из тела письма, чтобы не заниматься самому декодированием. А так - то же самое сообщение, просто одну строку в тексте добавить и всё.

# Re: ii-txt-0.8.tar.gz
oldpc.51t.ru
hugeping(ping,1) — oldpc
2020-10-18 09:49:59


Тут станция понимает аттачи в base64.

Вот тут написано:
http://club.syscall.ru/rOf069UX8K24yAzvWa9N#rOf069UX8K24yAzvWa9N

Можешь отредактировать своё сообщение, и тогда по http можно будет просто скачивать этот архив.

P.S.
Ну или разреши мне, я сам сделаю.

# Re: тест меня видо
ping.local
hugeping(ping,1) — oldpc
2020-10-16 16:42:38


> в новом дилло он вообще по-современному смотрится, такой дизайн я и хочу себе на сайт

Бери ii-go :) Стилями и выкидыванием кода можно довести до идеала.

# Re: test echo creation
oldpc.51t.ru
hugeping(ping,1) — oldpc
2020-10-16 16:41:41


Короче, пока подписал как "Старое железо"

# Re: test echo creation
oldpc.51t.ru
hugeping(ping,1) — oldpc
2020-10-16 16:33:46


> а что будет, если создать новую эху?
> +++ Caesium/0.4 RC1

Вообще, это было отключено. :) Но, похоже, не до конца.
Оставлять эху? Если да - как назвать?

# Re: тест меня видо
ping.local
hugeping(ping,1) — oldpc
2020-10-16 16:22:05


> Пишу из Dillo из Debian Etch. Сайт вполне неплохо смотрится и в Dillo :)

Да он и из eww норм смотрится. И даже из Plan9. :)

# Читшит с функциями INSTEAD
std.prog
hugeping(ping,1) — All
2020-10-11 21:10:23


Lucky_Ook некоторое время назад запилил читшиты с функциями INSTEAD. Чтобы не потерять, оставлю здесь: https://github.com/luckyuk/Instead-cheatsheet
P.S. Edited: 2020-10-11 21:10:56

# Re: openvpn
linux.14
hugeping(ping,1) — johnbrown
2020-10-11 12:35:13


Я всё-равно ничего не понял. Может быть кто-нибудь и ответит. А мне нужно понимать что происходит. Например. Openvpn это два конца. Нужна схема сети, где эти концы находятся в этой схеме. Где сервер и клиент в этой схеме. Интранет/интернет. Наты. Итд. А так, я вообще ничего не понял.

# Re: openvpn
linux.14
hugeping(ping,1) — johnbrown
2020-10-11 10:35:08


Непонятна схема. Какие машины, где стоят, где концы туннеля итд...

P.S. Сам не настраивал openvpn, но по схеме всё-равно вопросы.

# Plan 9: экстремальный KISS #1
std.hugeping
hugeping(ping,1) — All
2020-10-10 16:02:21


# Введение

Про операционную систему Plan 9 я слышал не раз. Но всё это время, мой интерес не переходил в активную фазу, ограничиваясь пассивным любопытством и чтением статей. Так продолжалось до настоящего момента, пока я всё-таки не попался в сети проекта http://9front.org

Я не буду здесь писать энциклопедическую информацию о Plan 9. Но если совсем кратко, то создатели Unix в лице Bell Labs (среди сотрудников которой числятся Кен Томпсон, Деннис Ритчи, Роб Пайк) однажды взяли и решили сделать _правильную_ ОС, без оглядки на проклятый Legacy Unix, в том числе и POSIX. Доведя идею "всё есть файл" до абсолюта и стерев грань между локальными и удалёнными файловыми системами. В качестве примера: tcp/ip это тоже файловая система. Поэтому, если мы подключим к себе удалённую ФС /net, получится что-то вроде NAT. Вот так просто и естественно. В общем, получилась бескомпромиссная, распределённая и при этом крайне простая и красивая ОС. Которая (с некоторыми оговорками) оказалась ненужной. Потому что существующие решения просто работают, и миру этого достаточно...

Но ребята из проекта http://9front.org форкнули Plan 9 и начали делать патчи, которые в том числе помогают Plan 9 работать на современном оборудовании. Итак, 9front можно сказать, это Plan 9, который лучше всего годится для того, чтобы поставить его на железо.

http://hugeping.tk/lib/uploads/mothra.png

На данный момент у меня есть работающий 9front на eeepc 1000px в котором можно даже что-то делать. До этого, я около полугода запускал 9front в qemu и читал различную информацию. И, честно говоря, мало что понимал. Я гробил файловые системы, не мог отредактировать файл и вообще... Не понимал ничего. В общем, я решил начать цикл статей о Plan 9, в которых я буду рассказывать о своём субъективном опыте. Конечно, я не знаток этой ОС, поэтому если кто-то может -- поправляйте меня в комментариях.

# Первые шаги

Итак, начнём.

Я начинал знакомство с ОС с чтения руководства dash с http://9front.org Руководство написано с юмором, с его помощью вы можете попробовать поставить 9front в qemu или на реальное железо (чего я бы пока не делал).

И вот, мы ставим ОС, отвечая на странные вопросы инсталлятора, стартуем... Иии... Что это?

Забудьте про всё, что вы знали. Здесь другой мир. Он прекрасен, но чтобы это понять, вам придётся пойти по пути аскетики и самоотречения. :) Шучу (почти). Для работы с Plan 9 нужна графика и мышь. Без этого -- просто никак. Это может быть ударом для вас. Поверьте, я сам пользуюсь emacs и помню кучу клавиатурных комбинаций. Здесь вам это не понадобится. Пройдёт немало времени, пока вы не привыкните к такому положению вещей и не начнёте получать от этого своеобразное удовольствие (ясность сознания). :)

На ноуте, в принципе, можно обойтись тачпадом. Короче, нужны три кнопки мыши. С случае тачпада это может быть тап 1, 2 или 3-мя пальцами. Или (в случае физических кнопок): 1я, 2я и 2я кнопка вместе с shift.

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

В общем, в этом окне (новые окна вы можете создавать нажав 2ю кнопку мыши и выбрав в меню New) вы можете что-то запускать. Если вы запускаете графическую программу, то её содержимое заменит собой содержимое окна. Это не то, к чему вы привыкли, но это удобно. Чем-то напоминает тайловые оконные менеджеры, когда вы заранее создаёте фреймы. Но пока просто наберите man rio и почитайте, как работать в этом странном "оконном менеджере".

Окно не скроллируется по умолчанию на новый вывод. Вы можете изменить это поведение нажав 3-ю кнопку мыши и выбрав scroll. То, что окно не скроллируется, минимизирует необходимось использования пейджера. Вы просто скроллите кнопками вверх/вниз. Хотя, пейджер всё-таки есть и называется 'p'.

Про историю команд -- забудьте. Клавиши вверх/вниз всегда скроллят окно. Перемещаться по тексту и по истории ими нельзя.

Текст в окне - это просто текст. Вы можете менять его, копировать и вставлять. Таким образом, можно воспринимать его как историю команд. Выбираете мышкой и делаете send. Команда выполнится.

Некоторые хоткеи всё-таки есть, и они -- на вес золота:

- C-a, C-e -- в начало и в конец строки;
- C-u -- стереть всё слева от курсора;
- C-f -- автодополнение путей в файловой системе (tab -- забудьте);
- C-b -- прыжок к приглашению;
- del - аналог C-c в Unix.

Ещё нюанс. Допустим, вы написали:

ls /usrr/glenda

Заметили, что опечатались. Вернулись курсором к r и стёрли его, нажали ввод.

Упс!

ls /usr
/glenda

При выполнении команд, курсор должен находиться в конце ввода! А так, выполнилась команда ls /usr. Используйте C-e.

К этому нужно привыкнуть и это непросто. Все рефлексы заточены на другое. В современных Linux командная строка обвешена дополнениями и клавиатурными сокращениями, но здесь всё не так. Что взамен? Простота! Нет никакого терминала, есть просто поток текста. И всё. Черные буквы на светлом фоне. Всё есть текст.

# Ещё несколько советов

- Используйте lc вместо ls. Вывод lc информативней. Например, после имён каталогов ставится /;

- Копирование в буфер обмена здесь называется snarf;

- Домашний каталог это $home или /usr/glenda в установке по умолчанию;

- Когда вы пишете что-то вроде grep, не надо заключать строки в "". Тогда в ввод эти кавычки и уйдут. Тут вам не bash, тут rc. У него совсем другие (более простые) правила эскейпинга. Можете использовать одинарные кавычки, если нужно. Например: g 'Kcaps' /sys/include/*. Да, g -- это рекурсивный grep;

- Некоторые утилиты расположены в подкаталогах. Например, ip/ping. Что это значит? Что выполняемый файл лежит в /bin/ip/ping;

- Посмотреть свой ip адрес: cat /net/ndb;

- Используйте walk | grep как аналог find;

- Скачать что-то (man hget);

- Смотреть pdf или картинки (man page);

- Браузеры: mothra, abaco (довольно падучий), можно собрать netsurf. Об этом будет другая статья;

- Для переключения раскладки можно запустить: kbmap /sys/lib/kbmap/us /sys/lib/kbmap/ru и переключать мышкой. Чтобы сделать переключение с клавиатуры, можно немного поменять rio, об этом -- в другой раз;

- Копировать каталоги здесь можно с помощью dircp, cp -R -- нет;

- fshalt -r -- перезагрузка;

- fshalt -- выключение;

- В домашнем каталоге есть bin/rc каталог. Здесь можете писать свои скрипты и они будут доступны для запуска. На самом деле, реализовано это за счёт bind. Сейчас поясню...

# Bind

В домашнем каталоге, lib/profile есть файл - который можно назвать аналогом .profile. Сделайте его cat и посмотрите. Видите?

bind -a $home/bin/rc /bin

bind позволяет делать объединение файловых систем. -a -- добавить файловую систему после. В данном случае, мы добавили bin/rc в пространство /bin. Короче, все наши скрипты из bin/rc видны в /bin. (man bind)

Следующая строка, заметьте, использует $cputype. Дело в том, что кросскомпиляция есть из коробки, и есть разные компиляторы (man 6c). И разные каталоги для бинарников для разных архитектур.

Интересно ещё вот что, если вы что-то забиндите в окне rio, а потом запустите другое окно -- не удивляйтесь, что там этого не будет. Пространство файловой системы наследуется процессами. Поэтому в новом окне будет пространство rio. То-есть, каждый процесс может настраивать свое файловое пространство как угодно.

Поэтому в profile стартует webfs (это реалиазция http протоколов в виде файловой системы -- ну потому что здесь _всё_ реализовано в виде файловой системы) -- тогда все процессы из rio (который тоже стартует из profile) смогут работать с вебом.

То, что пространство ФС персональное для каждого процесса имеет интересный практический плюс. Например, смонтировали вы флешку, чтобы отмонтировать её -- вам достаточно прибить окно. Ну или все окна, в которых вы её смонтировали. Хотя команда unmount тоже есть (обратите внимание, не umount, а unmount).

Из profile стартует графическая система rio с флагом -i riostart.

# riostart

Делаем cat /bin/riostart.

Это вот и есть стартовый скрипт rio. Можете кастомизировать под себя. Например, запустив kbmap с нужными параметрами (переключалка раскладки клавиатуры). Упс... Мы ещё не умеем редактировать файлы.

# Редактируем временную зону в acme

Давайте начнём учиться редактировать с того, что выставим нормальную временную зону. Дело в том, что в 9front нет Российских временных зон из коробки. Но это не беда. Ведь всё есть файл!

Пишем:

acme /adm/timezone/local

Открылся редактор acme. В нём -- ваша текущая временная зона. На самом деле acme это не только редактор, это среда. Что-то вроде emacs в Plan 9. Детище Роба Пайка, который, наверняка, писал golang именно в нём. Но только это KISS emacs. :) Я не способен сейчас научить вас работать в acme (тем более, что я сам только учусь), но кратко опишу его принципы.

В acme мы имеем что-то вроде тайлового оконного менеджера. Можем создавать столбцы (3-кнопка на Newcol) и делить их на части (3-кнопка на New).

В acme тоже "всё есть текст". Это значит, что вы можете редактировать зону меню так же, как и текст. Пока не делайте этого, просто не пугайтесь если вдруг сотрёте кнопку Newcol. Просто напишите её там, где вам удобно. :)

Например, добавьте в зоне меню команду win. Просто текст win. 3-кнопкой нажмите на win и запустите "терминальное" окно внутри acme. Другие полезные команды смотрите в man acme. Вы можете писать скрипты, которые будут командами. Скрипты могут выводить текст и потреблять текст из редакторы. Таким образом, можно сделать, например, команду indent параграфа. Кроме того, acme поддерживает файловую систему (да-да, как и всё тут!), с помощью которой можно управлять редактором. Так что в acme можно читать почту и делать что-то ещё, что вам понадобится, просто дописывая нужную вам функциональность.

Поиск делается дописыванием текста после меню | Look, выделением этого текста и 3-кнопка. Так же можно просто выделять текст и жать 2-кнопку.

Открыть файл по номеру строки: добавьте к имени файла в меню :число, выберете всё это и нажмите 2-кнопку.

Режим авто-отступа есть. Он включается Indent on (да, да - допишите это в меню и выполните).

Итак, у вас открыт редактор на файле local. Надо стереть содержимое файла. Стрелочки? СТРЕЛОЧКИ СКРОЛЛЯТ ТЕКСТ! shift-стрелочки? Нет! Выделяем текст мышкой и нажимаем backspace!

Да, настал момент суровой правды. Вы не можете перемещаться по строкам с помощью стрелок курсора даже в текстовом редакторе! Так что или бегите (пока можете), или -- продолжим.

На самом деле, это жутко раздражает по началу. Но потом, я стал замечать за собой некоторую дисциплину. Всё не так плохо, сознание разгружается. Просто редактируем текст по правилам этого мира. Сейчас, по прошествии времени, я даже нахожу в этом какое-то удовольствие и отдушину (после emacs).

Да! Подсветки синтаксиса нет. Робу не нравится смотреть на код, как на новогоднюю ёлку.

Итак, вернёмся к временной зоне. Для московского времени я оставил одну строку:

MSK 10800 MSK 10800

Это временная зона GMT+3 (в секундах). Зимнее и летнее время.

Сохраняем файл. Ах, да... 3-я кнопка мыши по Put. Если Put пропал - вы сохранили файл. Выйдете из редактора самостоятельно.

Но это ещё не всё! Если у вас в BIOS время настроено в UTC, то надо сделать следующее:

acme /rc/bin/termrc.local

Впишите строку:

TIMESYNCARGS=(-ra1000000)

И сохраните. Ну или вы могли бы убрать параметр L из TIMESYNCARGS в файле /bin/termrc в самом начале, но это хуже. /bin/termrc запускает termrc.local.

/bin/termrc - это скрипт, который стартует вашу терминальную станцию.

# Немного об архитектуре

То, что вы поставили себе в qemu (или на ноутбук?), в терминах Plan 9 называется терминальной станцией. Дело в том, что Plan 9 это сетевая система, где предусмотрены разные типы станций: терминал, файловый сервер, cpu-сервер итд. Границы между ними стёрты с помощью сетевой файловой системы 9p. Теорию почитайте тут: http://doc.cat-v.org/plan_9/4th_edition/papers/ А в 9front вы получаете как бы всё в одном: терминальная станция, файловый сервер и т.д. Но в теории, это всё можно настроить на отдельных машинах. И именно так Plan-9 использовалась в Bell-Labs.

# Файловая система

По умолчанию предлагается использовать CWFS.

"Файловая система" тут тоже реализована как служба-процесс. К которому можно подсоединиться и что-то сделать. Например, подключение к консоли:

con -C /srv/cwfs.ctl
help

Можете проверить fscache командой check.

CWFS это на самом деле интересная файловая система. Точнее -- файловый сервер. Он состоит как бы из двух областей. Есть fscache - в котором и идёт постоянная работа. И есть fsworm (Write Once Read Many) - это место куда архивируются данные и никогда не стираются. То-есть, когда-то ночью грязные блоки fscache сбрасываются в fsworm. Потом снова работаем с fscache. Сброс грязных блоков - это команда dump. Вы можете выполнять её руками через консоль: con -C /srv/cwfs.ctl, тем самым вы освобождаете место в кеше!

fsworm позволяет посмотреть любой слепок из тех, когда были сделаны dump. Смонтировать их можно так:

9fs dump

> Не выключайте питание во время дампа!

По началу я никак не мог понять, почему у меня кончается место на диске! Оказывается, забивался сравнительно небольшой fscache. Надо было бы сдампить его в fsworm. Конечно, cwfs на нетбуке это немного странно. :) Что я буду делать, когда забью fsworm? Вероятно, пересоздам его заново, скопировав последнее состояние в fscache?

# Редактирование plan9.ini

После первой установки, скорее всего вам понадобится поменять что-то в параметрах загрузчика. (man plan9.ini) Например, выставить более комфортное разрешение vesa. Включить acpi, поменять тип мыши и др.

Для этого надо подмонтировать специальный fat раздел:

9fs 9fat
acme /n/9fat/plan9.ini

Помните? Открывайте редактор из этого же окна. В другом окне файловая система не будет подмонтирована. По началу это сбивает с толку.

На этом же разделе, кстати, находится ядро. Но о компиляции ядра мы поговорим в другой раз.

# Доступ к файловой системе по сети из Linux

acme $home/bin/rc/export
Содержимое файла:
#!/bin/rc
aux/listen1 -t 'tcp!*!564' /bin/exportfs -r /

Запустите скрипт в окне и монтируйте с Linux:

9pfuse <адрес>:564 <точка монтирования>

Исходники системы находятся в /sys/src/ :)

# Заключение

К сожалению, вводная статья получилась сумбурной. Очень много информации и всё очень связано: начинаешь что-то писать, сразу понимаешь, что надо рассказать сначала о другом компоненте. Берёшь другое -- снова та же история.

Погружение в Plan 9 для меня было непростым процессом, и я сам ещё нахожусь в самом начале пути. Но в следующих статьях я попробую писать более конкретно, сосредоточившись на конкретных практических задачах.

Примерный план статей такой:

- Собираем netsurf и irc (git, hg, порты, golang);
- Изменяем исходные коды системы (смена раскладки клавиатуры);
- Музыка (и видео???);
- Мои патчи: ethernet alc, ethernet athn, acpi, vgadb;
- Сравнение исходного кода ядер: openbsd, Linux, plan9.

Если что, пишите свои предложения/вопросы.



P.S. Edited: 2020-10-11 10:28:47

# Синдром IT-вахтёрства
std.hugeping
hugeping(ping,1) — All
2020-10-06 09:53:41


Не смотря на то (а может быть, именно поэтому), что я занимаюсь IT, у меня давно сформировался подсознательный страх к IT-вахтёрству. Что я имею в виду? Поясню на примере из жизни.

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

Я создал заявку на решение проблемы и стал ждать. Кстати, в школе, похоже, считали, что мы просто не умеем создать аккаунт школьника или ленивые. Время шло, а ситуация нагнеталась, так как сын не мог делать Д3. Тогда я вооружился отладчиком FF и начал изучать API ЭЖД...

За вечер удалось выяснить следующее:

- Авторизация по токену проходит;
- После авторизации сервер возвращает _список_ профилей. Профиль - это описание учебного заведения и другие атрибуты. При этом профили привязываются к одному пользователю (uid);
- Возвращается список из 2-х профилей: 1-й -- старая школа, 2-й -- новая.
- Клиент пытается зайти в 1-й профиль и получает "отбой" (профиль неактивный?) в виде ошибки, которая проявляется как перенаправление на главную страницу.

Почти сразу, как я это понял, удалось заменить в cookies идентификатор профиля и мы зашли в дневник! Но работало не всё: новая версия дневника показывала пустоту.

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

И тогда, на следующее утро наступил второй этап.

Я подумал, что если я смогу заменить ответ сервера на свой, исключив старый профиль, то добьюсь стабильной работы ЭЖД в любых режимах.

Самое сложное -- подменить ответ. Удивительно, но ни FF ни Chrome не предоставляют простых (или вообще никаких?) путей сделать такое. Поэтому воспользовался таким вот проектом: https://mitmproxy.org/

В нём есть режим, замена ответа с помощью регулярки. А дальше, дело техники. Положил в систему корневой сертификат, настроил в FF auto proxy (чтобы работал только на dnevnik.mos.ru) и... Работает как часы. ;)

Итак, мы пользовались дневником, а время всё шло. Меня беспокоил такой момент, что в случае обновления ПО дневника, всё придётся делать заново. Возможно, логику профиля перенесут в серверную часть и тогда...

И тут приходит ответ на заявку. Та-дааам!

> "Для восстановления доступа к дневнику нужно сменить пароль..." !!!!???

Конечно же, я пытался менять пароль. Но проблема не в этом! Я же описал, что именно происходит? Похоже, вахтёр, закрывший ошибку _даже не прочитал_ репорт!

Позвонил снова, в этот раз уже откровенно орал. Объяснил снова ещё раз, попросил переоткрыть и повысить приоритет задачи. Через 3 дня пришёл ответ, что всё -- исправили!

Действительно, в выдаче теперь приходит только один профиль - новый. Правильное ли это решение? Не уверен, потому что в системе явно предусмотрено сосуществование нескольких профилей. Похоже сделали то, что было проще и быстрее.

Так вот, в момент первой "отписки" я в полной мере почувствовал силу IT-вахтёрства.

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

Что было бы, если на моём месте была бы мать-одиночка с гуманитарным образованием? А ведь наверняка моя ситуация не единственная. Всё больше услуг невозможно получить без IT. И это пугает! Пугает меня, IT-шника!

Я уже молчу про то, что самые важные ресурсы: сайты госуслуг и банки -- перегружены js так, что он уже просто вытекает из щелей разметки.

По моему твёрдому убеждению, все подобные ресурсы должны работать на простых "дубовых" технологиях. Но... Мы заслужили то, что заслужили. Красота бесценна. Но то, что невозможно продать -- этому миру не нужно.

# Re: Пишу ноду ii/idec на go
idec.talks
hugeping(ping,1) — Peter
2020-09-26 12:05:55


Там от меня ушли 7 сообщений из черновиков/неотправленных? мобильного клиента... Нужно их блеклистить:

ii://2NszlFTgvhakzz7dIfvc
ii://Q03NcPZRuqeaOT5d6Tze
ii://v48ZAPJMiFbWl68YiFWU
ii://5JdRzlDtEJTfOtKCtTb4
ii://pEtdZQ4aPz7SAhFK3zwR
ii://SglNQOG3vyujcZLXjDtu
ii://flYuqUgR5SVgybdnYnVp

Извините. :)

# Re: Фантастические консоли и где они обитают
develop.16
hugeping(ping,1) — johnbrown
2020-09-26 08:49:01


Если мне захочется "живого" железа, я скорее всего выберу спектрум. В детстве я программировал на БК0010-01, а вокруг были спектрумы. Поэтому, интересно. :) Даже читал книгу по железу спека не так давно. Но реально, не уверен что руки дойдут. Много всего. :) Сейчас вот Plan-9 увлёкся.

А в плане виртуальных консолей, PICO8 для меня лучшая. В ней есть баланс ограничений, которые (на практике проверил) идеально для меня подходят. Жаль, что закрытая только. Но хотя бы формат игр открыт и есть открытые плееры...

# Битые текстуры на AMD Radeon Vega
linux.14
hugeping(ping,1) — All
2020-09-24 07:21:16


Купил в начале карантина два ноута: Acer Apire 3. И надо сказать, очень доволен (дёшево и эффективно). Но на ноуте частенько в 3d приложениях наблюдал битые текстуры. Не сказать, что критично, но -- напрягало. Быстрый поиск ничего не давал. Но в итоге, всё-таки нашлось:

# Переменная окружения
AMD_DEBUG=nodmacopyimage

По этой строчке проблема уже легко гуглится, так что можно за ней следить.

P.S. Следующие компы буду брать на AMD.

# Re: Вернуться в детство с PICO-8
std.hugeping
hugeping(ping,1) — boscholeg
2020-09-23 10:06:42


> Сейчас очередь за чем? Будет пико или инстед игрушка?

Хочется написать на метапарсере.

# Re: Вернуться в детство с PICO-8
std.hugeping
hugeping(ping,1) — johnbrown
2020-09-22 16:04:26


> Спасибо за АА. Эта штука украла 2 часа моей жизни. Но, это были приятные два часы, полные взлетов и падений )

Тогда вторую мою игру зацени: https://instead.itch.io/rr

> Недавно открыл для себя фэнтези консоли. Пока присматриваюсь к TIC и ESP LGE. Битси уже в деле )

Круто! TIC тоже смотрел. Решил чередовать: INSTEAD->PICO8->INSTEAD... ;)

# Re: Unicode строки в Instead
std.prog
hugeping(ping,1) — Frost
2020-09-22 15:00:55


> print(std.game.codepage)

Конечно, так не сработает, в этот момент game ещё нет. Но в моём коде std.game проверяется внутри функции, запуск которой предполагается в момент, когда игра уже запущена. Например, в start() и позже...

# Re: Unicode строки в Instead
std.prog
hugeping(ping,1) — Frost
2020-09-22 14:36:39


> выяснилось, что std.game приводит к ошибке. Мне пришлось удалить фрагмент

Файл с игрой называется main3.lua или main.lua? Нужно, чтобы было main3.lua -- это новое INSTEAD API, старое API больше не поддерживается.

> Файл с кодом игры ведь обязан быть в кодировке UTF-8 (разве не так?). Зачем тогда эта проверка?

Формально, не обязан. Дело в том, что до сих пор есть поддержка разных кодировок, но по факту -- никто кроме utf-8 ничего не использует. И это хорошо.

# Re: Unicode строки в Instead
std.prog
hugeping(ping,1) — Frost
2020-09-22 13:34:27


> Спасибо. Я благодарен за уделенное внимание моему вопросу. Однако на текущем этапе мне сложно разбираться в коде метапарсера.

Так там были готовые функции. Просто скопировать в свою игру.

local function utf_ff(b, pos)
	if type(b) ~= 'string' or b:len() == 0 then
		return 0
	end
	local utf8 = (std.game.codepage == 'UTF-8' or std.game.codepage == 'utf-8')
	if not utf8 then return 1 end
	local i = pos or 1
	local l = 0
	if b:byte(i) < 0x80 then
		return 1
	end
	i = i + 1
	l = l + 1
	while b:byte(i) and b:byte(i) >= 0x80 and b:byte(i) <= 0xbf do
		i = i + 1
		l = l + 1
		if i > b:len() then
			break
		end
	end
	return l
end

local function utf_chars(b)
	local i = 1
	local s
	local res = {}
	local ff = std.rawget(_G, 'utf8_next') or utf_ff
	while i <= b:len() do
		s = i
		i = i + ff(b, i)
		table.insert(res,  b:sub(s, i - 1))
	end
	return res
end

Вот это реализация utf_chars, которая сделает массив с литерами из строки:

local a = utf_chars("привет")

Мне просто неизвестно, какие функции нужны.

> Вытекающий вопрос: можно ли перевести Instead на работу с LUA версии 5.3, в которой есть встроенная поддержка Юникода?

ИНСТЕД и так работает (может быть собран) с Lua от 5.1 до 5.4. Но если нужно, чтобы игра работала на всех видах установок (не только на собственной версии), нужно пользоваться 5.1. В основном это связано с тем, что бинарные сборки используют LuaJit, который 5.1 (с расширениями).

# Re: Малинка, как домашний веб сервер
pipe.2032
hugeping(ping,1) — boscholeg
2020-09-22 11:18:09


> Петр расскажи насколько равномерно корпус прогревается?
> Пробовал измерять температуру в разных частях корпуса?

Температуру смотрел только такими командами:

$ cat /sys/class/thermal/thermal_zone0/temp
$ vcgencmd measure_temp

На ощупь, верхняя часть нагрета равномерно.

> GUI и прочие десктопы ты на малинке поднял? Или работаешь через терминал?

Ничего, кроме ботов, ssh и ii-go не кручу там. Первый раз запускал графику, но потом сразу снёс. Возможно, буду экспериментировать с 9front, но не сейчас.

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

Да, правда мне по ошибке привезли корпус, в который можно ставить вентиляторы (идут в комплекте). Из-за этого, там не везде есть рёбра. Но, похоже, это не так уж и важно. Сейчас t == 39C :) Летом будет повыше, наверное.

# Re: UTF8 строки в Instead
std.prog
hugeping(ping,1) — Frost
2020-09-21 19:03:05


> Приветствую, друзья. Подскажите пожалуйста как можно работать с кириллицей в Instead. Я имею ввиду функции len; sub и другие, работающие с однобайтовой кодировкой символов.

Привет!

На самом деле, в метапарсере есть такой код. Он написан на Lua. Но, в последней версии INSTEAD есть и C реализация, которая помогает этому Lua коду.

Наверное, проще всего посмотреть как это сделано в МП. Даю наводку: https://github.com/instead-hub/metaparser/blob/master/parser/mp.lua#L87

Функция, которая из строки делает массив литер.

Рядом есть более примитивные функции: utf_len, utf_char, utf_ff и utf_bb.

А вот как определяется, какую из реализаций брать -- на Lua или на C. Чтобы работало и со старым и с новым INSTEAD:

utf = {
    bb = std.rawget(_G, 'utf8_prev') or utf_bb;
    ff = std.rawget(_G, 'utf8_next') or utf_ff;
    len = std.rawget(_G, 'utf8_len') or utf_len;
    char = std.rawget(_G, 'utf8_char') or utf_char;
};

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

utf_len, очевидно, возвращает число литер;
utf_char(строка, номер) - возвращает литеру по позиции;
utf_ff(строка, смещение) - возвращает смещение следующей литеры;
utf_bb(строка, смещение конца) - возвращает смещение предыдущей литеры;

# Re: Вернуться в детство с PICO-8
std.hugeping
hugeping(ping,1) — johnbrown
2020-09-20 13:39:58


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

Ещё есть такое понятие "flat games". Тоже любопытное явление. Можно на itch поискать. Артхаус как он есть.:)

# Re: Малинка, как домашний веб сервер
pipe.2032
hugeping(ping,1) — johnbrown
2020-09-19 22:48:19


> Слабая, знаю, но надеялся, что греться хотя бы будет меньше.

Кстати, тоже думал о 3й. Боялся перегревов, а мощность мне не так уж и нужна. Но рискнул. 40C обычно температура, что очень неплохо. Правда, я корпус взял зверский-алюминевый. Как радиатор действует. Вообще, очень рад. Правда, народ пугает выходом из строя sd карт... Ну, посмотрим...

# Re: Обновления ii-go (движка узла ping)
ping.local
hugeping(ping,1) — johnbrown
2020-09-19 22:40:18


> Может стоит сделать редирект с syscall на https?

Я хочу, чтобы узел был доступен и через http. Хотя, наверное, можно сделать редирект только для syscall и не делать для http://hugeping.tk Но, кажется, это только все запутает.

# Re: Пишу ноду ii/idec на go
idec.talks
hugeping(ping,1) — Peter
2020-09-18 08:16:08


Меня убедили начать комментировать код. :)

Так что постепенно буду это делать. На данный момент описал функции в msg.go -- это базовые функции для манипуляции бандлами (decode/encode) и приём сообщений от поинтов.

https://github.com/gl00my/ii-go/blob/master/ii/msg.go

# HP Ink Tank Wireless 410 series
linux.14
hugeping(ping,1) — All
2020-09-17 06:32:53


Купил тут МФУ. Специально брал с WiFi, чтобы можно было ставить куда угодно.

Поставил, подключил по USB, включил. Запускаю hp-wificonfig и... Пишет: нет поддерживаемых принтеров.

Ну, начал отлаживаться. К счастью, написано на питоне.

В общем, вот решение:

Файл: /usr/share/hplip/data/models
Ищем строку: model1=HP Ink Tank Wireless 410
После неё ищем wifi-config=0 и меняем строчку на wifi-config=3

Теперь hp-wificonfig увидит принтер и можно будет подключить его к домашней WIFI сети.

P.S. Пишу это сообщение, так как после обновления пакета hplip потерял это изменение и разбирался повторно. :)

# Ненастоящая победа open source
std.hugeping
hugeping(ping,1) — All
2020-09-16 19:25:59


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

clang разрабатывается с целью замены gcc. chrome -- браузер, который постепенно вытесняет firefox. Docker, gitlab, VS Code -- можно долго перечислять успешные проекты, которые созданы коммерческими компаниями и развиваются как проекты с открытым исходным кодом.

Когда-то я тоже радовался chromium, clang и другим новым классным проектам. Я видел, что их качество действительно лучше, что старичок GNU всё возится с ворохом устаревших технологий, тщетно пытаясь догнать уходящий поезд прогресса. Да он же просто смешон!

Но потом я стал кое-что подозревать...

Да, есть целый пласт проектов, которые сложно создать в режиме "базара". Компьютерные игры, работа с графикой, CAD, офисные приложения... Как пример можно привести Photoshop и gimp. Или программы видеомонтажа. Чтобы удовлетворять стандартам рынка, такие программы сами должны создаваться участниками этого рынка. Но... Представьте себе, что все компании обанкротились. И что останется?

Что будет делать сообщество с многомиллионным кодом Chrome? Сможет ли оно его развивать? Сможет ли самоорганизоваться в сообщество, способное переварить этого монстра, который уже переплюнул по своей сложности ядро ОС? Сможет ли оно самостоятельно осознать и поддерживать такие проекты как: Clang, QT, VS Code?

Ок, VS Code кажется проектом попроще, не так ли? Но на чём написан VSCode? Сможет ли сообщество сохранить инфраструктуру, которая нужна для функцилнирования такого "простого" на вид VSCode?

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

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

И здесь я снова смотрю на GNU, которая берёт на себя то, что может поднять. Да, gimp это не фотошоп. Но этот проект принадлежит нам! Да, clang, возможно современней GCC. Но GCC принадлежит нам!

Я пишу эти строки в браузере NetSurf и понимаю, что этот браузер свободен. Да, он не удовлетворяет коммерческим стандартам, но он достаточно прост, чтобы развиваться в режиме "свободного творчества".

Раньше, чтобы написать новую ОС, нужно было решить основную проблему -- поддержку оборудования. Сегодня такой краеугольной проблемой является... возможность работы современного браузера! Для проектов типа 9front http://9front.org -- это нереализуемо, если говорить о Firefox или Chrome. Но вот заставить работать NetSurf - вполне по силам одному программисту, работающему над проектом по вечерам.

И тут я задаю неудобный вопрос. А Linux-то, linux ещё наш? Или он уже стал товаром, которым торгуют корпорации?

# Блокировка Yandex рекламы
std.favorites
hugeping(ping,1) — hugeping
2020-09-15 10:21:56

# Лайфхаки
std.favorites
hugeping(ping,1) — All
2020-09-15 10:21:09


Сюда планирую собирать решения каких-то технических проблем (в основном, Linux/Unix).

# Emacs 27.1: проблема с кодировкой в gnus
linux.14
hugeping(ping,1) — All
2020-09-15 08:10:09


Решил написать сюда, чтобы не потерять.

Несколько лет пользуюсь gnus. И тут, после последнего обновления emacs, часть писем у меня стала отображаться в битой кодировке. В теле письма всё ок, стоит utf-8.

Я уже не помню, как именно удалось локализовать проблему (скорее всего просто трейсил и менял куски gnus на старый gnus из 26 emacs), но вот "волшебная строчка", которая помогла:

(setq nnheader-file-coding-system 'raw-text)

# Re: Что с станцией lessmore?
idec.talks
hugeping(ping,1) — Difrex
2020-09-14 21:34:38


Сделал исправление тоже, поставил на тебя фетч (blog.difrex). Ожидаю взаимного фетча. ;)

# Re: Что с станцией lessmore?
idec.talks
hugeping(ping,1) — Difrex
2020-09-14 20:21:52


> У меня тоже. Но это все таки данные не совсем для человека.

Ну как, curl можно автоматизировать. Я так и делал, когда переносил данные с ноды, генерировал скриптом запросы, парсил вывод. Удобнее с \n это делать.

> Ты же не будешь править тело сообщения поинта если оно пришло без \n в конце, а просто запишешь в базу.

Лучше я промолчу о том, что я делаю с сообщением поинта, а то вы меня тут заклюёте =)

> // Newline в конце добавлю, но фетчер у меня умеет и так и так.

Угу, отпишись тогда, я от тебя хочу взять fetch difrex.blog (ну и назад забирай тогда её у меня =)

# Re: Что с станцией lessmore?
idec.talks
hugeping(ping,1) — Difrex
2020-09-14 14:28:11


> Т.е. я считаю, что "\n" - это разделитель списка и если в конец вносить его, то получится, что последний элемент списка - это всегда пустая строка.

Мой довод, в основном, будет таким.

В UNIX все текстовые файлы традиционно заканчиваются на \n.

https://stackoverflow.com/questions/729692/why-should-text-files-end-with-a-newline

Стандарт POSIX определяет строку так:

> 3.206 Line
> A sequence of zero or more non- <newline> characters plus a terminating <newline> character.

Зафиксируем это и не ошибёмся. :)

# Игра R01
std.game
hugeping(ping,1) — All
2020-09-14 10:58:13


Прошёл игру-миниатюру R01 от Andrew Lobanov, которую он написал на Паровозик.

Сама игра здесь: http://instead-games.ru/game.php?ID=349

Когда начал играть, сразу понял -- мне нравится! В этом посте, на примере этой зарисовки, я хочу поделиться некоторыми соображениями по поводу "рецепта успеха хорошей игры".

Конечно, в рецепты я не верю, но у игры Андрея есть ворох качеств, которые очень характерны для определённого типа игр, которые мне по душе.



# Музыка.

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

# Сказка

Да! Это сказка! Событий много, с лёгкой руки автора они сыпятся и сыпятся. Правдоподобность? Реализм? Это всё вообще не колышет. Вы ещё спросите, как летают X-wing в атмосфере с такими кабинами (фонарями, на жаргоне пилотов) и антеннами. Или почему в космосе слышны звуки. Это сказка! Как сказка и воспринимается! Очень люблю такой вот формат.

Часто меня упрекали за "картонность" персонажей в Коте. Тут тоже, персонажи выписаны кратко и картонно, что совершенно уместно в сказке. Зато мы имеем череду событий и сцен, которые не дают нам скучать.

# Плотность предметов на сцену

Часто замечаю (да и за собой тоже), как авторы злоупотребляют количеством объектов на сцене. Да, INSTEAD может и провоцирует это, но чувство меры и здравого смысла должно сдерживать автора. Когда на сцене у нас больше 3-5 ссылок-объектов или 3-4 переходов, становится сложно воспринимать игру.

Мне нравится, когда повествование "размазано" по локациям. Ходить интересно! Исследовать пространства - интересно! Это же адвенчура! И в R01 есть это чувство меры.

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

# Чего не хватает?

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

Пару миниатюрных иллюстраций украсило бы игру ещё больше. Может быть как раз одна/две картинки на финальных сценах игры/титрах.

P.S. Автор, пиши ещё!

# Re: Что с станцией lessmore?
idec.talks
hugeping(ping,1) — Difrex
2020-09-14 10:11:34


> А почему так? Я код не хочу ща читать - лень, но ты разве не разбираешь ответ в слайс? Типа,

Почему так, вопрос, который я тоже могу задать: "Разве ты не делаешь просто Printf каждого из id? Зачем вырезать последний \n?

Дело в том, что я старался писать строго. Строка с переводом строки - это однозаначность. Например, пустая строка - это тоже пустая строка и \n.

В системе, когда у нас последняя строка не содержит \n, мы не можем отличить ситуацию, прочиталась ли строка целиком?

Например, вот функция, которая используется везде при работе с сетью:

func http_req_lines(url string, fn func(string) bool) error {
	resp, err := http.Get(url)
	if err != nil {
		return err
	}
	defer resp.Body.Close()
	reader := bufio.NewReader(resp.Body)
	for {
		line, err := reader.ReadString('\n')
		if err != nil && err != io.EOF {
			return err
		}
		line = strings.TrimSuffix(line, "\n")
		if err == io.EOF {
			break
		}
		if !fn(line) {
			break
		}
	}
	return nil
}

Обрати внимание, что if err === io.EOF стоит ПЕРЕД fn(line).

А вот правка, чтоб сработало с твоей нодой:

                if err == io.EOF {

			if line != "" { /* no eol in last line? broken node? */
				fn(line)
			}
                        break
                 }

Если же я перенесу fn(line) перед err == io.EOF, то fn(line) будет вызываться для последнего \n у других нод, которые делают \n в каждой строке.

Я лично считаю, что \n быть должен, но в как бы мы не решили, это должно быть прописано в стандарте, кмк.

# Re: Что с станцией lessmore?
idec.talks
hugeping(ping,1) — Difrex
2020-09-14 07:40:15


> Хм, вот про newline в конце интересно. Это у нас нигде не описано, но и проблем ни у кого не возникало

Нужно решение комитета. )
Мне не сложно подправить, но это именно будет хак. Дополнительный блок условный. Заметил только благодаря адаптивному фетчу, который делает пробы по 1 id. Так бы просто последнее сообщение бы не взял и всё.

# Re: Что с станцией lessmore?
idec.talks
hugeping(ping,1) — Difrex
2020-09-13 21:53:55


> Fixed
Теперь есть другая проблема. Возможно, с моим фетчером.
В выводе у тебя нет последнего перевода строки. То-есть, на запрос -1:1, к примеру, приходит MsgId без \n. Как к этому относиться? Нужно ли мне переделывать?

# Plan9 Desktop Guide
std.hugeping
hugeping(ping,1) — hugeping
2020-09-13 20:32:27


Похоже, интересная статья. Оставлю для ознакомления.

https://pspodcasting.net/dan/blog/2019/plan9_desktop.html

# Re: Пишу ноду ii/idec на go
idec.talks
hugeping(ping,1) — hugeping
2020-09-13 18:03:07


Достаточно ли замены:

msg = strings.Replace(msg, "-", "+", -1) /* if it is URL base64 */
msg = strings.Replace(msg, "_", "/", -1) /* make it base64 */

И потом декодировать стандартным base64? Но там вроде еще есть заполнение в виде ===?

# Re: Пишу ноду ii/idec на go
idec.talks
hugeping(ping,1) — vit01
2020-09-13 17:26:04


> Да, именно так, надо детектить, но это просто делается: всего лишь прогоняешь строку через замену символов, заменяя спецсимволы по словарю.

Можно этот момент описать подробнее. Каким алгоритмом base64 декодировать и что на что заменять? Я немного посмотрел, разница в стандартах base64 не такая маленькая, как мне показалось, чтобы решить её заменой. Но похоже, я ошибся.

Можно рассказать алгоритм?

# Re: Пишу ноду ii/idec на go
idec.talks
hugeping(ping,1) — vit01
2020-09-13 15:48:57


>> Примечание: production-реализации нод заменяют в полученной base64-строке плюс (+) и слэш (/) либо их аналоги (- и _) на буквы "A" и "Z" соответственно, дабы убрать из msgid спецсимволы.

Это про msgid речь же. А вопрос вроде касался того, в каком формате поинт шлёт бандл на ноду (POST или GET, не важно). И в каком формате отдают/получают бандлы ноды.

В стандарте есть такая фраза: (все серверы обязаны принимать как обычный, так и urlsafe-словарь, генерируются же бандлы в формате обычного base64)

Для меня эта фраза непонятна. Бандлы вроде в обычном base64, но принимать я должен в любом? Надо детектить тип base?

Я так и не понял, в каком варианте base64 я должен принимать и отдавать бандлы нодам и принимать бандлы от юзера. В итоге имеем такие варианты:

Мой:
1) Я принимаю и отдаю нодам бандлы в обычном base64 (не считая msgid, который подвергается преобразованию описанному в стандарте)

2) принимаю post/get запросы от поинтов в urlsafe base64

И вроде это работает, по крайней мере со станцией Андрея.

difrex:

1) принимает от поинтов обычный base64 но предварительно заэскейпченный

На мой взгляд, противоречит стандарту. Но я так и не понял, как правильно.

# Re: Пётр шевелит секту
pipe.2032
hugeping(ping,1) — Andrew Lobanov
2020-09-13 08:03:01


> Этак скоро скрипт статистики снова будет иметь смысл :)

Наверное надо где-нибудь писать про idec, все-таки. Думаю все присутствующие узнали про ii из постов на лор или чего-то подобного? Ну или организовывать тематические сообщества: инстед, план9 итд.

С другой стороны, у меня лично цели нет "набрать поинтов".

# Re: Переезд состоялся
std.hugeping
hugeping(ping,1) — artur
2020-09-12 20:30:35


> Понял-принял. Ну тогда уж надо будет поделиться здесь своими пиксельными поделищами=)

Только просьба, не в этой эхе (std.hugeping), потому что здесь мой блог. :)

# Re: Переезд состоялся
std.hugeping
hugeping(ping,1) — artur
2020-09-12 20:25:02


> Вопрос на счёт картинок с постов. В Гимпе рисовано?=)

Потому что я уменьшаю разрешение до 32x32 и режу количество цветов. Тогда картинка xpm смотрится нормально и в тексте сообщения. А так, это просто пиксельарт из интернетов.

# Re: Пишу ноду ii/idec на go
idec.talks
hugeping(ping,1) — vit01
2020-09-12 20:22:00


> Предлагаю прописать font-family: sans-serif в body-блок CSS-ки. Это сработает на всех платформах, и разница станет заметна невооружённым глазом. Попробуй хотя бы ради эксперимента

Вообще, я пробовал. Но тут такое дело. Я не хочу навязывать sans/sans-serif. Я сам из тех, кто долго верил в теорию вреда "шрифтов с засечками". А потом попробовал засечки, и мне понравилось. Поэтому я не хочу навязывать стиль шрифта. Пусть отображается дефултная настройка браузера. Те, если у тебя стоит в дефолте шрифты с засечками, ты их и увидишь. Есть вопрос с мобильными браузерами, там такой настройки нет... Ну, что поделать.

# Что с станцией lessmore?
idec.talks
hugeping(ping,1) — All
2020-09-12 18:55:16


Хотел было забрать блог difrex, но:

$ curl https://dynamic.lessmore.pw/idec/u/e/difrex.blog
difrex.blog
error: Internal error

# ZeroNet приложение для Android
std.hugeping
hugeping(ping,1) — hugeping
2020-09-12 18:37:00


Оказывается, за то время, что я не следил за ZeroNet, в PlayMarket появилось новое приложение. Выглядит оно получше и поудобнее. Что косвенно подтверждается оценкой приложения.

Так что относительно комфортно можно пользоваться ZN и с мобильных устройств.

Мой блог в ZN: http://127.0.0.1:43110/1HVhvrompfwLstJExofKAQ5mMss7YivVDj/

Правда, теперь там будут скорее всего только репосты с узла ping.

# Re: Пишу ноду ii/idec на go
idec.talks
hugeping(ping,1) — vit01
2020-09-12 17:48:04


> С base64, спойлерами и остальным возитесь пока сами

Так это относится только к Web части. С этим возятся поинты моей ноды.

> 1. Нужно всё-таки объединять усилия .... Кому-то из вас двоих нужно от своей репы отказаться и идти мержить код в общий котёл

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

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

Шрифты вообще не заданы нигде. Никакие. Так что используется тот шрифт, что стоит у тебя в настройках. :)

P.S. Edited: 2020-09-12 17:48:59

# Баги при редактировании и очистке базы
ping.local
hugeping(ping,1) — hugeping
2020-09-12 12:45:48


Пофиксил довольно серъёзные баги с редактированными сообщениями (менялась дата и порядок) и в процедуре clean.

Теперь должно быть всё ок.

# День программиста
std.hugeping
hugeping(ping,1) — hugeping
2020-09-12 11:30:11


Не знаю почему, но я никогда не считал "День программиста" своим праздником.

Сегодня снова стало интересно, в чём тут дело?

Я помню, когда он только появился, я воспринял его как нелепость. И тоже не смог понять, почему? Просто какое-то странное чувство нелепости.

Наверное, я не воспринимаю день программиста как "профессиональный праздник". А именно так его и преподносят.

Я не воспринимал никогда себя как программиста в смысле профессии, ремесла. Я всегда только играл. С того самого момента, когда отец купил мне БК0010-01 и до сегодняшнего дня. И назвать это профессией для меня выглядит странным и нелепым. Что-то бытовое, скучное...

Нет, это не мой праздник.

# Re: Информационные следы или отцы и дети в кибернетической утопии
std.hugeping
hugeping(ping,1) — hugeping
2020-09-12 11:07:27


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

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

Наглядный пример противопоставления философия vs реальная жизнь. :)

# Как писать свободные игры и не сойти с ума
std.hugeping
hugeping(ping,1) — All
2020-09-12 10:35:15


// Опубликовано Aug 24, 2018

Писать код с художественной точки зрения очень интересно. На работе программисты обычно пишут код, который является эффективным для той задачи, которую он решает. На самом деле, это довольно скучно. Так как чем больше ты профессионал в своей области, тем более “шаблонно” решается задача. Ты просто делаешь так как нужно и всё. Это становится ремеслом. Профессиональный программист сегодня — это ремесленник.

Поэтому я очень хорошо понимаю программистов, которые пишут игровой код для “души”. Проект INSTEAD и возник как реализация такой вот отдушины. В первую очередь он ориентировался на программистов — лириков.

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

Вот, ты написал историю, которая тебе самому кажется классной. Что дальше? Современная жизнь инди-разработчика подчиняется довольно прагматичным правилам. Продвижение своей игры “по взрослому” требует денежных вливаний, времени и запасов валерьянки. Это всё означает, что проще и правильнее играть по правилам до конца — становиться частью рынка и продавать свои игры, чтобы пытаться окупить свои затраты.

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

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

Свои последние игры Другой Марс http://instead-games.ru/game.php?ID=298 и Вахта http://instead-games.ru/game.php?ID=292 я пытался “продвигать” доступными мне способами, оставаясь в рамках свободного движения. Что именно я делал?

- Я попытался оживить нашу группу vk, https://vk.com/instead.club создавая на стене новости и отчёты о проделанной работе. Также включил кросспостинг в фейсбук.
- Я публиковал новость о “Вахте” в одной из крупных групп vk (название сейчас не вспомню).
- Наш старый jabber чат был интегрирован с чатом в Telegram, https://t.me/insteadtalk что в теории сделало наш чат доступней для потенциальных энтузиастов.
- В канал Telegram https://t.me/insteadclub (не путать с чатом) я также регулярно постил новости. Не говоря уже о своём twitter. https://twitter.com/peter_ru
- Я опубликовал игры на gamin.me. Здесь https://gamin.me/posts/19471 и здесь. https://gamin.me/posts/19616
- Я создал страничку на itch.io со своими играми. https://instead.itch.io/
- Я опубликовал новости на linux.org.ru. Одна из новостей — прошла. https://www.linux.org.ru/news/games/14202683 Вторую https://www.linux.org.ru/forum/games/14385869 не пропустили из за деятельности троллей, превративших тему обсуждения в религиозный спор. Подробности. ii://mwVQifrW5SHpOBeJ9niI И пояснения. ii://lYZ4akEqAiKPfIZKs1gX Забавно, но похоже “чёрный” пиар дал лучший эффект. Это и грустно и смешно.
- Я опубликовал новость на opennet. https://www.opennet.ru/opennews/art.shtml?num=49078
- Я писал о некоторых своих играх на reddit (лень искать ссылки).
- Я опубликовал две статьи на dtf.ru. https://dtf.ru/indie/24627-moy-indi-proekt-dlinoy-v-10-let https://dtf.ru/indie/24598-parsernaya-igra-drugoy-mars
- Я присутствовал в mastodon https://mastodon.social/@hugeping , idec и zeronet (как примеры “альтернативных” сетей).

Какие выводы я могу сделать?

С одной стороны, результат есть. Я узнал, что у моих игр существует целевая аудитория. И это сильно вдохновило.

С другой стороны, количество поигравших в мои игры, по меркам индустрии, очень мало. Я оцениваю это число в районе 2000 скачек (учитывая тот факт, что статистика web запусков не ведётся). Хотя, откровенно говоря, мне не очень интересна именно статистика. :)

Выкладывание игр на itch — практически ничего не даёт само по себе. Причина понятна. Для продвижения нужны рекламные показы. Площадки не создаются просто так, площадки зарабатывают. Когда на ресурсе представлены тысячи (или уже десятки тысяч?) игр, заметить конкретную игру практически невозможно.

Публикации в своем твиттере и ресурсах в соц-сетях ничего не дают. Это тоже понятно, нет подписчиков — нет хайпа. Я пытался подсунуть твит мэтрам западной интерактивной литературы. Это частично получилось, но ретвит сам по себе тоже дал очень мало. Кое что даёт публикация ссылок на reddit.

Хороший отклик я получил после размещения публикаций на dtf.ru. Наверное, это самый положительный опыт из всех попыток.

Интересно, но адресный выход на аудиторию “альтернативных” сообществ тоже работает. Последнее наблюдение наводит на интересные размышления.

Когда ты пишешь нишевую с точки зрения “мейнстрима” вещь, выход на нишевые же сообщества, похоже, неплохой вариант! Например, INSTEAD изначально работал только на Linux системах. Какой процент пользователей Linux? 3%? 4%?. Но в абсолютных цифрах это довольно много людей. И, проект, работающий на Linux может рассчитывать быть замеченным этой аудиторией! Какой процент пользователей FreeBSD? 1%? Однако, когда INSTEAD находится в портах этой системы, можно рассчитывать на то, что игры на нём будут замечены! Всё это даёт во много раз больше, чем простая публикация игры на тематическом форуме.

Ещё один пример. Размещение статей в ZeroNet с мизерной аудиторией. Однако, размещение этих же статей в блоге на medium.com осталось абсолютно незамеченным.

Камерный театр в спальном районе Москвы может рассчитывать на маленькую, но свою аудиторию! Школьная рок-группа тоже может на неё рассчитывать. :) Остальные примеры вы можете придумать сами. Думаю, что продвижение свободной игры, это все-таки в первую очередь ориентация на “свои” сообщества. А игра по правилам индустрии — это совсем другая история. Но только проблема в том, что “альтернативные” сообщества практически вымыты из современного коммерческого интернета…

Что касается меня, то я абсолютно измотан социальным взаимодействием и негативным (редким, но токсичным!) фидбеком. В очередной раз я понимаю: программировать и сочинять истории очень захватывающая вещь, но социальное взаимодействие — изматывает и подрезает крылья.

Что дальше? Не знаю. Но запасы валерьянки подходят к концу. :)

# Возвращение квантового кота: о чём игра?
std.hugeping
hugeping(ping,1) — All
2020-09-12 10:27:52


// Опубликовано Aug 23, 2018

Моя первая игра называется “Возвращение квантового кота”. Написана она была в 2009 году. Собственно говоря, с неё всё и завертелось.

По современным меркам игра очень простенькая, но если вы в неё не играли — попробуйте. http://instead-games.ru/game.php?ID=107

Об этой игре написано достаточно, поэтому я здесь не буду копи-пастить существующие статьи. Я же обещал оригинальный контент. :) Так вот, расскажу о том, какой смысл я сам вкладывал в эту игру.

Ниже будут спойлеры. Поэтому рекомендую читать этот текст после прохождения игры.

Вообще, это неправильный метод — рассказывать о своём творчестве в плане замысла. Часто бывает, что смыслы очень сильно зависят от восприятия конкретного человека. То-есть, это всегда диалог. И тем не менее…

Главный герой — бывший хакер, ныне дауншифтер, живущий вдали от цивилизации. После визита в магазин, у него похищают его единственного друга — кота Барсика. Фраза: “Я просто пришёл забрать своего кота” — становится девизом игры. Быстро выясняется, что похититель кота связан со зловещим институтом, который расположен недалеко от места событий.

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

В игре можно почитать рассуждения о квантовых парадоксах. В частности, о гипотетическом эксперименте Шрёдингера.

Скажу сразу, что на эту игру повлияло произведение С.Льюиса “Мерзейшая мощь”. Если вы не читали её, я рекомендую эту книгу к прочтению. Образ “зловещего института” взят оттуда.

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

Главный герой просто “знает” и просто “чувствует” сердцем, что эта истина является ложью. Он делает то, что должен — спасает кота (и мир за одно) не идя ни на какие компромиссы. Правда и любовь не нуждается в рационализации.

В качестве интересных деталей, могу привести использование сторон света. Зло — ассоциируется с западными направлениями. Добро — с восточными. Восход, закат. День и ночь.

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

Игра была встречена очень хорошо, не смотря на явные огрехи и ляпы в тексте, которые так и не были исправлены за эти 9 лет…

На этом пока всё. :) Stay tuned.

# Нелинейность в сюжетных играх
std.hugeping
hugeping(ping,1) — All
2020-09-12 10:23:11


// Опубликовано Aug 23, 2018

Недавно посмотрел ролик на YouTube про игру No Man’s Sky. Красивая игра. Одной из особенностей игры является то, что в ней широко применяется процедурная генерация. Примерно, как это было сделано в Elite, в которой генерировались звёздные карты, названия систем и экономика. Только в NMS этот приём выведен на новый технологический уровень. Генерируются формы жизни, поверхности планет и прочее и прочее.

В Elite игрок был свободен в выборе того, что он делает в мире игры. В NMS мы видим подобное. Искусственный мир без явного задания ограничений действий. Песочница. Успех Minecraft говорит нам, что такого рода игры могут быть популярными. Ещё один пример: Dwarf Fortress. Если честно, ни в одну из упомянутых игр я не играл. Во-первых, я вообще мало играю в современные игры. Во-вторых, я не большой любитель историй, рассказанных компьютером.

Когда речь заходит о сюжетных играх, очень многие высказывают мнение, что нелинейность сюжета — несомненное достоинство такого рода игр. Для меня это выглядит так, что для этих людей основной ценностью сюжетной игры является вариативность.

Вариативность может быть достигнута разными путями. Во-первых, мы просто можем заложить в игру различные ветви сюжета. Ввести различные концовки. Этот приём очень распространён в CYOA играх.

Во-вторых, саму игру мы можем выполнить в виде модели, которая пытается моделировать поведение героев, мотивы, эмоции…

Наверное, вы сейчас решили что это отличная идея, а я веду к тому, что симуляция в сюжетных играх — это прекрасно! Должен сознаться, лично я не вижу в этом подходе никакой творческой ценности.

Дело в том, что для меня, в сюжетных играх (как и в литературе, кино, театре) самым важным является не вариативность, а … сюжет! А сюжет — это раскрытие смысла! Как время в нашем мире это актуализация нашей свободы воли, так и сюжет игры служит цели раскрытия смысла!

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

Я написал только одну нелинейную игру, это “Карантин”. http://instead-games.ru/game.php?ID=124 В игре мы встречаемся с врагом, которого не знаем заранее. Фактически, это детективная история завёрнутая в стилистику рассказа Джона В. Кэмпбелла «Кто идёт?». Игра внутри себя представляет симулятор. Или, скорее, стратегию. Игра получилась очень сложной и… скучной. Да, есть люди, которым игра очень понравилась. Но для большинства игроков, она становится неинтересной после нескольких “прогонов”. Почему? Потому, что сюжет раскрывается после пары прохождений. А потом остаётся только вариативность, стратегия, интеллект… Но никакой художественной ценности…

Правда, в моей игре “Проводник” http://instead-games.ru/game.php?ID=247 две концовки. Но это тот случай, когда обе концовки просто усиливают друг друга.

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

Так книга или игра? Попробуйте написать сюжет, смысл которого был бы не в вариативности самой по себе, а в передаче некоторого замысла автора. А теперь, оформите сюжет в виде сотни параграфов с запутанными связями. Это не так то просто! В большинстве случаев, такая разбивка будет служить целям вариативности, но не передачи смысла сюжета. Вариативность, ради неё самой. Итак, жанр книги-игры хорош для развлекательной литературы, но драматическое произведение втиснуть в рамки вариативности — очень непросто.

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

Итак, чтение книг — это диалог с автором книги. И хорошо, когда автору есть что сказать. Но ведь в песочнице ребёнок играет, как будто, сам с собой? И это — тоже способ познания, в том числе — самопознания?

Да, попытка написать игру, в которой сюжет генерировался бы “случайно” и был бы интересен — сродни написанию симулятора мира, в котором мы живём.

И это всё хорошо работает лишь до тех пор, пока мы не пытаемся симулировать внутренний мир людей. Средуцированный до детерминированного алгоритма герой, не способен сказать нам что-то новое. Сознание — не алгоритм. (В качестве рекомендации к прочтению: “Новый ум короля” Р. Пенроуза).

Также, есть мнение, что смысл чего-либо рождается субъективно в читателе, а на авторе остаётся только нарратив. Без интерпретации. В таком случае, играя в песочнице, мы наблюдаем создание различных смыслов о которых мы как автор — не беспокоимся. Читатель (игрок) развлекает себя сам.

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

# Re: Спойлеры в клубе
std.club
hugeping(ping,1) — boscholeg
2020-09-11 21:20:35


> А как назад расшифровать? Зеркальцем воспользоваться?

Ага. Или мозгом. :)

# Re: Подкасты переехали на soundcloud
std.club
hugeping(ping,1) — artur
2020-09-12 11:31:54


> Но если не надо --> не буду

Смотри на своё усмотрение. Мне ещё тут предлагали в яндекс-музыку залить. Вроде бы есть раздел: не музыка.

Подкасты нужно писать рассчитанные на широкую аудиторию, все-таки. А сейчас так и вообще - видео.

Где я, где инстед и где видео? :)
P.S. Edited: 2020-09-12 11:31:49

# Re: Подкасты переехали на soundcloud
std.club
hugeping(ping,1) — artur
2020-09-12 11:32:19


> Ну я загружу туда.

Честно говоря, мне кажется наши подкасты там вызовут нездоровую реакцию. Может не стоит?

С другой стороны, смотри сам. Я осяду здесь, а соц-сети пусть живут где-то там. :)
P.S. Edited: 2020-09-12 11:32:13

# Re: Подкасты переехали на soundcloud
std.club
hugeping(ping,1) — artur
2020-09-12 11:32:35


> А можно подкасты загрузить в ВК?

Я честно говоря не знаю что и как там делать. И немного побаиваюсь vk. :) Пусть пока в soundcloud полежат. Тем более, что уже неактуальны.
P.S. Edited: 2020-09-12 11:32:31

# Re: Признание в любви к Го от старого сишника
develop.16
hugeping(ping,1) — boscholeg
2020-09-11 12:46:28


> Вы его так рекламируете. Что хочется прям почитать про этот ваш Го.

Если нравится Си, то понравится и Go. Хотя я был уже подготовлен Питоном и Lua, но всё-равно, думаю, понравится.

# Подкасты переехали на soundcloud
std.club
hugeping(ping,1) — hugeping
2020-09-12 11:31:15


В связи с переездом все подкасты INSTEAD перенесены сюда: https://soundcloud.com/hugeping
P.S. Edited: 2020-09-12 11:31:08

# Признание в любви к Го от старого сишника
develop.16
hugeping(ping,1) — All
2020-09-10 19:45:35


Что бы там не говорили злопыхатели, golang прекрасен! Пока делал ноду, полюбил его ещё больше. Конечно, пока пишу совсем не "идеоматичный" код, но начал постепенно его чувствовать.

Лично для меня это что-то вроде "Си" на стероидах. Что-то между низким уровнем (с его простотой) и современными более абстрактными языками. Идеален для написания бекендов!

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

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

Короче, Роб Пайк рулит! Спасибо за наше счастливое детство!

# Переезд состоялся
std.hugeping
hugeping(ping,1) — hugeping
2020-09-10 19:28:53


Вот и всё.

Дроплет syscall.ru на DigitalOcean, который служил верой и правдой 7 лет - дропнут. Долго не мог себя заставить нажать кнопочку Destroy. Заходил посмотреть "в последний раз". Но надо уметь выбрасывать старый хлам, чтобы освободить пространство, в том числе и для мыслей.

Так что, вместо syscall и вороха блогов теперь останется только https://hugeping.tk

Маленький, простой, быстрый...

P.S. https://syscall.ru и https://club.syscall.ru тоже работают, и ведут на https://hugeping.tk



# Re: Обновления ii-go (движка узла ping)
ping.local
hugeping(ping,1) — hugeping
2020-09-10 18:36:20


Теперь узел должен работать по https.

https://hugeping.tk или https://club.syscall.ru - должны работать.

Для обеспечения поддержки https используется reverse proxy: https://github.com/gl00my/ii-go/tree/master/contrib/secure

Зависимость autocert внешняяm, но компонент необязательный, поэтому принцип KISS ii-go не нарушен. :)

# Поведение клика на дату последнего сообщения на главной
ping.local
hugeping(ping,1) — hugeping
2020-09-10 11:00:49


Поменял поведение клика на дату сообщения на главной странице.

Теперь клик приведёт вас к последним 100 сообщениям в выбранной эхе. Тогда вы не пропустите новые сообщения из других топиков.

Чтобы вернуться в привычный вид топиков - нажмите на символ # у сообщения (перейти к сообщению) или на название эхи в шапке ноды.

# Перенос club.syscall.ru на станцию ping
std.club
hugeping(ping,1) — All
2020-09-10 10:38:52


Назад пути нет. Делегирую домены на сервера Яндекс. В относительно скором времени club.syscall.ru и syscall.ru будут указывать на станцию http://hugeping.tk

База поинтов не сохранится, но сообщения сохранятся. Если вы заинтересованы в общении на станции, уже можно регистрироваться на https://hugeping.tk
Новая станция больше похожа на форум.

Сервер крутится на малинке, как будет со стабильностью - не знаю. Статус проекта - личный арт-проект без всякой ответственности. http://hugeping.tk/rOf069UX8K24yAzvWa9N#rOf069UX8K24yAzvWa9N

В общем, поехали! :)

# Re: Малинка, как домашний веб сервер
pipe.2032
hugeping(ping,1) — boscholeg
2020-09-10 10:28:29


> Вот кстати вопрос доверия Гитхабу. Ты уверен что он не рухнет в одночасье?

Рухнуть может всё. В том числе собственный сервер (причём, вероятнее). Конкретно с instead я работаю на многих машинах, поэтому копии репозиториев есть. Не говоря уже о тарболлах в некоторых Linux дистрибутивах.

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

# Re: Малинка, как домашний веб сервер
pipe.2032
hugeping(ping,1) — boscholeg
2020-09-10 10:05:30


> Помнишь я тебе рассказывал про флэшки для промышленного применения?
> Их не зря советуют брать для одноплатников.

Да уж, ну, будем смотреть. Бекапов мало, важность ресурса - низкая. Так что не так страшно, надеюсь...

Все INSTEAD ресурсы я уже давно перенаправлял на github. Так что на малине только этот личный проект + боты для метапарсерных игр и чата.

# Re: Малинка, как домашний веб сервер
pipe.2032
hugeping(ping,1) — btimofeev
2020-09-10 09:31:45


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

Ого, интересно. Уже делаю бекап...

# Re: http://hugeping.tk как арт-проект
std.hugeping
hugeping(ping,1) — hugeping
2020-09-10 09:13:19


Ну и у всех этих /rss ссылок можно убрать rss - будут просто странички.

Вообще, все эти ссылки доступны из интерфейса. Потыкай в заголовке на название эхи на разных страничках - разберёшься.

# Re: Bolder Dash с БК0010–01
std.hugeping
hugeping(ping,1) — boscholeg
2020-09-10 09:11:55


> На БК можно было писать программы, но сохранять в память их учитель не разрешал.

Да, помню такая же штука была. Писал игру. Поиграли. Выключили - всё. :)

> Обязательно попробую поиграться и сыну покажу.

Там есть встроенный спрятанный редактор. На компе кажется нажать E в момент выбора уровня или в самом уровне. А на андроиде, какая-то хитрая комбинация касаний. :) У меня сын делал уровни с интересом и давал мне проходить. Ещё игра пишет демки прохождений.

# Re: http://hugeping.tk как арт-проект
std.hugeping
hugeping(ping,1) — boscholeg
2020-09-10 09:08:13


> Петр чем читать новые сообщения? Есть какой-то клиент?
Где про это почитать?

Вообще, вот: https://ii-net.tk/

Но можно просто RSS зацепить: ii://MaNXQnvizFFCxbmm7303

# Re: http://hugeping.tk как арт-проект
std.hugeping
hugeping(ping,1) — boscholeg
2020-09-10 08:19:01


> Если бы тут не тусовались одни программисты и им сочувствующие, я бы решил, что ты хочешь отвадить всех.

Ну, когда ты начинаешь думать о том, чтобы привлечь кого-то - начинаются компромиссы. :) А тут пока их просто нет. Всё прям так, как я хотел. :)

# http://hugeping.tk как арт-проект
std.hugeping
hugeping(ping,1) — hugeping
2020-09-10 07:59:06


Чем больше шлифую ii-go, тем больше мне нравится то, что получается.

Откуда во мне появилась тяга к такой вот экстремальщине? Не знаю.

Процесс, похоже, идёт последовательно.

Сначала мне понравился Linux, потом тайловые оконные менеджеры, потом OpenBSD, потом заинтересовался Plan9...

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

А вот с играми или тем же ii-go, ты никогда заранее не знаешь, что из этого всего выйдет. :) Нода, конечно, не получилась совсем уж минималистичной. Думаю, она занимает около 64кб кода на go. Но всё-таки, если сравнивать с мейнстримом...

В общем, иногда нужно вот так встряхнуться, сбросить тонны bloated слоёв и ... полететь... :)



P.S. Вот взять даже эту картинку. Что бы мы сделали на нормальном форуме? Фигак jpg на 1мб, фигак аттач. Форум фигак в postgresql. А тут? Я нашел картинку, довёл ее до нативного разрешения, привёл к 4-цветной палитре и вставил в тело сообщения. Сообщение превратилось в base64 строку и добавилось в конец текстового файла базы. Ну, разве это не прекрасно? :) Почувствуйте красоту в простом!

# Re: ii-tool clean
ping.local
hugeping(ping,1) — hugeping
2020-09-10 07:29:53


Долго думал, какую favicon поставить для узла. В итоге, остановился на этом:



# Re: Пишу ноду ii/idec на go
idec.talks
hugeping(ping,1) — hugeping
2020-09-10 06:10:23


> Да. Все что после него это base64. Вообще, может быть стоит сделать по другому. Я сделал как было проще...

Вообще, я думал про начало/конец тега base64. И в веб версии это будет шикарно, в том числе и для картинок. Но если такое внедрять в консольные клиенты, всё-таки, одно сообщение - один base64 аттач - это более понятная и простая схема...

В любом случае, если назреет какой-то стандарт на эту тему, попробую поддержать. :)

# Re: Пишу ноду ii/idec на go
idec.talks
hugeping(ping,1) — Andrew Lobanov
2020-09-10 05:44:16


> Главное, чтобы в x/c правильно отображалось :)

Очень надеюсь, что багов не будет. Хотя опыт показывает, что когда всё работает сразу, это означает наличие скрытых багов. :)

# Re: Пишу ноду ii/idec на go
idec.talks
hugeping(ping,1) — Difrex
2020-09-09 22:40:26


> Фетчу тебя. Пока все идет нормально.

Отлично! :)

Pages: 1 2