Pull to refresh
21
0
Маланюк Михаил @CJay

Пользователь

Send message

Ад визуализации 1.1 — Книга 2: Проблемы

Reading time4 min
Views13K
Ад визуализации 1.1:
Добро пожаловать во вторую книгу! Здесь мы изучим некоторые проблемы, которые могут возникнуть во время процесса визуализации. Но, для начала, немного практики:

Знать о проблеме — полезно. Но действительно прочувствовать проблему гораздо лучше для понимания. Давайте попробуем поставить себя на место CPU/GPU.
Книга 2: Проблемы
Total votes 14: ↑13 and ↓1+12
Comments2

Ад визуализации 1.1 — Книга 1: Обзор

Reading time4 min
Views26K
Ад визуализации 1.1:
Недостаток знаний иногда может оказаться достоинством, потому что вы наивно говорите себе: «Пфф… разве это сложно?» и просто погружаетесь в проблему с головой. Я начал эту статью с размышления: «Хм… Что же такое Draw Call?». За время «5-ти минутного» исследования я так и не нашел удовлетворяющего меня объяснения. Я проверил часы и, так как до сна оставалось еще 30 минут, сказал…
Пфф… Разве это сложно написать самостоятельно?
… и просто начал. Это было два месяца назад и с тех пор я непрерывно читал, писал и задавал много вопросов.

Это было самое сложное и низкоуровневое исследование, которое я когда-либо делал, и для меня непрограммиста это был кошмар состоящий из «да, но в этом особом случае...» и «зависит от реализации API...». Это был мой личный ад визуализации, но я прошел через него и принес нечто с собой: Четыре книги, каждая из которых представляет собой попытку объяснить одну из частей визуализации с точки зрения художника. Я надеюсь, что вам понравится.
Книга 1: Обзор
Total votes 37: ↑34 and ↓3+31
Comments6

Python Meetup 31.10.14: асинхронность и soft skills

Reading time2 min
Views11K
imageБелорусские Python’исты в этом году отметили Хэллоуин вместе, на Python шабаше Meetup. Так получилось, что последняя пятница месяца выпала как раз на 31 октября. Это, конечно, не могло не сказаться на формате проведения встречи. Духи играли с техникой, а наши докладчики рассказывали об асинхронной работе в JavaScript и Python, преимуществах open source ERP и CRM системы Odoo и жаловались, как же не просто быть хорошим программистом, но плохим человеком.

Читать дальше →
Total votes 24: ↑23 and ↓1+22
Comments3

Software renderer — 1: матчасть

Reading time29 min
Views84K
Программный рендеринг (software rendering) — это процесс построения изображения без помощи GPU. Этот процесс может идти в одном из двух режимов: в реальном времени (вычисление большого числа кадров в секунду — необходимо для интерактивных приложений, например, игр) и в «оффлайн» режиме (при котором время, которое может быть потрачено на вычисление одного кадра, не ограничено настолько строго — вычисления могут длиться часы или даже дни). Я буду рассматривать только режим рендеринга в реальном времени.

У этого подхода существуют как недостатки так и достоинства. Очевидным недостатком является производительность — CPU не в состоянии конкурировать с современными видеокартами в этой области. К достоинствам стоит причислить независимость от видеокарты — именно поэтому он используется как замена аппаратного рендеринга в случаях, когда видеокарта не поддерживает ту или иную возможность (так называемый software fallback). Существуют и проекты, цель которых — полностью заменить аппаратный рендеринг программным, например, WARP, входящий в состав Direct3D 11.

Но главным плюсом является возможность написания подобного рендерера самостоятельно. Это служит образовательным целям и, на мой взгляд, это — самый лучший способ понять лежащие в основе алгоритмы и принципы.

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

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

В конце статьи будет ссылка на гитхаб проекта, который можно рассматривать как пример реализации.
Читать дальше →
Total votes 95: ↑90 and ↓5+85
Comments51

Как в Яндексе используют PyTest и другие фреймворки для функционального тестирования

Reading time19 min
Views125K
Всем привет! Меня зовут Сергей, и в Яндексе я работаю в команде автоматизации тестирования сервисов монетизации. Перед каждой командой, которая занимается задачами автоматизации тестирования, встает вопрос: «Какой [фреймворк|инструмент] выбрать для написания своих тестов?» В этом посте я хочу помочь вам на него ответить. Если быть конкретнее, речь пойдет об инструментах тестирования на языке Python, но многие из идей и выводов можно распространить на другие языки программирования, поскольку подходы часто не зависят от конкретной технологии.



