Pull to refresh
808
0
Владимир @tangro

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

Send message

Почему программировать легко

Reading time 8 min
Views 68K
Прочитал я тут на Хабре отличную статью «Почему программировать так тяжело?» и сразу проникся к ней симпатией. «Боже мой!» — подумал я. Наконец-то можно показать толковый и взвешенный текст некоторым моим знакомым, считающим меня высокооплачиваемым бездельником, объяснить родственникам, что это за работа такая — «кнопки целый день тыкать» и предоставить защитившим кандидатские диссертации друзьям доказательства того, что и я тут тоже не коровам хвосты кручу в рабочее время. «Какая прекрасная статья!» — думал я. Наконец-то кто-то понял всю суть работы программиста и объяснил её сложность понятным языком!

И лишь одной малюсенькой детали в этой статье не хватало. Правды.


Правды о том, что программировать легко и приятно, что сложности надуманы, а плюсы работы — недооценены. И я думаю стоит исправить эту несправедливость, написав такую статью. И нет, я не буду тут скатываться в трёп о высоких зарплатах, востребованности на рынке и высокой мобильности. Это всё ведь не о программировании, это о стиле жизни программиста, что не совсем то. А мы ведь на Хабре, а не на Мегамозге каком-то, поэтому давайте рассмотрим именно программирование, во всей его завораживающей красоте и устрашающей мощи!
Читать дальше →
Total votes 89: ↑71 and ↓18 +53
Comments 172

Интервью с координатором проекта Code Club по обучению детей 9-11 лет основам программирования

Reading time 9 min
Views 11K
Добрый день, Иван
Здравствуйте

Расскажите, пожалуйста, что такое проект Code Club, с чего он начинался, кто его придумал?
Code Club — это британская инициатива по обучению детей 9-11 лет основам программирования. Она возникла около трех лет назад и с тех пор бурно развивается — в начале в самой Великобритании, а спустя некоторое время и по всему миру. В Великобритании сейчас уже более 2000 локаций, там это всё поддерживается на государственном уровне: есть база волонтёров, есть база локаций — всё очень серьёзно организовано. После перехода рубежа в 1000 локаций проект начал выходить на международный уровень. Примерно с лета 2013 года заработал сайт codeclubworld.org — занимаются им те же британцы, но задача у них уже более глобальная: координировать обучение детей программированию по всему миру, дать возможность каждому ребёнку получить знания об основах информатики.

Тогда же, летом 2013-го года было объявлено о старте осенью проекта Code Club в Украине. Были названы первые города, в которых планировалось открытие первых локаций и были контактные данные координатора. Так всё начиналось.

Что входит в программу обучения?
Первые семестры проекта Code Club рассказывают о разработке программ с помощью визуального программирования. Мы учим детей работе в среде Scratch — это разработка MIT, которая создавалась именно под возраст 9-11 лет. В следующих семестрах Code Club изучается HTML, CSS и Python.
Читать дальше →
Total votes 13: ↑13 and ↓0 +13
Comments 5

Использование монад в С++. Часть 2: монада состояния

Reading time 8 min
Views 14K
Часть 1
Часть 2

Что вы сделаете, если завтра выиграете в лотерею? Купите спортивную машину, бросите работу и поедете в турне по США? А может быть станете основателем собственной компании, приумножите состояние и купите личный самолёт?

Мы все любим делать планы, и чаще всего они опираются на наше финансовое состояние. Такие планы могут быть описаны функцией. К примеру, план покупки машины это:

pair<Car, Cash> buyCar(Cash cashIn)


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

template<class A>
using Plan = function<pair<A, Cash>(Cash)>;


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

template<class A>
Plan<A> got_it(A a)
{
    return [a](Cash s) { return make_pair(a, s); };
}


Какое отношение имеют все эти мечты к решению нашего пазла? Ранее я говорил, что нам нужно где-то сохранять состояние, и это способ, которым программисты на функциональных языках работают с состоянием. Вместо явного модифицирования состояния они пишут код, который генерирует план действий.
Читать дальше →
Total votes 14: ↑12 and ↓2 +10
Comments 4

Использование монад в С++. Часть 1: монада списка

Reading time 10 min
Views 33K
Часть 1
Часть 2

