Pull to refresh
4
0
Андрей @cdmnk

User

Send message

Перехват видео в браузере или TCP сниффер под Windows на коленке (часть первая)

Reading time19 min
Views39K
Однажды, не очень давно, мне порекомендовали фоновую качалку потокового видео под названием Jaksta, которая позволяет записывать потоковое видео на диск прямо во время просмотра YouTube, Facebook видео, GoogleVideo и так далее. В результате ее установки я получил стойкий BSOD при каждой загрузке Windows. Переключившись в Safe Mode я снес нафиг это творение, но возникли вопросы.
Краткое изучение софтины показало что она устанавливет NDIS Miniport драйвер, который конкретно в моей системе стал умирать при загрузке. «Нафига такие сложности?», подумал я и решил поэкспериментировать с реализацией перехвата потокового видео из браузера без всяких драйверов.
Читать дальше →
Total votes 91: ↑85 and ↓6+79
Comments38

Перегрузка и наследование

Reading time5 min
Views74K
Существует определенный набор возможностей в любом языке программирования для понимания которых нужно просто знать, как они реализованы. Вот, например, замыкания; это не сверх сложная концепция, но знание того, как этот зверь устроен позволяет делать определенные выводы относительно поведения замыканий с переменными цикла. Тоже самое касается вызова виртуальных методов в конструкторе базового класса: здесь нет одного правильного решения и нужно просто знать, что именно решили разработчики языка и будет ли вызываться метод наследника (как в Java или C#), или же «полиморфное» поведение в конструкторе не работает и будет вызываться метод базового класса (как в С++).

Еще одним типом проблемы у которой нет идеального решения, является совмещение перегрузки методов (overloading) и переопределения (overriding) метода. Давайте рассмотрим следующий пример на языке C#. Предположим, у нас есть пара классов, Base и Derived, с виртуальным методом Foo(int) и невиртуальным методом Foo(object) в классе Derived:

Читать дальше →
Total votes 33: ↑30 and ↓3+27
Comments13

Duck typing или “так ли прост старина foreach?”

Reading time5 min
Views20K
Я думаю, что многие разработчики знают, что цикл foreach в языке C# не так прост, каким он кажется на первый взгляд. Для начала давайте ответим на вопрос: «А что нужно, чтобы конструкция foreach успешно компилировалась?». Интуитивным ответом на этот вопрос кажется что-то типа: «Реализация классом интерфейса IEnumerable или IEnumerable<T>.». Однако, это не так, ну, или не совсем так.

Полный ответ на этот вопрос такой: «Для того чтобы конструкция foreach успешно компилировалась необходимо, чтобы у объекта был метод GetEnumerator(), который вернет объект с методом MoveNext() и свойством Current, а если такого метода нет, то тогда будем искать интерфейсы IEnumerable и IEnumerable<T>».

Причин у такого «утиного» поведения две.
Читать дальше →
Total votes 52: ↑46 and ↓6+40
Comments35

Небольшой логгер стека вызовов для C++

Reading time5 min
Views23K

На написание этого топика меня сподвиг топик "Какие кодотрюки вы знаете?", и я хотел было поделиться данным логгером там, но автор просил «без фанатизма», и желал видеть такие трюки, на понимание которых требуется не больше пяти-десяти секунд, поэтому я решил вынести это дело в отдельный топик, т.к. по-быстрому такое взглядом не окинешь.

Будет рассмотрен небольшой, но иногда довольно полезный класс, плюс небольшой трюк с макросами, позволяющие проводить первичный анализ стека вызовов (call stack) прямо в stdout, в процессе работы программы. Разумеется, на stdout свет клином не сошёлся, и можете перенаправить хоть в файл, хоть куда-нибудь ещё — я лишь демонстрирую общий принцип.

Сразу договоримся:
  1. злоупотребление макросами — зло
  2. ничего нового и сверхъестественного в данной статье нет, она будет понятна даже новичку (на них и рассчитана)
  3. данный приём мало применим (или вообще не применим) в многопоточной среде
  4. реализация не претендует на идеальность, полноту, и уж тем более уникальность
  5. данный приём ни в коем случае не заменяет, а лишь дополняет дебаггер

Но если при написании программы вы не раз писали что-то вроде printf(«Entering Foo()\n»); для мониторинга входа в ту или иную функцию, то вы пришли как раз по адресу.
Поехали!
Total votes 63: ↑56 and ↓7+49
Comments38

События .NET в деталях

Reading time9 min
Views149K
Если вы .NET программист, то вы наверняка объявляли и использовали события в своем коде. Несмотря на это, не все знают, как события работают внутри и какие особенности связаны с их применением. В этой статье я попытался описать работу событий как можно более подробно, включая некоторые частные случаи, с которыми редко приходится иметь дело, но про которые важно и\или интересно знать.
Читать дальше →
Total votes 59: ↑57 and ↓2+55
Comments16

Может ли ваш язык программирования делать такое?

Reading time6 min
Views6.5K
Недавно я прочитал статью Джоэла Спольски “Can your programming language do this?”и она настолько сильно пришлась мне по душе, что я решил перевести ее. Но не просто так, а добавить немного от себя. А именно, вместо примеров на JavaScript (использованных Джоэлем в оригинале), я решил написать примеры на С#, который мне на сегодняшний день ближе. Собственно результат и представляю на суд сообществу под катом.

Читать дальше →
Total votes 116: ↑74 and ↓42+32
Comments244

Goblin Wars II.NET – история создания сетевой игры на C# с нуля

Reading time18 min
Views27K
Добрый день, уважаемые хабровчане. Представляю вашему вниманию свой небольшой проект – сетевой 2D-шутер на C#. Несмотря на то, что визуальная составляющая весьма простая – в наш век уже никого не заинтересуешь 2D-играми, некоторые архитектурные решения могут заинтересовать людей, собирающихся написать свою игру. В статье я расскажу о вариантах реализации ключевых моментов игры.
Читать дальше →
Total votes 76: ↑64 and ↓12+52
Comments27

Тестовое задание для Связного FixedThreadPool на C#. Что здесь не так? UPD

Reading time25 min
Views11K
UPDATE: Я не мог отказать себе в удовольствии исправить свой ошибочный код. Добавил раздел «Работа над ошибками», в котором привожу исправленный код и описание исправлений, основанное на полученных комментариях.

Это скорее пост-вопрос к специалистам, нежели просто кусок полезной информации. Приглашаю к дискуссии.
Недавно я имел счастье послать своё резюме в Связной на позицию .NET разработчика. В ответ меня попросили сделать тестовое задание на знание многопоточности. Я не могу назвать себя экспертом в этой области, но, тем не менее, прекрасно понял, как мне показалось, как реализовать следующие требования:

Требуется реализация класса на языке C#, аналогичного FixedThreadPool в Java, со следующими требованиями:
  • В конструктор этого класса должно передаваться количество потоков, которые будут выполнять задачи.
  • Интерфейс класса должен предоставлять методы: boolean execute(Task task, Priority priority) и void stop()
  • Интерфейс Task должен содержать один метод: void execute(), который вызывается в произвольном потоке.
  • Тип Priority — это перечисление из трёх приоритетов: HIGH, NORMAL, LOW. При этом во время выбора следующего задания из очереди действуют такие правила: на три задачи с приоритетом HIGH выполняется одна задача с приоритетом NORMAL, задачи с приоритетом LOW не выполняются, пока в очереди есть хоть одна задача с другим приоритетом.
  • До вызова метода stop() задачи ставятся в очередь на выполнение и метод boolean execute(Task task, Priority priority) сразу же возвращает true, не дожидаясь завершения выполнения задачи; а после вызова stop() новые задачи не добавляются в очередь на выполнение, и метод boolean execute(Task task, Priority priority) сразу же возвращает false.
  • Метод stop() ожидает завершения всех текущих задач (не очищая очередь).


Поскольку в задании не было сказано какими примитивами я должен пользоваться, должен ли сделать всё на простейших Thread или же использовать ThreadPool, TPL и т.п., я решил, что задание предполагает использование самых базовых элементов: Thread, ManualResetEvents и т.п. Написал за несколько часов, отослал. Сегодня позвонил и получил ответ через кадровика, который звучал примерно так: «это даже не близко к том, что надо». Это меня озадачило, ибо код работает и протестирован, явных огрехов, на мой взгляд нету.

Итак, на ваш суд представляю мою реализацию FixedThreadPool и сопутствующих классов. Сразу предупреждаю, что, по их мнению реализация ошибочна, и, соответственно, брать мою идею за основу не стоит. Некоторые коментарии по коду:

  • я решил инкапсулировать потоки задач в самом классе задачи,
  • два параметра с типом ILog нужны только для тестовых целей, к основной функциональности они, понятное дело, отношения не имеют,
  • весь проект, включая тестовое приложение можно загрузкить по ссылке (27 килобайт): тестовый проект на ifolder

Читать дальше →
Total votes 41: ↑27 and ↓14+13
Comments51

Инициализаторы объектов в блоке using

Reading time3 min
Views13K
Инициализаторы объектов (Object Initializers) – это полезная возможность языка C#, которая позволяет инициализировать необходимые свойства объекта прямо во время его создания. Поскольку синтаксически эта «фича» очень близка к инициализации объекта с передачей параметров через конструктор, многие разработчики начинают забивать на принципы ООП (в частности на понятие инварианта) и использовать ее, где только можно.

Но даже если не переходить к холиварам и малопонятным терминам, давайте рассмотрим небольшой пример, и подумаем над тем, может ли он привести к проблемам или нет:

// position передается извне или настраиватся каким-то образом
long position = -1;
using (var file = new FileStream("d:\\1.txt", FileMode.Append)
                        {
                            // Мы точно знаем, что нужные данные расположены
                            // с некоторым сдвигом!
                            Position = position
                        })
{
    // Делаем чего-то с файлом
}


В данном фрагменте внутри директивы using создается ресурс (файл) и устанавливается одно из его свойств (Position) с помощью инициализатора объекта. При этом самое главное в этом коде то, что setter этого свойства может генерировать исключение.
Читать дальше →
Total votes 44: ↑40 and ↓4+36
Comments32

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

Reading time3 min
Views48K
Одна из главных проблем в разработке программного обеспечения – борьба с возрастающей сложностью системы. Решением этой проблемы занимаются с времен появления первых программ. Результатами являются языки, всё более упрощающие взаимодействие с машиной, парадигмы программирования вроде ООП, паттерны. В этой статье будут рассмотрены принципы программирования, позволяющие уменьшить сложность и облегчить сопровождение системы.
Читать дальше →
Total votes 75: ↑47 and ↓28+19
Comments39

Перестаньте писать классы

Reading time9 min
Views184K
Фото Джэка Дидриха из профиля на G+ Признак того, что объект не должен быть классом — если в нём всего 2 метода, и один из них — инициализация, __init__. Каждый раз видя это, подумайте: «наверное, мне нужна просто одна функция».

Каждый раз когда из написанного класса вы создаёте всего один экземпляр, используете только раз и тут же выбрасываете, следует думать: «ой, надо бы это отрефакторить! Можно сделать проще, намного проще!»

Перевод доклада Джэка Дидриха, одного из ключевых разработчиков языка Питон. Доклад прозвучал 9 марта 2012 на конференции PyCon US.
Читать дальше →
Total votes 234: ↑206 and ↓28+178
Comments148

.Net Локализованные сообщения «относительного времени»

Reading time4 min
Views1.3K
Всем привет,

На текущем проекте, от заказчика пришли требования, о том, что информация о прошедших событиях, должна показываться клиенту в виде «относительно времени» (Сообщение вида: «Событие произошло N минуту\минут\минуты назад»). Нам пришли шаблоны сообщений для разных вариантов, а также требования к внешнему виду, одним из которых было то, что сообщения должны быть локализованы.

«Что здесь сложного?», — подумали мы и отправились в гугл, на поиски готового решения. К сожалению, гугл изображал из себя партизана, предлагал несколько вариантов готовых решений для построения такого типа сообщений для английского языка, но ни одно из них не поддерживало локализации.

«Делать нечего, придется поддержать российский автопром изобретать свой велосипед», — решили мы. И вот, что из этого получилось…
Читать дальше →
Total votes 19: ↑16 and ↓3+13
Comments8

Уязвимы по определению

Reading time4 min
Views39K
У многих людей, как-либо связанных с безопасностью, периодически возникает желание заняться pentest'ом, то есть тестом на проникновение. И чаще всего начинают все с pentest'а веб-приложений. Порог вхождения довольно мал (простейшая sqli определяется добавлением кавычки в параметр и эксплуатируется не особо сложнее), но при этом встречаются и довольно сложные задания, которые заставляют потратить пару-тройку дней на ковыряние.
Но возникает вопрос — где применять теоретические знания, без страха внезапного появления маски-шоу? Под катом проведу небольшой обзор полигонов для экспериментов по pentest'у.
Читать дальше →
Total votes 89: ↑87 and ↓2+85
Comments29

Создание прокси-dll для запуска DirectDraw игр в окне

Reading time5 min
Views19K
В продолжение темы расширения функциональности готовых программ хотелось бы рассказать об ещё одном способе изменения логики работы уже скомпилированной программы, который не требует делать изменений в самом исполняемом файле. Это может пригодиться при распространении вашей модификации в США, где прямое вмешательство в исполняемый файл строго осуждается. Речь пойдёт о создании крошечной прокси-dll (всего ≈4 килобайта) для подмены используемой приложением библиотеки на примере ddraw.dll.
Читать дальше →
Total votes 71: ↑68 and ↓3+65
Comments32

Тренировка памяти

Reading time3 min
Views41K
Вы когда-нибудь задумывались, насколько важна память для человека и конкретно для вас? Что можно достичь, с помощью хорошей памяти? А давайте прикинем прямо сейчас!? Для начала я думаю, стоит вспомнить образование и работу: прочитали книгу за несколько дней и все запомнили, экзамены за вечер на 5, язык программирования за месяц… можно продолжать долго.

Некоторые люди рождаются с феноменальной памятью, а остальные могут память тренировать и достигнуть хоть и не феноменальных результатов, но очень даже приличных, которые позволят достичь очень больших высот, не говоря уже о довольно простых вещах, перечисленных чуть выше… Поэтому моя заметка именно о тренировке памяти обычных людей: сжато и по сути.
Читать дальше →
Total votes 88: ↑73 and ↓15+58
Comments61

Тонкости реализации кода библиотеки. Часть первая

Reading time2 min
Views6K
При написании библиотеки на C++ многие сталкиваются с определенными трудностями при написании и организации кода. У некоторых уже есть готовые решения, у других их нет и они пытаются найти эти решения.

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

Для начала, опишем эти трудности и представим обычные способы решения.

Предположим, что библиотека реализует некоторую сущность some_class, которую она предоставляет пользователю библиотеки. Определение some_class зависит от другой сущности библиотеки detail_class, которая является частью реализации и пользователю не предоставляется. Библиотека поставляется только в виде заголовочных файлов.
Читать дальше →
Total votes 30: ↑24 and ↓6+18
Comments30

Упорядочивание аудиотеки. Практические советы

Reading time9 min
Views213K

Введение


Вообще, я во многих вопросах перфекционист. Если есть — нужно, чтобы было безупречно (иногда это сказывается отрицательно, но сейчас не об этом). Свою аудиоколлекцию я тоже привык держать в чистоте. Но со временем, при пополнении стало накапливаться много мелких неприятностей. Вот некоторые из них:
  • Разные шаблоны для имен файлов: 4 — Звезда | 04 — Звезда | 04. Звезда
  • Разные имена исполнителей в тегах: Чиж & Co | Чиж и Ко. | Mylene Farmer | Mylène Farmer
  • Не указаны исполнители альбома (что приводит к полному бардаку в альбомах-компиляциях)
  • Не совсем корректная информация об альбомах, состоящих из нескольких дисков
  • Путаница в годах изданий и переизданий (ремастеринг, и т.д.)
Ну и прочие мелочи.
Часто у пользователей коллекции составляют несколько тысяч, а иногда — несколько десятков тысяч записей. Так что, перелопачивать все вручную — долго и неэффективно.

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

Итак, начнем...
Total votes 80: ↑76 and ↓4+72
Comments78

Жадные алгоритмы

Reading time4 min
Views185K
ДеньгиДоброго времени суток, хабр! Сегодня я бы хотел рассказать про жадные алгоритмы.

Есть много методов решения тех или иных задач: динамическое программирование, перебор. Не менее известными и довольно распространенными являются жадные алгоритмы.

Думаю, каждый программист в своей жизни хотя бы раз написал жадину, может быть, даже не задумываясь об этом. Что же это такое? Добро пожаловать под кат.
Читать дальше →
Total votes 106: ↑100 and ↓6+94
Comments17

Кроссплатформенность — это круто

Reading time8 min
Views30K
Этот пост участвует в конкурсе „Умные телефоны за умные посты“.

Ни для кого не секрет, что сегодня мобильные игры очень популярны. Возможность написать одну из таких игр есть у каждого разработчика, даже начинающего. Часто возникает вопрос с выбором платформы. Конечно, хочется, чтобы игра была сразу везде: на iOS и Android, на WP7 и MeeGo, на десктопе и в браузере. И чтобы все это можно было лекго реализовать с помощью бесплатных инструментов.



В этой статье я расскажу вам, как сделать основную часть кода платформонезависимой, а для остального использовать удобные средства разработки для каждой конкретной платформы.
Читать дальше →
Total votes 179: ↑168 and ↓11+157
Comments69

Information

Rating
Does not participate
Location
Минск, Минская обл., Беларусь
Date of birth
Registered
Activity