Обновить
89
0
Сергей Шашков@ShashkovS

Менеджер продукта, методист, разработчик

Отправить сообщение

«уязвимость» в том, что если проект почему-то требует слишком много оперативки/ресурсов, то npm ломается. Вместо «npm ломается» должен быть внятный memory limit error. А уж почему он требует слишком много — можно разбираться потом. И можно даже забанить автора «злого» пакета за abuse системы.

Вообще это феерично: вместо исправления уязвимости «отработало с администрацией GitHub возможность скрытия этого проекта на ресурсе»...
Кроме того, что сам подход к проблеме феерический, очевидно, что теперь будет много желающих сделать что-то подобное.

Вот эта страница https://learn.javascript.ru/class (и следующие за ней) куда более информативна.

У питона, безусловно, есть свои проблемы.
Но в смысле универсального доступа к "достижениям человечества" у питона немного альтернатив. У Kotlin и C# есть свои ниши, не вполне универсальные.

ИМХО, у обучения C++ как первому языку программирования должна быть какая-то внятная мотивация. Условно, если хочется школьником взять всеросс по информатике, то от C++ не уйдёшь. Плюсы — сложный язык с очень сложным взаимодействием с библиотеками.

В моём случае речь о питоне.
Так что завтра — точно. Через пять лет — не факт, но это и не важно: если 5 лет не пользоваться языком, то всё забудется.
Ну, то есть одна из моих личных мысленных KPI при обучении программированию: доля школьников, которые в пределах года после обучения смогли решить какую-то свою задачу при помощи программирования.

Ох уж эти ценители стюардесс

Если серьёзно, то когда-то давно ~25 лет назад Pascal был моим вторым языком программирования после года с basiс и каким-то учебником. И тогда мне требовалось полгода, чтобы на Pascal сделать что-то интересное и красивое.
Может быть, PascalABC и вправду чем-то хорош как учебный язык. Но я как преподаватель не хочу связываться с подобными учебными языками: ученики может и поймут какие-то концепции лучше, но в большинстве своём никогда в своей жизни ни для какой своей потребности им не воспользуются. То есть обучение пройдёт только ради обучения.

Классная идея и реализация!
Было бы любопытно сравнить этот результат с каким-нибудь Javascript-движком.

Слово должно быть другое. Например, «Передохнуть»

А что в итоге с производительностью? Я как-то в надежде на ускорение от перехода на python3.11 обновил версию sanic'а и обвязки и... получил ощутимое ухудшение производительности плюс непонятные покебания по памяти. Пришлось откатить всё назад, так как необходимости в обновлении версии не было. Но у нас было 100-200prs.

Чтобы на этой странице было побольше полезно, то приведу два примера как быстро считать числа Фибоначчи при помощи матриц 2×2 и чисел вида a+b√5.
Мы реализуем класс матриц с операцией умножения и возведения в степень.
И класс чисел вида a+b√5 с основной арифметикой.

По формуле Бине $$F_n = \dfrac{ \frac{1+\sqrt5}{2}^n - \frac{1-\sqrt5}{2}^n }{\sqrt{5}}$$
А с матрицами Фибоначчи лезет при возведении матрицы (1 1) (1 0) в степень. А в степень можно возводить быстро.

class Mat2x2:
    __slots__ = ['a', 'b', 'c', 'd']

    def __init__(self, a, b, c, d):
        self.a = a
        self.b = b
        self.c = c
        self.d = d

    def __matmul__(x, y):
        ans = x.copy()
        ans @= y
        return ans

    def __imatmul__(x, y):
        x.a, x.b, x.c, x.d = x.a * y.a + x.b * y.c, x.a * y.b + x.b * y.d, x.c * y.a + x.d * y.c, x.c * y.b + x.d * y.d
        return x

    def __pow__(self, exp):
        cur = Mat2x2(1, 0, 0, 1)
        base = self.copy()
        while exp:
            if exp & 1:
                exp -= 1
                cur @= base
            else:
                exp >>= 1
                base @= base
        return cur

    def copy(self):
        return Mat2x2(self.a, self.b, self.c, self.d)

    def __repr__(self):
        return f'{self.__class__.__name__}({self.a}, {self.b}, {self.c}, {self.d})'