Иногда программисты на С++ просят привести пример задачи, которая не может быть решена без использования монад. Начнём с того, что этот вопрос неверен сам по себе — это всё-равно, что спрашивать, существует ли задача, которая не может быть решена без циклов. Очевидно, если в вашем языке есть поддержка оператора goto, вы можете обойтись без использования операторов цикла. Что монады (и циклы) могут сделать для вас, это упростить ваш код и помочь лучше его структурировать. Как использование циклов превращает спагетти-код в нормальный, так и использование монад может превратить ваш код в императивном стиле в декларативный. Эта трансформация может помочь легче писать, понимать, поддерживать и расширять ваш код.

Ну и вот вам задачка, которая может попасться на собеседовании. Она не совсем тривиальна, возможно несколько подходов к решению и лучший из них не сразу очевиден — как-раз то, над чем стоит подумать.
Вам предлагается следующий пазл:

  s e n d
+ m o r e
---------
m o n e y


Каждая буква соответствует цифре от 0 до 9. Нужно написать программу, которая подберёт такие соответствия, чтобы написанная операция сложения была верной. Перед тем, как продолжить чтение статьи — подумайте минутку, как бы вы решили эту задачу?
Читать дальше →
Total votes 45: ↑41 and ↓4 +37
Comments 56

Введение в Amazon EC2 Container Service

Reading time 5 min
Views 19K
Ни для кого сегодня уже не является секретом (или даже новостью) успех технологий контейнеризации в общем и платформы Docker, как успешного практического решения, в частности. Каждый, кто хотя бы раз попробовал упаковать своё приложение в контейнер, испытал это ощущения чисто детского счастья от понимания того, что вот она — упакованная и готовая к работе компонента, которая развернется где-угодно, в каких-угодно количествах и заработает там так же хорошо, как работала на компьютере разработчика. Деплоймент стал удовольствием, а не наказанием. «Гибкость» и «масштабируемость» перестали быть маркетинговой чушью из рекламных буклетов и стали реально достижимыми вещами. Писать микросервисы стало не просто «модно», но попросту логично и практично. Контейнеры навсегда изменили мир. (Была, тут правда, вчера мысль о том, что контейнеры — это зло, но в комментариях вроде бы разобрались, что не в контейнерах конкретно беда, а в общем подходе к безопасности)

Не прошло и 100 лет, как это заметила компания Amazon, выпустив в конце 2014-го в бету свой новый сервис — Amazon EC2 Container Service. Общий смысл сервиса — дать возможность разворачивать Docker-контейнеры удобным способом. «Удобным» — означает без необходимости углубляться во внутренности Docker, да и вообще делать что-либо руками в консоли хост-машины. Вы просто создаёте новый кластер, добавляете в него виртуалки, на которых будут работать контейнеры, а потом указываете сколько и каких контейнеров нужно запустить. Всё остальное (выбор на какой машине запустить контейнер, права доступа, проброс портов) Амазон берёт на себя. Кроме того, вы можете использовать из Docker-контейнера всю инфраструктуру Амазона — сохранять файлы на S3, пользоваться очередями SQS, прикрутить на входе амазоновский балансировщик нагрузки, а на выходе — амазоновские логи и сервисы аналитики. Контейнеры могут «видеть» друг друга, делиться (или не делиться) ресурсами, стартовать и быть остановленными из консоли AWS (вручную либо по заданным правилам).



Давайте попробуем что-нибудь запустить в Amazon EC2 Container Service. Например, поднимем Wordpress + Mysql.
Читать дальше →
Total votes 18: ↑17 and ↓1 +16
Comments 5

GammaRay — средство интроспекции Qt-приложений

Reading time 4 min
Views 15K
Фреймворк Qt предоставляет неплохие средства разработки — входящая в него IDE Qt Creator включает дизайнер, отладчик, профайлер и другие удобные вещи. К сожалению, даже со всем этим иногда не очень понятно, почему приложение в данные момент выглядит так, как выглядит: чего-то не видно, что-то выглядит не так, как ожидалось, где-то неподходящий размер шрифта или неверная картинка.

Часть этих проблем может быть решена в Qt Designer, но только часть. Qt Designer имеет несколько существенных недостатков: во-первых, он неверно отображает положение Qt Quick компонентов в случае активного использования Javascript при расчете их координат и размеров, во-вторых в дизайнере мы видим состояние только «пустой» формы, без загруженных в неё данных. В общем, очень не хватает чего-то вроде инструментов разработчика в любом современном браузере: чтобы можно было посмотреть всё дерево компонентов, найти нужный, увидеть его положение относительно других, свойства, поправить на лету что-то, подобрать цвет\шрифт\размер, увидеть какие обработчики повешены на события и т.д.