В Python существует множество инструментов для написания тестов и выбор между ними неочевиден. Я опишу интересные варианты использования PyTest и расскажу о его [плюсах|минусах|неявных возможностях]. В статье вы найдёте развёрнутый пример использования Allure, который служит для создания простых и понятных отчётов автотестов. Также в примерах будет применяться фреймворк для написания матчеров — Hamcrest для Python. Надеюсь, что в итоге, те, кто сейчас в поиске инструментов для тестирования, смогут на основе изложенных примеров быстро внедрить функциональное тестирование в своем окружении. Те же, кто уже использует какой-то инструмент, смогут узнать новые подходы, варианты использования и концепции.
Читать дальше →
Total votes 62: ↑60 and ↓2+58
Comments10

Внедрение зависимостей the Python way

Reading time3 min
Views36K
Зачем нужно внедрение зависимостей? Оно уменьшает связанность компонентов в приложение и упрощает тестирование. У некоторых разработчиков есть мнение, что внедрение зависимостей нужно только в больших проектах и что оно сильно усложняет программы. Думаю, это исторически сложилось из-за популярный фрейморков вроде Спринга или Джуса в Джаве. Особенно из-за Спринга, который является невероятным комбайном.

Python-inject — это небольшая библиотека для внедрения зависимостей в Питоне. Третья версия написана в unix-стиле, т.е. она прекрасно выполняет только одну функцию и не пытается быть всем. В отличие от уже упомянутых Спринга и Джуса Инжект не ворует конструкторы классов у разработчиков, не навязывает разработчикам необходимость писать приложение в каком-то определенном стиле и не пытается управлять всем графом объектов приложения.

Инжект практически не требует конфигурации (об этом подробнее подкатом) и очень прост в использовании.
Например в тестах
# Возможные зависимости
class Db(object): pass
class Mailer(object): pass

# Внедряем зависимости в класс пользователя
class User(object):
    db = inject.attr(Db)
    mailer = inject.attr(Mailer)
    
    def __init__(self, name):
        self.name = name
    
    def register(self):
        self.db.save(self)
        self.mailer.send_welcome_email(self.name)


 # Используем в тестах inmemory базу данных и моки.
class TestUser(unittest.TestCase):
    def setUp(self):
        inject.clear_and_configure(lambda binder: binder \
            .bind(Db, InMemoryDb()) \
            .bind(Mailer, Mock()))
        
        self.mailer = inject.instance(Mailer)
    
    def test_register__should_send_welcome_email(self):
        # Пример теста.
        user = User('John Doe')
        
        # Регистрируем нового пользователя.
        user.register()
        
        # Должно отправиться письмо с приветствием.
        self.mailer.send_welcome_email.assert_called_with('John Doe')


Читать дальше →
Total votes 31: ↑27 and ↓4+23
Comments38

Разрабатываем игру на AS3 (Часть 2: мини-игра «Duck Hunt»)

Reading time5 min
Views7.7K

рисунок 4
Duck Hunt

Цель: разработка компьютерной игры
Целевая аудитория: начинающие, интересующиеся, зеваки
Инструменты: ActionScript 3.0


Содержание цикла





Введение


В предыдущих выпусках...
  • Возможно, слегка размытое введение;
  • Определён некоторый набор замечаний;
  • Созданы и описаны требуемые инструменты;
  • Поставлена задача для настоящей части.


Вдохновением для мини-игры стала старая тёплая "Duck Hunt". Однако повторение чего бы то ни было практически лишает этот процесс творчества, превращая его в скучную рутину. Да и копии такой игры, скорее всего, уже есть (осторожно, можно получить эстетический шок от полёта уток). Необходимо помнить, что создаётся небольшая игра, поэтому не стоит перегружать её лишними особенностями (и так есть довольно забавные вариации).
Будем делать некоторую сборную пародию на старенькие компьютерные игры, тем самым обосновав любое замеченное использование предметов чужого авторского права, на которые делается пародия.
Хотите знать больше?
Total votes 24: ↑14 and ↓10+4
Comments9

Python Meetup 26.09.14: cовершенствуем код и ускоряем Python

Reading time2 min
Views14K
Белорусские Python’нщики верны своим традициям. Python Meetup состоялся 26 сентября, в последнюю пятницу месяца.
На встрече мы обсуждали извечную головную боль всех программистов – как писать красивый и понятный код без багов. Докладчики подошли к этой проблеме с разных сторон: Павел Кохан рассказал о пяти принципах S.O.L.I.D., которые помогают писать качественный код на любом объектно-ориентированном языке, а Олег Шидловский говорил о том, как ускорить работу хорошего кода.

