All streams
Search
Write a publication
Pull to refresh
193
0.8

Программист

Send message

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

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

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

Может быть просто не брать 100500 тонн работы на себя и просто слать когда тебе накидывают сверх?

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

Я попробовал, но не понял, что делать с генератором, квадрат которого равен нулю. Я даже для случая с e_1^2=1 и e_2^2 = 0 что-то не смог придумать матрицы 2x2, чтобы выполнялось е_1 e_2 = -e_2 e_1 и e_1 e_2 != +-e_2

Хм, не знал про такой способ, интересно получается!
Но я для себя это решил тем, что просто сгенерировал классы и специализированные методы умножения для каждой пары классов. Потому что на самом деле перемножать мультивекторы особо и не надо, нужнее двигать плоскости-бивекторы-точки с помощью мотора, и когда у плоскости или точки 4 параметра из 16, а у мотора 8 из 16 - умножение упрощается и ускоряется в разы.

Ну я например большую часть статей-победителей технотекста увидел впервые, хотя хабр вроде как регулярно просматриваю.
В категории ML Senior победила статья с рейтингом +24 (даже не +25): https://habr.com/ru/articles/780116/
При этом статья хорошая, но например с фильтром на +25 в ленте её просто не увидеть, а с фильтром +10 статей очень много.

Для сравнения откройте блог какой-нибудь топовой компании и прикиньте, сколько статей они публикуют за год и какая доля из них обладает рейтингом ниже 25: https://habr.com/ru/companies/selectel/articles/

https://ru.wikipedia.org/wiki/Теория_принципала-агента

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

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

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

Но в принципе там и j2me не сложная - а мидлет паскаль всё-таки довольно ограниченный.
Я когда-то давно писал код на midlet pascal, декомпилировал, смотрел что получилось на java и так потихоньку её освоил, а потом возвращаться на паскаль что-то уже не хотелось.

Из того что запомнилось - в midlet pascal boolean выражения вычислялись жадно (с точки зрения байткода там вообще преобразование boolean в байт и умножение или сложение), код вида if (a != null and a.isNotEmpty) надо было записывать в виде if (a != null) if (a.isNotEmpty), чтобы на нулевой строке не вызывалась вторая проверка.

И ещё в midlet pascal не было нормального ООП и возможности динамически создавать объекты, были только структуры и массивы структур, которые приходилось объявлять статически или как переменные внури функции.

Что-то сильно большое по объёму на паскале было сложно написать.
Но из плюсов - он действительно был очень простым.

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

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

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

Кстати по аналогии с развёрнутым списком существует "развёрнутое" дерево: https://en.wikipedia.org/wiki/2–3–4_tree

Причём для случая с 2-4 листами у вершины в одном "слое" дерева получается сразу два "слоя" красно-чёрного дерева (чёрная вершина и её красные дети, если они есть)

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

Да, разбираюсь Plane-based потихоньку. Наверно, через какое-то время напишу статью на хабр. У меня есть статья про вращение тел и момент инерции - напишу то же самое в терминах Plane-based GA (примерно как в книжке на сайте, но хочу код самостоятельно написать и убедиться, что всё правильно понял)