class R5:
    def __init__(self, a=0, b=0):
        self.a = a
        self.b = b

    def __repr__(self):
        return f'R5({self.a}, {self.b})'

    def __str__(self):
        if self.a and self.b:
            return f'({self.a}{self.b:+}√5)'
        elif self.b:
            return f'{self.b}√5'
        else:
            return f'{self.a}'

    def __add__(x, y):
        return R5(x.a + y.a, x.b + y.b)

    def __sub__(x, y):
        return R5(x.a - y.a, x.b - y.b)

    def __mul__(x, y):
        return R5(x.a * y.a + x.b * y.b * 5, x.a * y.b + x.b * y.a)

    def __pow__(x, power):
        if power == 0:
            return R5(1, 0)
        elif power % 2 == 1:
            return x * (x ** (power - 1))
        else:
            sq = x ** (power // 2)
            return sq * sq

    def __floordiv__(x, n):
        return R5(x.a // n, x.b // n)


def fib_stupid(n):
    c, p = 0, 1
    for _ in range(n):
        c, p = c + p, c
    return c


def fib_bine(n):
    return (R5(1, 1) ** n - R5(1, -1) ** n).b // 2 ** n


def fib_matrix(n, *, fib_mat=Mat2x2(0, 1, 1, 1)):
    if n == 0:
        return 0
    fib_pow = fib_mat ** (n - 1)
    return fib_pow.d


# Проверка корректности
for i in range(0, 100):
    assert fib_bine(i) == fib_stupid(i) == fib_matrix(i)

print(fib_matrix(100))

Вместо длинного и уникального для каждой таблицы

# Преобразуем результаты в список словарей
users_list = []
for user in users:
  user_dict = {
    'id': user[0],
    'username': user[1],
    'email': user[2],
    'age': user[3]
  }
users_list.append(user_dict)

можно писать короткое и универсальное

connection.row_factory = sqlite3.Row

Тогда все fetch'и будут возвращать не кортежи, а словаре-кортежи — можно обращаться к полям и по индексу, и по имени.

Справедливости ради mutable default, который определяется в момент создания функции, позволяет коротко писать функции, которым нужно что-то хранить между вызовами:

def do_some(x, *, _counter=[0]):
    _counter[0] += 1
    return x, _counter[0]

print(do_some('foo'))  # ('foo', 1)
print(do_some('boo'))  # ('boo', 2)
const do_some = (() => {
    let _counter = 0;
    return (x) => {
        _counter += 1;
        return [x, _counter];
    };
})();

console.log(do_some('foo'));  // ['foo', 1]
console.log(do_some('boo'));  // ['boo', 2],

Без этого нужно либо делать глобальную переменную, либо делать «фабрику», замыкание, класс или ещё что-то подобное.

Мне вот в питоне больше всего не хватает удобных распаковок словарей. То, что в js коротко:

const d = {foo: 1, boo: 2, zoo: 3};
const {foo, zoo} = d;

в питоне это громоздкое

d = {'foo': 1, 'boo': 2, 'zoo': 3}
foo, zoo = d['foo'], d['zoo']

Это не важно, асимптотически-то O(1), поэтому на большом количестве добавлений будет норм.

Но вообще O(n²) в [...prev] — это очень распространённая в js штука. Отчасти она обусловлена в желании делать «чистые» функции, которые не мутируют входные аргументы. Чистая функция — не нужно думать. Но бездумные копирования всего и вся при любом «чихе» стоит ресурсов...

Дожили: государство принудительно внедряет ВК в школы...
Ну то есть формально-то регаться во вконтакте не нужно, нужен только ВК ID...

Вроде уже очень давно работают имена в духе en_рус_???±2².txt
И даже windows terminal с такими именами отлично работает.

Это вообще боль! У меня была «любимая» остановка как раз на отрезке, на котором есть автобусный парк. Вечером автобусы и так ходят не часто, так ещё и половина уезжала в автобусный парк.
Выглядит это так: автобус есть в расписании, потом он «проезжает» мимо твоей остановки и через некоторое время исчезает.

В таких местах прямо боль-боль.

Я имею в виду последовательности пусков без единой аварии. Вчера был 218-й успешный пуск. Последняя авария при посадке — 108-й пуск. Последняя авария самой РН — кажется, 19-й запуск.

Интересно, что этого видео здесь до сих пор нет.
Хотел бы напомнить, как «взлетал» и садился Falcon по началу.

А сейчас больше 100 успешных запуск+посадка подряд (не учитывая тех запусков, где посадка первой ступени не планировалась), а если считать просто пуски — то их под 200 уже.

Я тоже смотрел и радовался :)
5000 тонн стартует и поднимается почти на 40км.
До последнего надеялся, что они проведут расстыковку: уже понятно, что в космос не долетит, но запуск двигателей и планирование самого старшипа можно было бы и потестировать. По идее ему должно быть пофиг: отцепился, ну пролетел 5-10 километров вниз, выровнялся, включил движки — полетел. Ну да, уже не на орбиту, но управление там потестировать :)

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

Сейчас лень искать пруфлинк, но проводилось следующее исследование: брали тестирование из пачки сложных вопросов, которые не появлялись в данных для обучения. Переводили типа на сотню языков, и на каждом спрашивали. Качество ответов, конечно, зависит от языка, но количество правильных ответов почти на любом языке превышало 60%.

Информация

В рейтинге
Не участвует
Откуда
Россия
Дата рождения
Зарегистрирован
Активность

Специализация

Бэкенд разработчик, Менеджер продукта
Ведущий
Python
Управление проектами
Алгоритмы и структуры данных
Asyncio