Как стать автором
Обновить
2
0
Дмитрий Коваников @ChShersh

Функциональный инженер

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

Linux pipes tips & tricks

Время на прочтение8 мин
Количество просмотров183K

Pipe — что это?


Pipe (конвеер) – это однонаправленный канал межпроцессного взаимодействия. Термин был придуман Дугласом Макилроем для командной оболочки Unix и назван по аналогии с трубопроводом. Конвейеры чаще всего используются в shell-скриптах для связи нескольких команд путем перенаправления вывода одной команды (stdout) на вход (stdin) последующей, используя символ конвеера ‘|’:
cmd1 | cmd2 | .... | cmdN

Например:
$ grep -i “error” ./log | wc -l
43

grep выполняет регистронезависимый поиск строки “error” в файле log, но результат поиска не выводится на экран, а перенаправляется на вход (stdin) команды wc, которая в свою очередь выполняет подсчет количества строк.

Логика


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

Размер буфера начиная с ядра версии 2.6.11 составляет 65536 байт (64Кб) и равен странице памяти в более старых ядрах. При попытке чтения из пустого буфера процесс чтения блокируется до появления данных. Аналогично при попытке записи в заполненный буфер процесс записи будет заблокирован до освобождения необходимого места.
Важно, что несмотря на то, что конвейер оперирует файловыми дескрипторами потоков ввода/вывода, все операции выполняются в памяти, без нагрузки на диск.
Вся информация, приведенная ниже, касается оболочки bash-4.2 и ядра 3.10.10.

Простой дебаг


