Как стать автором
Обновить
75
0
Zaur Nasibov @BasicWolf

Software Engineer

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

"Смазкой будут враги народа". Сколько же злости и ненависти в одной только этой фразе! А судьи кто? Навскидку вспоминаю одного такого врага народа, соучастника контрреволюционной троцкистской организации внутри РНИИ, «ставящей своей целью ослабление оборонной мощи в угоду фашизму», С. П. Королёва.

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

(Леонид Кербер, "Туполевская шарага").

Вы к этому предлагаете вернуться?

@Lex812, срочно добавьте тег "сарказм"! А то, такими темпами слишком серьёзные камрады заминусуют вашу карму в минус сингулярность.

Ну вот опять. Куда же вы так торопитесь?

Wikipedia: UTF-8 was designed for backward compatibility with ASCII: the first 128 characters of Unicode, which correspond one-to-one with ASCII, are encoded using a single byte with the same binary value as ASCII, so that valid ASCII text is valid UTF-8-encoded Unicode as well.

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

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

Но вместо этого - "Удобнее чем было, так ведь?". А ведь банальное гугление "start thread in decorator" выдаёт вопрос на StackOverflow 2013го года, рецепт с ActiveState 2009го года и ещё огромную кучу материала, в котором вопрос обсасывается со всех сторон.
Куда уместнее ваш код был бы в контексте "ребята, я изучаю Питон и многопоточность и написал вот это, прокомментируйте пожалуйста".

Я надеюсь вы не принимаете вышесказанное близко к сердцу. У меня самого парочка исследовательских проектов и статей о них на Хабре, которые писались именно в таком ключе. Не мы первые, не мы последние :) Успехов вам!

Товарищ, вы однако садист. Может немного окунуться в тему о синхронизации потоков, узнать о мьютексах, семафорах, очередях и т.д.? Тот же раздел Threading и concurrent.futures из документации почитать? На последний советую обратить особое внимание, т.к. лёгким движением руки заменив ThreadPoolExecutor на ProcessPoolExecutor можно запускать функции не в потоках, а в процессах!

Ещё желательно обязательно PEP-8.

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

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

def parse(iterator):
    data = (
        combine(*matches)
        for matches in read_triplets(iterator)
    )
    yield from process(data)

def read_triplets(iterator):
    while all((        
        (match_1 := grok1.match(next(iterator, EOF))) != EOF,
        (match_2 := grok2.match(next(iterator, EOF))) != EOF,
        (match_3 := grok3.match(next(iterator, EOF))) != EOF,
    )):
        yield (match_1, match_2, match_3)

Да пожалуйста, если не хотите StopIteration:

class Sentinel: ...

if x := next(foo, Sentinel):
     ...

Только это не нормальный Питоний код же. Вы часто видели, чтобы next() вызывался явным образом, а не в контексте for? Или вам часто приходится кидать StopIteration вручную?

Мне кажется, что вы не до конца рассмотрели идею со StopIteration .
Это исключение появилось как часть протокола итераторов и генераторов. А генераторы можно соединять, даже не имея yield from.
А как в цепочке генераторов проще всего сигнализировать на самый верх, что глубинный генератор истощён? Бросаем исключение, которое просто всплывает наверх.
И да, этот механизм - противоречивый и далеко не самый эффективный. Мне лично больше импонирует функциональный подход Раста. А с другой стороны - этот механизм чертовски простой и проверенный временем :)

А по-моему это гениально. Или как в других языках, будем иметь два метода вместо одного, типа Iterator.hasNext() -> boolи Iterator.next().

Кхм... вы кажется переливаете из пустого в порожнее. Заглянем в документацию:

It is also possible to create anonymous functions (functions not bound to a name), for immediate use in expressions. This uses lambda expressions, described in section Lambdas. Note that the lambda expression is merely a shorthand for a simplified function definition; ...

Вы молодец, что продолжаете работу, несмотря на сложности.

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

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

Вот простой пример, вы пишите:

if (_battleStarterScript.ActiveEnemies.All(ActiveEnemies =>
                                      ActiveEnemies.GetComponent<Characteristics>().IsDead))


