Pull to refresh
600
7
Александр Гончаров @kesn

Какой-то чувак

Send message

Вы ещё забыли добавить, что EvaTeam разрабатывается ООО Карбон Софт, которые делают любимый всеми DPI, как сами говорят:

Самый популярный DPI в России - более 1200 инсталляций

https://www.carbonsoft.ru/products/carbon-reductor/

Публика требует подробностей!

Ага, я неправильно написал в статье :(

Self нужен в основном, чтобы аннотировать classmethod'ы - этот type hint означает, что возвращается инстанс текущего класса:

@classmethod
def foo(cls, param) -> Self:
    return cls(param)

Никогда не видел, чтобы кто-то аннотировал self

  1. ask forgiveness, not permission некоторыми считается каноническим питоном. Но нужно использовать с умом: если ожидается, что чаще всего значения не будет, то исключения, конечно, добавят оверхед, и желательно их избегать.

  2. Вообще считаю неуместным говорить про скорость в питоне - он не быстрый по определению. У вас вон в цикле конкатенация строк, я ж не жалуюсь :) Поэтому я считаю, что писать нужно максимально простой и читаемый код (и если suppress позволяет этого достичь - то не вижу причин не использовать его только из-за гипотетического оверхеда). Если видим, что тормозит - тогда да, начинаем оптимизировать или берём какой-нибудь numpy / rust.

Python просто не позволяет выразить это намерение явно средствами языка

if val := dic.get(key):
     print(val)

или

with suppress(KeyError):
    val = dic[key]
    print(val)

И ещё: автоматическое скачивание модуля при использовании - это очень, очень плохо. Как насчёт version pinning / dependency resolution / указания репозитория, откуда скачивается? Это лишь малые проблемы, которые сходу приходят в голову.

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

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

Вот, например, неправильная подсказка, потому что автор забыл про то, что это 4D вектор:

кому интересно формат вот такой
Vertices[count]={x1,y1,z1,x2,y2,z2,x3,y3,z3................................}

Или вот чел наступил на те же грабли, что и я:

Ok, so I decided to use the test_trimesh trimesh to make sure everything was working ok.
So everything seems to work fine, but I get an error in my collide callback
I get a fat access violation.
Urrrrrrrrrrrrrgh this triangle collider is really making me mad ><

И вот ещё один погорелец:

float vertices[vCount * 3] = {
0,0,0,
20*30,0,0,
20*30,0,20*30,
0,0,20*30
};

Вы использовали double precision и фиксированный шаг симуляции? Если да, и при этом всё равно словили глюки, то это печально

Я не поленился:

Why is dVector3 the same size as dVector4? Why is a dMatrix not 3x3?
For making it SIMD friendly. i.e 16 byte aligned (there is no SIMD code in there right now, but there may be in the future).

http://ode.org/wiki/index.php/Manual#Why_is_dVector3_the_same_size_as_dVector4.3F_Why_is_a_dMatrix_not_3x3.3F

Ну прям совсем ноунейм не добавили бы в репозитории убунты и, в особенности, дебиана :) Но да, там маленькое коммьюнити. Питон, знаете, тоже когда-то был ноунейм)

Разрабы говорят, что четыре координаты нужны для "better alignment", наверно для работы с кватернионами там им удобнее, когда сразу 4x1, чтобы память не перекладывать.

Кубики работали, потому что у них интерфейс без этих выкрутасов с векторами, просто задаются размеры куба, и готово: proc createBox*(space: dSpaceID; lx: dReal; ly: dReal; lz: dReal): dGeomID. Ошибиться сложно, даже для меня :)

  1. Отдельные поля класса - этот сниппет кода прилагался к задаче, идея организаторов. Я бы до такого не додумался, наоборот, выбесило знатно.

  2. Этот код не для продакшна, его 1 (или 0) раз посмотрят и выбросят навсегда. В этом контексте считаю шутейки уместными.

Во-первых, она Арина. Во-вторых, в отличие от Ивана, она свой код в публичный доступ не выкладывала, поэтому вот так вот лихо им делиться без её согласия я не могу ¯\_(ツ)_/¯ Если вы сгораете от любопытства, то можете написать ей сами - легко ищется во вконтакте.

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

? Сбер подвел итоги конкурса красоты кода

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

— В конкурсе приняло участие более 1000 человек со всей России;
— Свои призы забрали программисты и разработчики из Москвы, Санкт-Петербурга, Самары, Владивостока, Томска, Иванова, Барнаула, Краснодара и других регионов России;

?Среди 15 победителей оказалась и 1 настоящая краса кода — девушка-прогер.

Победители были награждены новенькими iPhone 14 и смарт-колонками SberBoom Mini. Церемония награждения состоялась на конференции SmartDev

https://t.me/c/1396952381/9755

У нас есть подписки (Subscription) и платежи (SubscriptionPayment) с ForeignKey к подписке.
Есть функция для продления подписки. Пусть она вызывается параллельно из 2 потоков.

Первый поток:

  1. Находит Subscription, которую пора продлевать

  2. Ищет, был ли SubscriptionPayment, скажем, за последние 3 дня - не находит - значит, пора списывать

  3. Триггерит внешний API для списания денег клиента

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

  1. Находит Subscription, которую пора продлевать

  2. Ищет, был ли SubscriptionPayment, скажем, за последние 3 дня - не находит - значит, пора списывать

  3. Триггерит внешний API для списания денег клиента

Первый поток:
4. Если внешний API отработал без ошибок, то создаёт SubscriptionPayment

Второй поток:
4. Если внешний API отработал без ошибок, то создаёт SubscriptionPayment

SELECT_FOR_UPDATE делает так, что на первом шаге один из потоков получает блокировку на Subscription, и второй поток ждёт, пока первый поток не разлочит Subscription в конце транзакции (т.е. уже после создания SubscriptionPayment). Когда второй поток переходит к шагу 2, он уже находит существующий платёж.

Если я где-то туплю - дайте знать. Я могу.

1
23 ...

Information

Rating
833-rd
Registered
Activity

Specialization

Backend Developer
From 500,000 ₽
Python