dev optozorax
4.19K subscribers
345 photos
53 videos
10 files
275 links
По деловым предложениям: optozorax.work@gmail.com.

Связь с админом через личку канала (кнопка в канале слева снизу).

Ютуб: https://www.youtube.com/@optozorax

Сайт: optozorax.github.io
Download Telegram
dev optozorax
Как известно, я решил задачу "что будет если поместить портал в портал". Я написал программу, которая проводит вычисление этого, и срендерил результат. По этому поводу я опубликовал маленькое видео на ютубе, а затем запостил это видео на реддите, и оно там…
Спасибо всем за поддержку, пост набрал 2.8к апвоутов и остановился в подъёме. А теперь немного размышлений по поводу реддита.

Я опубликовал данный пост в r/Portal, где находится 98к подписчиков, и где за всё время самый успешный пост набрал 5к апвоутов. Это означает, что насколько бы хорош мой пост ни был, он вряд ли наберёт больше 5к, потому что на это влияет не только качество поста, но ещё и много других критериев, которые должны сойтись вместе одновременно. А я видел, что обычно всякие крутые вещи на реддите набирают >40к апвоутов, и рассчитывал примерно на это. Я думал, что у реддита есть аналог трендов, и что любой пост может взлететь до небес, если он хорош. А оказывается, нет, и если хочется взлететь до небес, нужно публиковаться в изначально популярном сабреддите.

Ещё пост набрал 2.8к апвоутов, и 70 комментариев, в то время, как тот же самый пост на пикабу набрал 2.4к апвоутов, но 469 комментариев. Плюс на пикабу я опубликовал это с предысторией и приложил видео на ютубе, в котором до момента входа ждать наверное секунд 30. Но, тем не менее, его оценило много людей, и посмотрело много людей. Отсюда можно сделать вывод что пикабу является хорошей площадкой с лояльной и активной аудиторией.

Ещё один вариант как можно увеличить охват на реддите - это кросс-посты. Как я выяснил, нельзя кросс-постить в самые релевантные для моего поста сабреддиты: r/gifs, r/gaming, r/interestingasfuck, r/nextfuckinglevel. Туда можно постить только "оригинальный" контент.

Но можно кросс-постить в менее поулярные сабреддиты, и я постнул в r/DrosteEffect, и какой-то чувак кросс-постнул в r/Recursion.

Теперь я обнаруживаю, что мою гифку перезалили, и опубликовали в r/interestingasfuck, и там пост набрал 4.3к апвоутов.

Я принял правильное решение, что разместил ватермарку посередине картинки, потому что учитывая масштабы копипасты постов, это единственный способ как можно найти оригинал. В будущем думаю сразу размещать ссылку на этот телеграм-канал, написав: t.me/optozorax_dev. Раньше у меня ватермарка была слабо видно, и она была в левом углу картинки, благодаря этому какое-то сообщество в вк, обрезало мою анимацию квадратом, и моей ватермарки как и не бывало.

Так же я принял правильное решение, что в гифке сразу перешёл к делу и показываю процесс входа через 1 секунду от старта, а весь нужный контекст предоставляю в заголовке. Так часто делают, и это работает. В этом плане мою ютубовское видео просто ужасно, потому что оно повторяет заголовок, вводит много ненужной информации в начале, и вообще там всё медленно происходит. Весь процесс можно ускорить в 1.5 раза, и ничего плохого не случится. Так же, если бы я сделал видео максимально коротким, то на ютубе шансов завируситься было бы намного больше, потому что люди на ютубе всегда пишут: "If this video less than a minute, and YouTube recommends it to me, I definitely watch it.".

Будущие посты-гифки по этой теме я планирую публиковать в r/gaming, или r/nextfuckinglevel, и уже потом кросс-постить это в r/Portal (туда кросс-пост разрешён).