Python Meetup
Читать дальше →
Total votes 30: ↑29 and ↓1+28
Comments8

Почему snowkit

Reading time4 min
Views4.7K
Сейчас я хочу кратко рассказать почему и как появился коллектив snowkit и соответствующие библиотеки.
Если вы еще не читали анонс snowkit — я бы советовал вам прочитать сначала его (перевод).

Честолюбивые замыслы


Да, это реальная причина создания snowkit и библиотек. Я верю в то, что Haxe обладает прекрасным потенциалом, который уже сейчас проявляется в поразительном росте популярности, прекрасном качестве, библиотеках, инструментах, фреймворках, играх и сообществе. Haxe Foundation продолжает двигаться в правильном направлении, прикладывает огромные усилия для того, чтобы сделать компилятор и поддержку платформ лучше и лучше, занимается улучшением сайта и документации. Этим занимаются прекрасные люди и вы может к ним присоединиться и помочь.

snowkit является продолжением работы в этом направлении и, я надеюсь, станет примером высококачественной, поддерживаемой сообществом инфраструктуры для Haxe, которой мы и новые участники сообщества будут пользоваться в будущем. Создавая snowkit я хочу показать Haxe во всей его красе.

Читать дальше →
Total votes 22: ↑18 and ↓4+14
Comments0

Анонс snowkit

Reading time4 min
Views7.5K
Прошедшие полтора года или около того свое свободное время я провел собирая набор библиотек для Haxe и сообщества вокруг него.
Самой главной библиотекой является игровой движок luxe, который позволяет создавать игры, используя один и тот же код для Mac, Windows, Linux, Android, iOS и WebGL.

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

image

Дальше - больше!
Total votes 25: ↑22 and ↓3+19
Comments5

Парсим на Python: Pyparsing для новичков

Reading time6 min
Views188K
Парсинг (синтаксический анализ) представляет собой процесс сопоставления последовательности слов или символов — так называемой формальной грамматике. Например, для строчки кода:

import matplotlib.pyplot  as plt

имеет место следующая грамматика: сначала идёт ключевое слово import, потом название модуля или цепочка имён модулей, разделённых точкой, потом ключевое слово as, а за ним — наше название импортируемому модулю.

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

{ 'import': [ 'matplotlib', 'pyplot' ], 'as': 'plt' }

Данное выражение представляет собой словарь Python, который имеет два ключа: 'import' и 'as'. Значением для ключа 'import' является список, в котором по порядку перечислены названия импортируемых модулей.

Для парсинга как правило используют регулярные выражения. Для этого имеется модуль Python под названием re (regular expression — регулярное выражение). Если вам не доводилось работать с регулярными выражениями, их вид может вас испугать. Например, для строки кода 'import matplotlib.pyplot as plt' оно будет иметь вид:

r'^[ \t]*import +\D+\.\D+ +as \D+'

К счастью, есть удобный и гибкий инструмент для парсинга, который называется Pyparsing. Главное его достоинство — он делает код более читаемым, а также позволяет проводить дополнительную обработку анализируемого текста.

В данной статье мы установим Pyparsing и создадим на нём наш первый парсер.

Читать дальше →
Total votes 57: ↑46 and ↓11+35
Comments12

Про создание платформера на Unity. Часть третья, долгожданная

Reading time4 min
Views71K
Привет, Хабр!

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



Осторожно: объемы гифок под катом становятся просто нечеловеческими!
Читать дальше →
Total votes 50: ↑44 and ↓6+38
Comments25

Создаем 2D платформер при помощи Unreal Engine 4. Часть 1 — Игровой персонаж, движение

Reading time4 min
Views161K
Не так давно компания Epic Games сделала невероятно щедрый подарок всем желающим — движок UE4 с исходным кодом всего за $20/мес, считай даром! Воспользуемся их щедростью и великодушием и попробуем создать что-нибудь не очень сложное, но, по крайней мере, более-менее играбельное — 2D платформер.
Под катом множество картинок...
Total votes 33: ↑31 and ↓2+29
Comments15

Современный Торнадо: распределённый хостинг картинок в 30 строк кода