Но будете ли вы через неделю помнить, что это обозначает? Не будет ли подспорьем переменная объясняющая всё это выражение? Например:

boolean allEnemiesDead = _battleStarterScript.ActiveEnemies.All(ActiveEnemies =>
                                      ActiveEnemies.GetComponent<Characteristics>().IsDead))
if (allEnemiesDead) {...}


А это лишь песчинка на вершине айсберга вашего проекта. Перелопачивание и переписывание кода - это нормально. Однако это намного сложнее делать, если код написан "лишь бы оно работало". Работать-то может и будет, но внесение изменений в такую программу отнимает кучу времени и сил. В итоге всё это надоедает и вы проклинаете тот день, когда сели за баранку этого пылесоса.

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

Я бы сказал, что зависит от игры. Скажем если бы это были "крестики-нолики", "змейка" или "пинг-понг" - можно ли считать такое задание достаточным и не выходящем за рамки тестового?

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

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

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

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

Делал SMILE в мае 2021-го. Что могу сказать: результатом доволен. Но то, что "можно работать и заниматься спортом уже через два дня после операции" - полнейшая брехня. Нет, конечно если вы садомазохист, то в принципе можно. В моём же случае, до более-менее комфортного состояния зрение адаптировалось 2-3 месяца.
И 100% на оба глаза тоже не получилось - правый глаз видит хуже, чем левый. Но это гораздо лучше, чем изначальные -4.5, -5.
Подождите ещё немного. Обязательно пользуйтесь увлажняющими каплями или гелем.

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

У вас слишком свободная интерпретация возможностей языка и экосистемы Питона.

В 3-й версии Питона (в версии 3.0, выпущенной аж в 2008-м году!) появился и начал развиваться механизм аннотаций. Переменные, аргументы функций и поля классов можно было аннотировать *любым валидиным выражением*. А уже сообщество стало использовать типы в аннотациях и разработало инструменты проверки типов, такие как mypy. Это не статическая типизация. В рантайме аннотации никак не влияют на выполнение программы.

Далее, Питон - строго типизированный язык. Вы же сами приводите пример, в котором нельзя к числу "прибавить" строку. Тот же слабо типизированный Javascript или PHP это проглотят без проблем.

Доставкой изменений на бой занимается тимлид на проекте или его старший программист проекта. Также неплохо было бы настроить CI/СD

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

Печаль. 2021й год на дворе, а вы вручную "доставляете" изменения. И для этого ещё и отдельные ветки "staging" и "main". И каким же образом достигается Continuous Delivery, если между коммитом и деплоем в продакшн столько "вахтёров"?

Там в том то и суть, что человек который начинается заниматься разработкой ПО, очень скоро сталкивается с вопросом "Как это всё хранить" и "Как этим управлять". И тут на сцену выходят системы контроля версий, в том числе и Git. И в интернете полно качественнейшего материала на эту тему.
Aвтор пишет статью для людей, вроде бы не знакомых с понятием "Системы контроля версий", но при этом пытается уместить всё в формат универской методички, на которую пожалели бумаги.
Автор не раскрывает ни "Что такое распределённые системы контроля версий", ни "Что такое Гит?", ни "Почему Гит, а не XYZ?", ни "Как им пользоваться?".
Вот и летят минусы, чтобы это поскорее исчезло и не добавляло лишней энтропии Вселенной.

А вы сделайте скидку на то, что эта книга была издана ещё в 2004м году! Эта книга и её идеи лежат в основе современного ДДД.

Когда-то удалось поработать на оригинальной Model M - с тех пор я влюбился в buckling spring. Хотя по просьбе окружающих пришлось перейти на что-то потише :D

Спасибо! Приведу тогда перевод Яндекса:

— Нас знакомят с Винни-Пухом и Некоторыми Пчелами, и начинаются истории.

— Пух отправляется в гости и попадает в трудное положение.

— Пух и Пятачок отправляются на охоту и чуть не ловят Вуз.

— Иа-Иа теряет хвост, а Пух его находит.

Информация

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