Путаница между projective и plane-based заметно увеличила порог входа, причём начинал осваивать первую, а потом пришёл ко второй и не сразу понял что они разные :(

Можете написать ссылки на статьи по этой теме?

В десктоп можно сразу поставить хорошие комплектующие и ценник при этом будет не космический.

Например, я в 2020 собрал десктоп и поставил туда 64 гб памяти. Ноутбуки с таким объёмом памяти раньше стоили дорого (да и в сейчас какой-нибудь эппл считает что 8-16Гб хватит всем).

Ssd добавлял по мере необходимости. При сборке поставил один nvme + два харда от старого пк. Сейчас у меня два в nvme и ещё два sata ssd. В ноутбук столько не поместится.

Год назад видеокарту обновил с 2060 на 4080 (потому что я увлёкся нейронками и захотелось побольше памяти и видеокарту помощнее). Старую видеокарту я переставил в десктоп жене (там была 1060, теперь 2060).

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

Вместе с видеокартой решил купить корпус. Старому было лет пятнадцать и состояние у него было ужасное. Но мог бы и не покупать.

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

Такой вот десктоп Тесея с возрастом лет в 15, в котором потихоньку заменяются все детали по мере поломок или устаревания.

Я правильно понимаю, что вы кодируете переносы с помощью комплексных чисел?

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

А в 4д будет 4 переноса, но 6 поворотов.

С дополнительным базисным вектором это всё красиво выражается - например для 2д будет w, x, y и бивекторы wx, xy, xy, где wx и wy относятся к переносу, а xy описывает поворот.

Как подход с комплексными числами и без дополниьельного вектора обобщить на произвольное количество измерений?

Я сейчас потихоньку пишу текст про проективную геометрическую алгебру. Она кроме вращения ещё и переносы кодирует.

И знаете что? Очень сильно похоже, только там вместо матриц Паули будет скаляр 1, вектора x, y, z и их комбинации (бивектора) xy, xz, yz, а так же xyz (тривектор и в данном случае псевдоскаляр). И точно также квадрат каждого вектора равен единичке.

И вращение будет точно такое же в виде q r q^-1 = a b r b^-1 a^-1.

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

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

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

e^q = 1 + q + \dfrac{q^2}{2!} + \dfrac{q^3}{3!} ... = 1 + q + 0 + 0 + ... = 1 + q

Это позволяет кодировать перемещение (например, если бивектор v описывает линейную скорость, то перемещение - это exp(vt) = 1 + vt, а если вращательную, то там будет exp(vt) = cos(|vt|) + vt sin(|vt|) / |vt|

Подробнее можно глянуть тут: https://bivector.net/

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

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

https://aws.amazon.com/s3/pricing/
Просто для оценки - хранение одного терабайта в месяц будет стоить порядка 10 долларов, одного петабайта - $10к в месяц, что сравнимо с зарплатой всего лишь одного сотрудника в apple.

Потом на этих данных можно поучить нейронку - например, предсказывать платёжеспособность клиента по истории покупок

Попробовал на третьей скале

  trait Конюх
  trait Лекарь
  trait Поп
  trait Писарь
  trait Князь

  trait МожетПоднятьТяжесть[-Кто]
  given МожетПоднятьТяжесть[Конюх | Поп | Князь] = ???

  trait ЗнаетГдеПерстень[-T]
  given ЗнаетГдеПерстень[Лекарь | Писарь] = ???

  trait ИмеетКлюч[-Кто]
  given ИмеетКлюч[Поп | Писарь] = ???

  trait Должен[Кто, Кому]
  given Должен[Конюх, Лекарь]= ???
  given Должен[Поп, Князь]= ???
  given Должен[Князь, Писарь]= ???

  trait Друзья[A, B]
  given Друзья[Лекарь, Князь]= ???
  given Друзья[Князь, Лекарь]= ???
  given Друзья[Конюх, Поп]= ???
  given Друзья[Поп, Конюх]= ???

  trait Thief[T]
  given [T](using ИмеетКлюч[T], МожетПоднятьТяжесть[T], ЗнаетГдеПерстень[T]): Thief[T] = ???
  given [T, U](using Друзья[T, U], МожетПоднятьТяжесть[T], ИмеетКлюч[U], ЗнаетГдеПерстень[U]): Thief[T] = ???
  given [T, F, D](using Друзья[T, F], МожетПоднятьТяжесть[T], ЗнаетГдеПерстень[F], Должен[D, T], ИмеетКлюч[D]): Thief[T] = ???

  summon[Thief[Писарь]]
  summon[Thief[Поп]]
  summon[Thief[Конюх]]
  summon[Thief[Лекарь]]
  summon[Thief[Князь]]

Компилятор (и кстати IDEA тоже) ругается сразу на четыре строчки, а на summon[Thief[Князь]] не ругается.

Ещё в третьей версии языка появились лямбды для типов

type МожетПоднятьТяжесть[Кто] = Кто match
  case Конюх | Поп | Князь => Кто
  case _ => Nothing

В идеале хотелось бы использовать факт что `T | Nothing == T` и собрать в одно выражение, чтобы считалось так:

Вор[Писарь] | Вор[Поп] | ... = Nothing | Nothing ... | Князь = Князь

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

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

Государство и так собирает транспортный налог, акцизы на бензин, пошлины на ввоз авто, утилизационный сбор, строит платные федеральные трассы, требует покупать осаго, а для получения прав - учиться в автошколе и потом платить пошлину за изготовление прав в ГИБДД.

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

Information

Rating
1,828-th
Location
Белград, Сербия
Registered
Activity

Specialization

Software Developer, ML Engineer
Kotlin
Scala
Java
Python
Neural networks
Algorithms and data structures
Android development
OpenGL