Надеюсь эта информация вам пригодится, если вы захотите что-то постить на реддит и получить максимальный охват.
В статье про мою раскладку были написаны идеи как её можно улучшить. Так вот, я реализовал их все! Теперь в моей раскладке:
• Цифры расположены в форме нумпада.
• Аналогично и F-клавиши.
• Заюзал аккорды на цифроряде.
• Утащил мышь на левую руку.
• На слое мыши сделан свой собственный. автоповтор, который позволяет передвигать мышь на 1 пиксель быстро при зажатии.
• Сделал отдельный слой для символов набираемых через .XCompose.

По поводу аккордов на цифроряде — мне очень нравится. Так же, благодаря этому, я утащил Once Shift на мизинец без аккорда, и мне кажется он нажимается в миллион раз приятней, чем на аккорде.

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

Ну и остального по мелочам.

Мне очень интересно, с такими темпами к чему я приду через несколько лет.
Папки «Спам» быть не должно. #мысли

При регистрации на каком-то сайте очень часто используется электронная почта в качестве способа активации. И практически на любом сайте после отправки письма пишут: «Проверьте папку "Спам", письмо может случайно попасть туда». В этом главная проблема. Данную папку нам навязывает любой почтовый сервис, письма складываются туда по каким-то магическим алгоритмам, главное свойство которых в том, что они ошибаются.

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

Я считаю что папка «Спам» должна отсутствовать по умолчанию. Всё должно делаться на основе фильтров, и для фильтров должны быть жирные кнопки и более удобный и доступный интерфейс.

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

Вот, например, пришло вам письмо во входящие, а вы видите что это спам. Как с ним бороться, если такой папки нет? Для этого придумана концепция фильтров. Можно вручную поставить фильтр на автоматическое удаление подобных писем. В обычных почтовых сервисах для этого надо заходить в настройки и разбираться в том как работают фильтры, и смотреть на кучу полей, поэтому так никто не делает, и всем лень. Поэтому нужно упрощать интерфейс, например вместо кнопки «Пометить как спам» можно поставить кнопку для самого частого кейса создания фильтра: «Удалять все письма от этой почты». Ну и конечно, после нажатия этой кнопки все письма от данной почты тоже должны автоматически удалиться, потому что никто не полезет в настройки чтобы сделать это вручную, и потому что вспоминаем свойство. Отлично, теперь 90% кейсов использования папки «Спам» уничтожено.

Другой кейс спама — это когда человеку каждый день пишут самые разные почтовые ящики, и он просто физически не сможет фильтровать их все самостоятельно. Мне кажется только в таком случае должна быть кнопка «А давайте вы мне дадите папку спам, и заюзаете ваши магические алгоритмы». Хотя даже для этого случая я бы не стал доверять алгоритмам, и сделал по-другому. В данном случае можно создать концепцию «Доверенных почт/доменов почт». При данной концепции должны быть две папки входящих: неизвестные и известные. Все письма от неизвестных почтовых ящиков должны складываться в соответствующую папку, аналогично известные. Должен быть список всех известных почт, который можно настроить и посмотреть в настройках. И снова, при встрече соответствующего письма, в настройки никто лезть не будет, поэтому чтобы сделать какую-то почту доверенной, в каждом письме просто должна быть кнопка «Сделать доверенной почту, отправившую это письмо», аналогично наоборот. И сразу после этого все письма от этой почты должны переместиться из папки неизвестных в папку известных, потому что свойство. Таким образом, человеку могут писать хоть тысячи разных спамовых почт ежедневно, но он никогда не пропустит важную почту, и никакие папки «Спам» не нужны.

Вот и всё, теперь мы не только избавились от идиотской концепции папки со спамом, но ещё и создали в сотню раз более мощный, удобный и полезный интерфейс, который усиливает своего пользователя, а не ослабляет.
This media is not supported in your browser
VIEW IN TELEGRAM
В процессе решения задачи о вхождении портала в портал я осознал, что порталы могут быть не только плоскими, но ещё и поверхностными.

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

Справа показано как треугольник обрезается при входе в данный портал.

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