И такой инструмент в мире Qt появился! Встречайте — GammaRay, средство интроспекции приложений на Qt. GammaRay понимает, что такое Qt, из чего состоит ваше Qt-приложение, как в нём взаимодействую компоненты, как они выглядят, как генерируются и обрабатываются события и т.д. Давайте посмотрим, что умеет GammaRay.


Читать дальше →
Total votes 28: ↑28 and ↓0 +28
Comments 6

Особенности внедрения DLL и установки хуков в Modern-приложениях Windows 8/10

Reading time 4 min
Views 17K
Для чего вообще нужно внедрять свои DLL-ки в чужие процессы и устанавливать там хуки? Для того, чтобы понять какие функции будет вызывать это приложение, с какими параметрами и что эти функции вернут. Таким образом мы можем понять внутреннюю логику работы этого приложения, узнать к каким файлам оно пытается получить доступ, какие данные пересылает по сети, мы можем добавить в него логирование, профилирование, отладить баг, получить из приложения некоторые данные или наоборот — добавить в его интерфейс что-нибудь нужное нам. Хуки использует известная утилита Spy++ для работы с окнами приложений, DirectX-отладчики вроде RenderDoc, некоторые утилиты от SysInternals, программы типа ApiMonitor и т.д.

Некоторое время назад я писал вводные статьи об использовании хуков на примерах библиотек Microsoft Detours и madCodeHook (если вы совсем не знакомы с хуками — это то, с чего можно начать). Описанных там техник достаточно для работы с обычными приложениями, но время не стоит на месте и вот сегодня у нас уже есть Metro Modern-приложения, входящие в комплект Windows 8 и Windows 10, а также распространяющиеся через Microsoft Store программы сторонних производителей. К примеру, новый браузер Spartan — это Modern-приложение. Внедрение DLL в эти процессы имеет свои особенности и на первый взгляд может даже показаться невозможным, но это не так. В этой статье я расскажу, как мы можем залезть внутрь Modern-приложения и установить в нём хуки в своих коварных целях.
Читать дальше →
Total votes 24: ↑23 and ↓1 +22
Comments 1

Обнаружены поддельные сертификаты для доменов Google

Reading time 2 min
Views 22K
20-го марта 2015 года Google получил информацию о существовании поддельных цифровых сертификатов для нескольких своих доменов. Сертификаты были выданы промежуточным центром сертификации, относящимся к компании MCS Holdings. Промежуточный сертификат этой компании был выдан CNNIC (China Internet Network Information Center — административное агентство, управляющее доменом cn и подконтрольное Министерству Информатизации Китая).

CNNIC включен во все основные списки доверенных сертификационных центров и поэтому выданным им сертификатам доверяет большинство браузеров и операционных систем. Chrome на всех операционных системах и Firefox версий 33 и старше отклоняют поддельные сертификаты для доменов Google из-за того, что их публичные ключи вшиты в бинарники браузеров, что, однако, не решает проблему вероятного существования поддельных сертификатов для других доменов.

Google оперативно оповестил CNNIC и разработчиков других браузеров об этом инциденте и заблокировал все выданные компанией MCS Holdings сертификаты путём обновления CRLSet. CNNIC ответили 22-го марта и объяснили, что у них был договор с MCS Holdings о том, что эта компания будет выпускать сертификаты только для доменов, которые будут ею зарегистрированы. Однако, вместо того, чтобы хранить приватный ключ в безопасном аппаратном хранилище, MCS прошила его в свой продукт — man-in-the-middle прокси-сервер. Эти устройства позволяли на лету сгенерировать поддельные сертификаты для посещаемых пользователями https-ресурсов, позволяя, к примеру, компаниям следить за своими работниками таким образом, что у тех не возникало подозрений в том, что их текущее соединение не является безопасным. Ситуация похожа на случай с ANSSI в 2013-ом году.
Читать дальше →
Total votes 24: ↑24 and ↓0 +24
Comments 50

Как могла бы выглядеть поддержка JSON в современном С++