Утилита strace позволяет отследить системные вызовы в процессе выполнения программы:
$ strace -f bash -c ‘/bin/echo foo | grep bar’
....
getpid() = 13726                   <– PID основного процесса
...
pipe([3,  4])                       <– системный вызов для создания конвеера
....
clone(....) = 13727                <– подпроцесс для первой команды конвеера (echo)
...
[pid 13727] execve("/bin/echo",  ["/bin/echo",  "foo"],  [/* 61 vars */] 
.....
[pid 13726] clone(....) = 13728    <– подпроцесс для второй команды (grep) создается так же основным процессом
...
[pid 13728] stat("/home/aikikode/bin/grep",   
...
Видно, что для создания конвеера используется системный вызов pipe(), а также, что оба процесса выполняются параллельно в разных потоках.
Читать дальше →
Всего голосов 105: ↑97 и ↓8+89
Комментарии36

Шаблоны проектирования в адвенчурах: часть первая

Время на прочтение7 мин
Количество просмотров39K
Предлагаю к прочтению очередную статью из блога Дэна Шулера о паттернах, которые можно использовать при разработке адвенчур. В свое время мне приходила в голову идея классификации загадок, но я лишь делал небольшой обзор, а не объемную статью. Естественно, я был удивлен и рад тому, что тема была кем-то поднята. Ниже приводится описание самих паттернов, следующим постом будут более развернутые примеры их использования, а в этот решил их не включать, по причине слишком объемного перевода. Также я добавил несколько поясняющих иллюстраций и несколько комментариев от себя.

«То, что мы называем хаосом — это всего лишь закономерности, которые мы не сумели распознать. То, что мы называем случайностями — это всего лишь закономерности, которые мы не в состоянии расшифровать.»
— Чак Паланик

Как насчет абстрактного подхода к разработке адвенчу? Или, хотя бы, для загадок в адвенчурах — это может оказаться полезным!

Читать дальше →
Всего голосов 58: ↑58 и ↓0+58
Комментарии32

Всё, что вы хотели знать о динамическом программировании, но боялись спросить

Время на прочтение12 мин
Количество просмотров244K
Я был крайне удивлён, найдя мало статей про динамическое программирование (далее просто динамика) на хабре. Мне всегда казалось, что эта парадигма довольно сильно распространена, в том числе и за пределами олимпиад по программированию. Поэтому я постараюсь закрыть этот пробел своей статьёй.

# Весь код в статье написан на языке Python

Основы


Пожалуй, лучшее описание динамики в одно предложение, которое я когда либо слышал:

Динамическое программирование — это когда у нас есть задача, которую непонятно как решать, и мы разбиваем ее на меньшие задачи, которые тоже непонятно как решать. (с) А. Кумок.
Читать дальше →
Всего голосов 110: ↑100 и ↓10+90
Комментарии33

Создаём игру, используя canvas и спрайты

Время на прочтение15 мин
Количество просмотров163K
Веб сейчас везде, и предлагает очень мощную среду для создания и распространения приложений. Вместо цикла: написание кода → компиляция → запуск, просто обновите приложение или даже напиши код «на живую» в браузере. Кроме того, это относительно безболезненно позволяет распространять своё приложение на огромном количестве платформ. Интересно, что в последние несколько лет, разработка игр, используя HTML5, стала реальностью.
Элемент canvas был введен вместе с HTML5 и предоставляет API для работы с ним. API — прост, но если Вы никогда не работали с графикой, Вам потребуется время чтобы привыкнуть. Canvas поддерживается большим количество браузеров, что делает веб — хорошей площадкой для создания игр.
Читать дальше →
Всего голосов 95: ↑91 и ↓4+87
Комментарии23

Руководство по магическим методам в Питоне

Время на прочтение28 мин
Количество просмотров601K
Это перевод 1.17 версии руководства от Rafe Kettler.


Содержание


  1. Вступление
  2. Конструирование и инициализация
  3. Переопределение операторов на произвольных классах
  4. Представление своих классов
  5. Контроль доступа к атрибутам
  6. Создание произвольных последовательностей
  7. Отражение
  8. Вызываемые объекты
  9. Менеджеры контекста
  10. Абстрактные базовые классы
  11. Построение дескрипторов
  12. Копирование
  13. Использование модуля pickle на своих объектах
  14. Заключение
  15. Приложение 1: Как вызывать магические методы
  16. Приложение 2: Изменения в Питоне 3


Вступление


Что такое магические методы? Они всё в объектно-ориентированном Питоне. Это специальные методы, с помощью которых вы можете добавить в ваши классы «магию». Они всегда обрамлены двумя нижними подчеркиваниями (например, __init__ или __lt__). Ещё, они не так хорошо документированны, как хотелось бы. Все магические методы описаны в документации, но весьма беспорядочно и почти безо всякой организации. Поэтому, чтобы исправить то, что я воспринимаю как недостаток документации Питона, я собираюсь предоставить больше информации о магических методах, написанной на понятном языке и обильно снабжённой примерами. Надеюсь, это руководство вам понравится. Используйте его как обучающий материал, памятку или полное описание. Я просто постарался как можно понятнее описать магические методы.
Читать дальше
Всего голосов 143: ↑139 и ↓4+135
Комментарии59

Пост-мортем: Baldur's Gate: Enhanced Edition

Время на прочтение14 мин
Количество просмотров52K
image

Хотите услышать рассказ о том, как классика ролевых игр на PC смогла возродиться как мультиплатформенный проект, да еще и в виде «расширенного издания»? Один из основателей Bioware Трент Остер (сегодня — президент компании Beamdog / Overhaul Games, занимавшейся разработкой переиздания) готов провести нас за кулисы и рассказать, как же все происходило.
Читать дальше →
Всего голосов 46: ↑44 и ↓2+42
Комментарии29

Полезные идиомы многопоточности С++

Время на прочтение25 мин
Количество просмотров82K

Введение

Данная статья является продолжением цикла статей: Использование паттерна синглтон [1], Синглтон и время жизни объекта [2], Обращение зависимостей и порождающие шаблоны проектирования [3], Реализация синглтона в многопоточном приложении [4]. Сейчас я хотел бы поговорить о многопоточности. Эта тема настолько объемна и многогранна, что охватить ее всю не представляется возможным. Здесь я заострю внимание на некоторых практичных вещах, которые позволят вообще не думать о многопоточности, ну или думать о ней в крайне минимальном объеме. Если говорить точнее, то думать о ней только на этапе проектирования, но не реализации. Т.е. будут рассмотрены вопросы о том, как сделать так, чтобы автоматически вызывались правильные конструкции без головной боли. Такой подход, в свою очередь, позволяет значительно уменьшить проблемы, вызванные состояниями гонок (race condition, см. Состояние гонки [5]) и взаимными блокировками (deadlock, см. Взаимная блокировка [6]). Этот факт уже сам по себе представляет немалую ценность. Также будет рассмотрен подход, который позволяет иметь доступ к объекту из нескольких потоков одновременно без использования каких-либо блокировок и атомарных операций!
Еще...
Всего голосов 71: ↑66 и ↓5+61
Комментарии46

Каверзные кватернионы

Время на прочтение3 мин
Количество просмотров186K


Отгадайте загадку: в четырёх измерениях сидит и комплексными числами воротит?

Подсказка: это вектор со скаляром. И вещественная матрица. И придумал его Гамильтон.

Не помогло? Ну что вы, это же элементарно! Это кватернион! Кватернионы используют для записи вращений в робототехнике, игровых движках, ПО для моделирования и вообще везде, где не нужны проблемы с углами Эйлера или матрицами. Если вас испугала путаница выше с разными представлениями кватерниона, то можете быть спокойны. Кватернионы очень просты в использовании и их внутреннее строение может понадобиться только в очень редких случаях, где нужна тонкая оптимизация. В остальное время с помощью кватернионов можно крутить всё что угодно и как угодно, и оно будет плавно и красиво интерполироваться без шарнирных замков.
Что же такое кватернион?
Всего голосов 110: ↑102 и ↓8+94
Комментарии48

Знакомство с UnrealEngine. Часть 1

Время на прочтение6 мин
Количество просмотров48K

Хотелось ли вам когда нибудь сделать свою игру или 3D презентацию, или просто узнать как работают другие игры? Мне всегда хотелось сделать свою игру, и было интересно узнать как работают уже существующие. Не буду скрывать что одной из моих любимых игр является Unreal, работающая на движке UnrealEngine от Epic Games. Первая версия движка появилась 1998 году. На данный момент актуальная версия движка четвёртая. Кроме самой серии Unreal на движке было сделано очень много игр.
Выпустив первую версию движка Epic Games приложила к движку UnrealEditor — редактор позволяющий делать свои уровни и моды для игры. В 2009 году Epic Games выпустила UDK который позволил делать свои игры. На мой взгляд этот движок достоин того, чтобы разобраться как с ним работать и что он может.
Я попытаюсь описать основы работы с UnrealEngine, но в силу некоторых причин я буду описывать его в основном по второй его версии. Большинство из описанного будет работать и в UDK и в UnrealEngine4. Итак, если вас это заинтересовало, добро пожаловать под кат.
Читать дальше →
Всего голосов 80: ↑62 и ↓18+44
Комментарии16

Ежедневная работа с Git

Время на прочтение40 мин
Количество просмотров882K
Я совсем не долго изучаю и использую git практически везде, где только можно. Однако, за это время я успел многому научиться и хочу поделиться своим опытом с сообществом.

Я постараюсь донести основные идеи, показать как эта VCS помогает разрабатывать проект. Надеюсь, что после прочтения вы сможете ответить на вопросы:
  • можно ли git «подстроить» под тот процесс разработки, который мне нужен?
  • будет ли менеджер и заказчик удовлетворён этим процессом?
  • будет ли легко работать разработчикам?
  • смогут ли новички быстро включиться в процесс?
  • можно ли процесс относительно легко и быстро изменить?


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

Далее очень много букв случайным образом превратились в пост.
Всего голосов 200: ↑194 и ↓6+188
Комментарии44

Вероятностные модели: байесовские сети

Время на прочтение8 мин
Количество просмотров86K
В этом блоге мы уже много о чём поговорили: были краткие описания основных рекомендательных алгоритмов (постановка задачи, user-based и item-based, SVD: 1, 2, 3, 4), о нескольких моделях для работы с контентом (наивный Байес, LDA, обзор методов анализа текстов), был цикл статей о холодном старте (постановка задачи, текстмайнинг, теги), была мини-серия о многоруких бандитах (часть 1, часть 2).

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


Читать дальше →
Всего голосов 49: ↑47 и ↓2+45
Комментарии35

Посты-рекордсмены

Время на прочтение5 мин
Количество просмотров105K
На Хабре я недавно (чуть меньше месяца), до этого Хабр практически не читал. Пришёл, огляделся, походил по тематическим «хабам», почитал «Лучшее за всё время», просмотрел статьи отдельных, заинтересовавших меня персонажей и понял, что для того, чтобы получше понять, как живёт и чем дышит это замечательное сообщество, мне придётся Хабр распарсить и позадавать ему разные вопросы. К тому же, раз уж в своих статьях я писал в основном об автореферентности в разных её проявлениях, как не написать на Хабре статью о Хабре?

Посмотрю, интересно ли это всё кому-либо кроме меня. Если интересно, напишу ещё несколько постов, идей и материала для этого более чем достаточно.

Если я ничего не пропустил в интерфейсе сайта, единственные списки самых-самых, которые можно посмотреть — это общий рейтинг пользователей и список статей, т.н. «Лучшее за всё время». Оба списка отсортированы по рейтингу (пользователей и статей, соответственно). Между тем, существует ещё куча параметров, по которым было бы интересно всё отранжировать.
Читать дальше →
Всего голосов 215: ↑202 и ↓13+189
Комментарии59

Много бесплатных книг по программированию

Время на прочтение7 мин
Количество просмотров346K
Читать дальше →
Всего голосов 202: ↑192 и ↓10+182
Комментарии42

Python изнутри. Введение

Время на прочтение7 мин
Количество просмотров100K
Boa constrictor1. Введение
2. Объекты. Голова
3. Объекты. Хвост
4. Структуры процесса

Помимо изучения стандартной библиотеки, всегда интересно, а иногда и полезно, знать, как язык устроен изнутри. Андрей Светлов (svetlov), один из разработчиков Python, советует всем интересующимся серию статей об устройстве CPython. Представляю вам перевод первого эпизода.

Мой друг однажды сказал мне: «Знаешь, для некоторых людей язык C — это просто набор макросов, который разворачивается в ассемблерные инструкции». Это было давно (для всезнаек: да, ещё до появления LLVM), но эти слова хорошо мне запомнились. Может быть, когда Керниган и Ритчи смотрят на C-программу, они на самом деле видят ассемблерный код? А Тим Бёрнерс-Ли? Может он сёрфит интернет по-другому, не так, как мы? И что, в конце концов, Киану Ривз видел в том жутком зелёном месиве? Нет, правда, что, чёрт побери, он там видел?! Эм… вернёмся к программам. Что видит Гвидо ван Россум, когда читает программы на Python?
Узнать ответ
Всего голосов 98: ↑93 и ↓5+88
Комментарии60

Информация

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