А ещё, поверхностные порталы можно покрутить в моей программке.
Мне вот интересно. А что произойдёт со стандартной библиотекой Rust, когда в него добавят GAT или дай бог HKT? Будет ли стандартная библиотека полностью перепроектирована, и переосмыслена, или туда просто будут вставлять новые трейты, или может вообще ничего вставлять не будут, оставляя переосмысление std коммьюнити? Будет ли система ревизий использоваться для того, чтобы создать новую версию обратно несовместимой стандартной библиотеки?

Есть ли у кого-то понимание или официальные заявления от разработчиков языка?

#обсуждение
Недавно я услышал интересную идею о том, чтобы создать портал в форме ленты Мёбиуса.

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

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

⬇️
This media is not supported in your browser
VIEW IN TELEGRAM
Чтобы лучше понять что я имею ввиду, давайте взглянем на эту гифку. Здесь представлен цилиндр, который телепортирует входящий в него свет зеркально относительно горизонтали. У этого цилиндра есть только боковая поверхность, и нету верхней. Поэтому когда мы смотрим на него сверху, мы можем видеть его внутренности.

Если смотреть на него так, что луч пересекает его два раза, то всё выглядит как обычно (зеркало + зеркало = нормально). Тут важно заметить, что в начале гифки мы видим синий пол через него. Но если смотреть на него так, чтобы луч пересекал поверхность один раз, то мы на месте пола увидим белый потолок. В этом и заключается суть зеркалирования. Представьте что то же самое делается и в ленте Мёбиуса.

⬇️
Сначала я хотел сделать ленту Мёбиуса через полигональные порталы, но быстро понял что это тупиковый путь, ибо не получается смапить вход и выход, а там нужно чтобы полигоны совпадали на 100%. Тогда я решил пойти другим путём — брать отрезок на ленте Мёбиуса, и в этом отрезке телепортировать входящий луч света зеркально. По идее, раз мы теперь оперируем отрезками, а не полигонами, то всё должно работать.

Более формально, если взглянуть на параметрическое представление ленты Мёбиуса, то мне нужно найти в какой точке (u, v) что-то касается этой ленты, затем просто умножить v на -1: (u, -v), и преобразовать эти координаты обратно к (x, y, z).

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

В рейтрейсинге луч обычно представляется в виде o + d*t, где o(origin), d(direction) - это вектора, а t - скаляр, который необходимо найти.

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

Но, это получается уравнение с тремя неизвестными (t, u, v) и тремя уравнениями. Значит решение можно найти численно! Благо на 3 курсе у нас были лабы на написание многомерного метода Ньютона (узнать который я мечтал ещё со школы), так что как я его понял, сразу оформил это в виде математической статьи, чтобы кто угодно (понимающий математику), тоже мог им воспользоваться, вот ссылка на эту статью, там же рядом лежит pdf'ка.

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

⬇️
Я думал что всё потеряно, что вот он мой конец. Но через какое-то время мне пришла идея, что можно свести многомерный поиск к одномерному. Если внимательно посмотреть на параметрическое уравнение ленты Мёбиуса, то можно заметить следующее: при фиксированном u оно превращается в уравнение прямой! А ещё можно заметить, что если зафиксировать v = 0, то у нас получится уравнение окружности!

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

⬇️
Раз лента Мёбиуса при фиксированном u превращается в уравнение прямой, значит можно аналитическим образом найти расстояние между двумя прямыми. А это расстояние можно использовать в одномерном методе Ньютона, чтобы его минимизировать, и найти такое u, при котором это расстояние равно нулю, то есть луч пересекает прямую с поверхности, то есть саму поверхность!

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

Ещё тут важно обратить внимание на то, что u передаётся только в периодические функции, а значит оно должно быть в пределах [0; 2π), и в таком случае лучше обрезать эту переменную по этим границам, когда к ней прибавляется Δu, иначе решение будет сходиться очень плохо (проверено на практике).

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

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

⬇️
Итак, я теперь наконец умею рисовать ленту Мёбиуса рейтрейсингом, и при этом для каждого луча я умею получать в каких (u, v) на ленте он находится. Вот как это выглядит на поверхности.

⬇️