Reading time 5 min
Views 62K
Хорошо в плане поддержки JSON живётся программистам на Javascript — по какому-то невероятному стечению обстоятельств там JSON входит в спецификацию самого языка: есть JSON — есть объект. Удобно. Неплохо дело обстоит и в языках, где JSON не входит в сам язык, но поддерживается стандартной библиотекой (Python, Ruby): импортируешь модуль — и готово.

Жизнь программистов на С++ никогда не была особо простой — поддержки JSON у нас нет ни на уровне языка, ни в стандартной библиотеке. И не будет, возможно, никогда. «Тоже мне проблему нашел!» — скажут мне опытные коллеги — «Её там и не должно быть, С++ поставляется без „батареек“. Для решения этой задачи мы...» и вот здесь они разделятся на два лагеря:

1. «Мы используем большой фреймворк (boost, Qt, POCO, другой), который применяется во всех наших проектах и умеет 150 000 разных вещей, в том числе и JSON.»
2. «Мы придерживаемся подхода в котором для каждой задачи применяется своя легковесная библиотека. В частности, для JSON мы уже 150 000 лет назад выбрали отличную библиотеку %JSON_LIB%, которая прекрасно работает.»

Да, всё так и есть. Вот только…

Чем плох подход с использованием фреймворков
Во-первых, тянуть в проект огромный фреймворк ради одного JSON — как-то уныло. Ну ладно, допустим фреймворк у вас был и так. Но тогда придётся писать работу с JSON в терминах фреймворка, а это, как правило, тихий ужас. Посмотрите, например, на документацию по JSON в Qt — куча собственных типов вроде QJsonArray, QJsonDocument, QJsonObject, QJsonValue и т.д. и их придётся использовать. О том, чтобы потом перенести код в другой проект (где этого фреймворка нет) можно сразу забыть. Ну или вот Boost: парсер JSON находится очень логично в модуле Boost.PropertyTree. Ага, так бы я и догадался. Т.е. нам предлагают плясать не от формата JSON, а от структуры данных «дерево», которая умеет себя читать в том числе и из JSON.

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


Чем плох подход с использованием библиотек
Плох он вот этой частью: "...150 000 лет назад выбрали отличную библиотеку...". Скорее всего речь идёт о чём-то, что начинало писаться чуть-ли не во времена DOSа и, без сомнения, работает, но при этом, пытаясь быть совместимым со всеми платформами и стандартами языка совершенно отстаёт от прогресса. Да, всё компилируется и работает, даже тесты проходит. Но библиотека совершенно не знакома с такими вещами, как ключевое слово auto, range-based циклы, строковые литералы, raw-строки, конструкторы перемещения, списки инициализации и прочие классные вещи, делающие код одновременно более эффективным и более легко читаемым. А ведь у библиотеки, созданной годы назад, есть обязательства по обратной совместимости, а значит просто так взять и добавить это всё она не может.


Давайте немного помечтаем.

А что, если бы JSON вошел в стандартную библиотеку нового стандарта С++? Что, если бы он был написан в терминах С++11\14 и без требований обратной совместимости со старыми стандартами языка? Что, если бы синтаксис этого модуля попытались бы сделать максимально приближенным к родному для JSON использованию «а-ля Javascript», но в том же время сохранить дух С++ (эффективность, минимальное потребление памяти, совместимость с STL)? Что, если бы его можно было включить в проект одним инклюдом и не беспокоиться о его сборке и линковке? Как бы это всё выглядело и работало?

И у нас есть ответ на этот вопрос! Давайте посмотрим на JSON-библиотеку для С++ написанную в соответствии со всеми этими принципами, ну и вообще написанной людьми для людей, а не чужими для хищников, как это обычно бывает.
Читать дальше →
Total votes 67: ↑62 and ↓5 +57
Comments 51

Использование технологии Microsoft Active Accessibility для доступа к содержимому браузера

Reading time 6 min
Views 13K
Давайте придумаем решение вот такой-вот простенькой задачи.
Имеется: браузер (IE, Chrome или Firefox), уже запущенный пользователем.
Требуется: написать программу, которая получит URL, который в данный момент введён в адресной строке.

Давайте подумаем, каким образом эту простенькую задачу решить НЕ получится:

1. FindWindow + GetWindowText
Почему не получится
Первая идея — найти окно браузера, в нём дочернее окно адресной строки и взять URL оттуда. Практика показывает, что отдельное дочернее окно для адресной строки имеет только IE. FF и Chrome кросплатформенны, поэтому предпочитают весь свой контент отрисовывать самостоятельно.