Reading time3 min
Views35K
Впервые слышите о tornado? Слышали, но боялись асинхронности? Смотрели на него более полугода назад? Тогда я посвящаю эту статью вам.
Там будут: gen.coroutines, обработчики, роутинг, шаблоны, motor, gridfs
Total votes 100: ↑89 and ↓11+78
Comments16

Современный торнадо, часть 2: блокирующие операции

Reading time5 min
Views16K
Улучшаем наш распределённый хостинг картинок. В этой части мы поговорим о конфигурировании приложения и подключим защиту от csrf. Затем, на примере создания миниатюр картинок, научимся работать с блокирующими задачами, запускать корутины параллельно и обрабатывать возникающие в них исключения.
Читать дальше →
Total votes 32: ↑31 and ↓1+30
Comments8

Метапрограммирование с примерами на JavaScript

Reading time15 min
Views43K
Эта статья, еще одна попытка переосмысления метапрограммирования, которые я периодически предпринимаю. Идея каждый раз уточняется, но в этот раз удалось подобрать достаточно простых и понятных примеров, которые одновременно очень компактны и иллюстративны, имеют реальное полезное применение и не тянут за собой библиотек и зависимостей. В момент публикации я буду докладывать эту тему на ОдессаJS, поэтому, статью можно использовать, как место для вопросов и комментариев к докладу. Формат статьи дает возможность более полно изложить материал, чем в докладе, слушатели которого, не освобождаются от прочтения.

UPD: Обновленная видеоверсия статьи на Youtube (лекция записана в Киевском политехническом институте 18 апреля 2019 года в рамках курса «100 видео-лекций по программированию»):

Читать дальше →
Total votes 52: ↑39 and ↓13+26
Comments23

Один вариант использования аннотаций

Reading time4 min
Views14K
Сразу хочу объявить, что здесь под аннотациями подразумеваются НЕ декораторы. И я не знаю по какой причине декораторы иногда именуют аннотациями.

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

Вот каноничный пример из PEP:

def compile(source: "something compilable",
            filename: "where the compilable thing comes from",
            mode: "is this a single statement or a suite?"):
    ...


Там же, чуть ниже, приводятся примеры, которые дают понять, что комментирование параметров — не единственное возможное использование данной фичи. Это натолкнуло меня на мысль об одной старой беде, которая досаждала моей нервной системе уже приличное время. А именно — получение данных из форм во Flask.

Читать дальше →
Total votes 26: ↑24 and ↓2+22
Comments7

Как использовать секционные элементы HTML5

Reading time5 min
Views202K
Один славный малый Matt West c туманного альбиона, промышляющий фрилансом и предпринимательством, предложил нашему вниманию пост: «Как использовать секционные элементы HTML5».
Ниже приводится его перевод.




HTML5 предлагает набор секционных элементов, используя которые в своей разметке вы добавляете смысловую или семантическую нагрузку своим страницам, тем самым позволяя компьютерным программам лучше понимать их содержание.
Прочитав этот пост, вы научитесь применять секционные элементы на ваших веб-сайтах. Я постараюсь объяснить, в каких случаях лучше использовать тот или иной элемент и когда лучше прибегнуть к старому доброму .
Давайте начнем.
Читать дальше →
Total votes 68: ↑57 and ↓11+46
Comments37

Юникод для чайников

Reading time8 min
Views328K
logo
Сам я не очень люблю заголовки вроде «Покемоны в собственном соку для чайников\кастрюль\сковородок», но это кажется именно тот случай — говорить будем о базовых вещах, работа с которыми довольно часто приводить к купе набитых шишек и уйме потерянного времени вокруг вопроса — «Почему же оно не работает?». Если вы до сих пор боитесь и\или не понимаете Юникода — прошу под кат.

Читать дальше →
Total votes 121: ↑115 and ↓6+109
Comments53

Python на Хабре

Reading time7 min
Views452K
Некоторое время назад, в силу определенных причин, мне пришла в голову мысль о том, чтобы начать изучать какой-нибудь новый язык программирования. В качестве альтернатив для этого начинания я определил два языка: Java и Python. После продолжительного метания между ними и сопутствующих нытья и долбежки головой о стену (у меня с новыми языками всегда так — сомнения, раздумья, проблема выбора и т.д.), я все-таки остановился на Python. Окей, выбор сделан. Что дальше? А дальше я стал искать материал для изучения…
Читать дальше →
Total votes 182: ↑162 and ↓20+142
Comments65
12 ...
13

Information

Rating
Does not participate
Location
Курск, Курская обл., Россия
Date of birth
Registered
Activity