2. Браузерное расширение, которое отдаст URL нашей программе (например, через запрос к localhost)
Почему не получится
Можно. Но во-первых, для трёх браузеров нужно будет написать 3 разных расширения, а во-вторых, для FF и Chrome мы будем вынуждены распространять его только через их магазины расширений. Писать программу, работоспособность которой зависит от того, зачешется ли сегодня левая пятка модератора — нет уж, увольте.

3. Давайте напишем сниффер и посмотрим что там пользователь открывал
Почему не получится
А давайте! Но что дальше? Даже если из потока трафика мы выделим данные, полученные именно браузером и расшифруем HTTP-протокол, мы всё-равно не узнаем именно текущий URL (ссылок в потоке будет много). Кроме того, сразу идут в сад HTTPS-соединения, HTTP/2, ссылки на локально открытые файлы, ссылки на внутренние страницы (типа chrome://settings) и т.д.

4. Давайте воспользуемся Remote Debugging Protocol ну или каким-нибудь Selenium-ом
Почему не получится
Не подходит из-за ограничения условий исходной задачи: браузер уже запущен, мы не можем запустить новый подконтрольный экземпляр, нам нужно взаимодействовать с уже имеющимся.

5. Может быть, хуки?
Почему не получится
Ну, внедриться-то мы в браузер сможем. А на что вешать хуки? Для IE всё ясно — SetWindowText для окна адресной строки (но с ним и более простой способ №1 проходил). А в FF и Chrome у нас нет каких-то чётко определённых объектов и интерфейсов, на которые мы можем завязаться. Можно что-то сделать с конкретной версией браузера, но универсального решения не получится.

6. Скриншот окна браузера, определение положения адресной строки, распознавание текста с картинки!
Почему не получится
Уже как-то начинает смахивать на отчаяние, правда? Прикинем все варианты цветовых схем ОС, разрешений, масштабов, учтём наличие в браузере плагинов, цветовых схем, нестандартного расположения элементов, right-to-left языковых локалей ну и закончим случаем, когда окно адресной строки слишком узкое, чтобы вместить URL полностью.

7. Ваш вариант
А напишите в комментариях, какие ещё решения вам приходят в голову и мы подумаем, получится или нет.

А теперь один из правильных ответов: мы воспользуемся уже старенькой, но весьма стабильной и поддерживаемой всеми браузерами во всех ОС с Win95 до Win10 технологией Microsoft Active Accessibility, которая даст нам возможность не только получить текущий URL (при чём одинаковым образом для всех браузеров), но и вообще дать доступ ко всему контенту браузера — от самого родительского окна с его заголовком, меню, тулбаром, вкладками и до содержимого открытой веб-страницы вплоть до самого последнего её элемента.
Читать дальше →
Total votes 22: ↑18 and ↓4 +14
Comments 20

Модификация HTTP-трафика с помощью FiddlerScript и .NET-плагинов к Fiddler

Reading time 5 min
Views 17K
На Хабре уже неоднократно рассказывали о таком мощном и удобном средстве мониторинга HTTP-трафика, как Fiddler. Все имеющиеся статьи, однако, рассказывают о встроенных фичах программы, не акцентируя внимания на возможностях её расширения, которых существует целых две: с помощью встроенного языка FiddlerScript и с помощью написания .NET-плагинов. В этой статье мы рассмотрим и то, и другое, а чтобы было интереснее — используем их для решения вполне практической задачи, о которой я писал в своей прошлой статье (подмене битых ссылок на картинки в статьях на Хабре на рабочие).

Итак, давайте вспомним для начала, чем закончилась прошлая статья: мы получили список нерабочих ссылок на картинки и соответствующих им рабочих ссылок на веб-архиве. Теперь нужно отдать их браузеру и для этого мы напишем расширения к Fiddler (одно на FiddlerScript и одно на .NET). Обратите внимание на удобства полученного решения: да, нам нужно будет запустить Fiddler, но зато битые ссылки будут подменяться на рабочие независимо от домена статьи (хабр, гиктаймс или мегамозг), независимо от используемого браузера (лишь бы имел поддержку прокси) и даже мобильные устройства можно будет настроить на использование установленного на компьютере Fiddler в качестве прокси.
Читать дальше →
Total votes 19: ↑17 and ↓2 +15
Comments 3

Чтение старых статей Хабра с картинками

Reading time 3 min
Views 27K
Некоторое время назад решил я освежить знания и почитать что-нибудь о графах. «Ну конечно же, на Хабре должны быть хорошие статьи!» — подумал я, и оказался прав. Статьи есть и их много. Но выглядит они преимущественно вот так: раз, два, три. Откройте и догадайтесь с одной попытки почему что-то понять из этих статей совершенно невозможно, хотя написано вполне понятным языком. Нет картинок! Ну а как изучать графы без картинок? Никак.

Новичок на Хабре недоуменно спросит: «Как так — нет картинок? Есть же habrastorage.org!». Да, есть. Но был он не всегда, а автоматически на него перезаливаться картинки и вовсе стали только в июле 2013-го. А до этого картинки хостились где-попало — на всяких радикалах, имейджхаках, даже на дропбокс, бывало, люди наивно пытались что-то выкладывать. В итоге мы имеем на Хабре кучу статей 2006-2013 года с отсутствующими картинками.

Давайте это пофиксим!
Читать дальше →
Total votes 70: ↑67 and ↓3 +64
Comments 19

Boost.DI: внедрение зависимости в С++

Reading time 15 min
Views 26K
«Не звони нам. Мы позвоним тебе сами.» — принцип Голливуда

Внедрение зависимости (Dependency Injection — DI) означает передачу (внедрение) одной или более зависимости какому-либо объекту (клиенту, компоненту) таким образом, что после внедрения эта зависимость становится частью состояния объекта. Это немного напоминает паттерн проектирования Стратегия, с той лишь разницей, что стратегия задаётся лишь однажды — в конструкторе. DI позволяет создавать более слабо-связанную архитектуру приложения, которая лучше поддаётся поддержке и тестированию.

Итак, ещё раз плюсы:
  • Уменьшает связность компонент (отделяет бизнес-логику от создания объекта)
  • Позволяет писать более поддерживаемый код (в одни и те же объекты мы легко можем внедрять разные зависимости)
  • Позволяет писать более тестируемый код (мы можем легче использовать стабы и моки)


Без внедрения зависимости С внедрением зависимости
class example {                         
public:  
    example()                           
        : logic_(new logic{})           
        , logger_(                      
            logger_factory::create()    
          )                             
    { }  
         
    int run() const;                    
         
private: 
    shared_ptr<ilogic> logic_;          
    shared_ptr<ilogger> logger_;        
};                             

 class example {
 public:
     example(shared_ptr<ilogic> logic
           , shared_ptr<ilogger> logger)
       : logic_(logic), logger_(logger)
     { }

     int run() const;

 private:
     shared_ptr<ilogic> logic_;
     shared_ptr<ilogger> logger_;
 };


Читать дальше →
Total votes 40: ↑38 and ↓2 +36
Comments 2

C++ в 2015-м году

Reading time 3 min
Views 38K
Год только начинается, так что давайте посмотрим, что язык С++ ожидает в 2015-м, как мы уже делали это в 2013-м и 2014-м.

Прошлый год принёс много изменений, главным из которых, безусловно, является стандарт С++14. Что важно, С++14 сегодня существует не только в виде стандарта, но и частично поддерживается GCC и Clang. Visual Studio также поддерживает некоторые (хотя и далеко не все) возможности С++14 и почти все (хотя опять таки не 100%) возможности С++11. Компилятор от Intel стал совместим с С++11 полностью. Таким образом, современные стандарты С++ доступны под все платформы — было бы только желание их использовать!
Читать дальше →
Total votes 60: ↑54 and ↓6 +48
Comments 15

Scapegoat-деревья

Reading time 7 min
Views 11K
Сегодня мы посмотрим на структуру данных, называемую Scapegoat-деревом. «Scapegoat», кто не в курсе, переводится как «козёл отпущения», что делает дословный перевод названия структуры каким-то странным, поэтому будем использовать оригинальное название. Деревьев поиска, как вы, возможно, знаете есть очень много разных видов, и в основе всех их лежит одна и та же идея: "А хорошо бы при поиске элемента перебирать не весь набор данных подряд, а только какую-то часть, желательно размера порядка log(N)".

Для этого каждая вершина хранит ссылки на своих детей и какой-то критерий, по которому при поиске точно понятно, в какую из дочерних вершин надо перейти. За логарифмическое время это всё будет работать тогда, когда дерево является сбалансированным (ну или стремится к этому) — т.е. когда «высота» каждого из поддеревьев каждой вершины примерно одинакова. А вот способы балансировки дерева уже у каждого типа деревьев свои: в красно-чёрных деревьях в вершинах хранятся маркеры «цвета», подсказывающие когда и как нужно перебалансировать дерево, в АВЛ-деревьях в вершинах хранится разница высот детей, Splay-деревья ради балансировки вынуждены изменять дерево во время операций поиска и т.д.

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

К достоинствам Scapegoat-дерева можно отнести:
  • Отсутствие необходимости хранить какие-либо дополнительные данные в вершинах (а значит мы выигрываем по памяти у красно-черных, АВЛ и декартовых деревьев)
  • Отсутствие необходимости перебалансировать дерево при операции поиска (а значит мы можем гарантировать максимальное время поиска O(log N), в отличии от Splay-деревьев, где гарантируется только амортизированное O(log N))
  • Амортизированная сложность операций вставки и удаления O(log N) — это в общем-то аналогично остальным типам деревьев
  • При построении дерева мы выбираем некоторый коэффициент «строгости» α, который позволяет «тюнинговать» дерево, делая операции поиска более быстрыми за счет замедления операций модификации или наоборот. Можно реализовать структуру данных, а дальше уже подбирать коэффициент по результатам тестов на реальных данных и специфики использования дерева.

К недостаткам можно отнести:
  • В худшем случае операции модификации дерева могут занять O(n) времени (амортизированна сложность у них по-прежнему O(log N), но защиты от «плохих» случаев нет).
  • Можно неправильно оценить частоту разных операций с деревом и ошибиться с выбором коэффициента α — в результате часто используемые операции будут работать долго, а редко используемые — быстро, что как-то не хорошо.

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

Именованные параметры в современном C++

Reading time 14 min
Views 29K
Из Википедии: "Именованные параметры в языках программирования означают поддержку указания явных имен параметров в вызове функции. Вызов функции, принимающей именованные параметры, отличается от обычного вызова функции, в котором передаваемые аргументы ассоциируются с параметрами функции лишь только по их порядку в вызове функции"

Давайте посмотрим на пример:

createArray(10, 20); // Что это значит? Что за "10" ? Что за "20" ?
createArray(length=10, capacity=20); // О, вот теперь понятнее!
createArray(capacity=20, length=10); // И наоборот тоже работает.


И еще один пример на выдуманном псевдо-языке:
window = new Window {
   xPosition = 10,
   yPosition = 20,
   width = 100,
   height = 50
};


Этот подход особенно полезен для функций с большим количеством опциональных параметров, при вызове которых нужно изменить лишь некоторую часть дефолтных значений. Некоторые языки программирования поддерживают именованные параметры (C#, Objective-C, ...), но не С++. В этом посте мы рассмотрим пару классических способов эмуляции именованных параметров в С++, ну и попробуем придумать что-то новое.
Читать дальше →
Total votes 28: ↑27 and ↓1 +26
Comments 32

Рефакторинг C++ кода в Visual Studio 2015

Reading time 3 min
Views 25K
Hello C++ World!

В прошлую пятницу вышел релиз Visual Studio 2015 Preview, в котором были представлены новые возможности увеличения продуктивности разработки, в том числе рефакторинг кода на С++. В значительной мере на реализацию этого функционала повлияли отзывы комьюнити, которые были получены в ходе тестирования Visual Studio «14» CTPs, так что спасибо всем поучаствовавшим.

В этой статье мы рассмотрим такие возможности Visual Studio 2015 Preview по работе над С++ кодом, как:
  • Переименование (Rename)
  • Извлечение функции (Extract Function)
  • Генерация заглушек чисто виртуальных методов (Implement Pure Virtuals)
  • Генерация объявлений/заглушек методов (Create Declaration/Definition)
  • Перемещение объявлений функций (Move Function Definition)
  • Преобразование в Raw-String (Convert to Raw-String Literal)

Читать дальше →
Total votes 20: ↑17 and ↓3 +14
Comments 15

Proxygen — HTTP-фреймворк для С++ от Facebook

Reading time 8 min
Views 18K
Proxygen — это коллекция библиотек для использования протокола HTTP на С++, включающая в числе прочего очень простой в использовании HTTP-сервер. Кроме классического HTTP/1.1 фреймворк Proxygen поддерживает SPDY/3 и SPDY/3.1. Вскоре также будет полностью поддерживаться HTTP/2.

Proxygen не задумывался как замена Apache или nginx — эти проекты сфокусированы на создании достаточно гибких и конфигурируемых веб-серверов, позволяющих благодаря тонкой настройке добиться максимальной производительности. Задачей Proxygen является работать достаточно хорошо на дефолтных настройках, давая программисту простые в использовании веб-сервер и веб-клиент, легко интегрирующиеся в уже существующие проекты. Мы хотим помочь людям строить веб-сервисы на С++ с меньшими затратами и мы верим, что Proxygen — отличный фреймворк для этого. Вы можете почитать документацию по нему и подключиться к разработке на Github.

Читать дальше →
Total votes 36: ↑34 and ↓2 +32
Comments 19

Доклады конференции CppCon 2014

Reading time 6 min
Views 13K
Недавно в городе Белвью (штат Вашингтон) прошла одна из самых больших конференций С++ разработчиков — CppCon 2014. В течение пяти дней ведущие программисты таких компаний как Microsoft, Google, Dropbox, Citrix, Embarcadero, Ubisoft, разработчики стандарта языка, создатели компиляторов С++ и члены комьюнити opensource-продуктов представляли свои доклады, делились мнениями о будущем языка, предлагали новые идеи. Ниже я представлю выборку наиболее понравившихся мне видео с небольшими комментариями от себя. Хочется отметить, что вся конференция просто пропитана духом возрождения С++ в виду распространения стандартов С++11\14, люди рассказывают почему выбор С++ оказался для них верным, как они успешно мигрировали с C#\Java\Objective-C на С++ и не пожалели об этом и т.д.

Удачного просмотра!

Докладчики из Dropbox рассказывают о том, как они разрабатывают на С++ кроссплатформенные мобильные приложения.
Когда-то у Дропбокса были классические мобильные приложения: Java-код для Android и Objetive-C для iOs. Однако со временем команде разработчиков надоело писать одно и то же по 2 раза на разных языках и они пришли к выводу о необходимости создания общей кодовой базы на С++. Со временем оказалось, что какую бы архитектуру не имело приложение (MVC, MVVM или что-нибудь другое), фактически весь код кроме вьюх может быть вынесен в С++. Действительно, на С++ можно реализовать модель данных, контроллеры, бизнес-логику, вспомогательные библиотеки для работы с сетью, базами данных, парсингу и т.д. Всё, что остаётся на долю Java и Objective-C — нарисовать «родные» для данной платформы кнопки\списки\лейбы на вьюхах. И этот подход существенно более прагматичен, чем писать всё дважды.

Первое видео более обзорное, второе более практическое:


Читать дальше →
Total votes 26: ↑26 and ↓0 +26
Comments 7

Методы расширения в С++

Reading time 4 min
Views 30K
Несколько дней назад Бьёрн Страуструп опубликовал предложение N4174 комитету по стандартизации С++ названное "Call syntax: x.f(y) vs. f(x,y)". Вот вкратце его суть: объявить выражение x.f(y) (вызов для объекта х метода f с аргументом y) эквивалентным выражению f(x,y) (вызов функции f с аргументами x и y). Т.е.

x.f(y) означает:
  1. Попробовать вызвать x.f(y): если класс объекта х содержит метод f, который может принять аргумент y — используем этот метод.
  2. Если пункт №1 не удался — проверяем, существует ли функция f, которая может принять аргументы x и y. Если это так — используем её.
  3. Если не найдено ни того, ни другого — генерируем ошибку.

f(x,y) означает ровно то же самое:
  1. Попробовать вызвать x.f(y): если класс объекта х содержит метод f, который может принять аргумент y — используем этот метод.
  2. Если пункт №1 не удался — проверяем, существует ли функция f, которая может принять аргументы x и y. Если это так — используем её.
  3. Если не найдено ни того, ни другого — генерируем ошибку.

Таким образом мы получаем возможность писать методы расширения, о которых мечтали многие С++ программисты. Я считаю это предложение одним из самых важных в эволюции языка С++.
Читать дальше →
Total votes 72: ↑68 and ↓4 +64
Comments 77

Information

Rating
Does not participate
Location
Украина
Registered
Activity