Дмитpий Hecтepук

Блог о программировании — C#, F#, C++, архитектура, и многое другое

Запускаем QuantLib в IPython Notebook

Честно говоря, я немного в шоке от того, насколько быстро Python откусил себе место в финансовом мире. Ведь всегда казалось что финансы – это удел CAS-ов вроде MATLAB или R, а также языка C++. Ан нет. Оказывается что Python тоже людям по душе, и даже соблазняет людей на генерацию оберток вокруг плюсовых библиотек.

Собственно в этом посте я хочу показать, как настроить под Python’ом библиотеку QuantLib, которая является пожалуй самой известной quant finance библиотекой с открытым кодом. Именно это сейчас неустанно демострирует Луиджи Баллабио, главный автор QuantLib.

Достаем Python

Для тех кто уже знаком с этим языком, никакой магии не будет. Наша цель – воспользоваться механизмом IPython notebook, который представляет собой Mathematica-образный интерфейс, на котором можно писать текст (включая LaTeX) а также команды, которые будут обработаны питоновским интерпретатором.

В качестве дистрибутива я выбрал Enthought Canopy Express. Дистрибутив этот поставляется для Windows, Linux и OSX, так что работать будет на любой О.С. и битности. Этот дистрибутив уже поставляется с NumPy, Matplotlib и IPython — вообщем всем, что нам позже потребуется.

“Ноутбуки” можно запускать сразу же после установки питона командой ipython notebook. Фактически, запустится отдельный веб-сервер, который развернет (не особо интуитивный) пользовательский интерфейс. Просто выбираем “New Notebook” в меню справа, и поехали.

Собираем обертку QuantLib

На самом деле, для QuantLib есть две обертки: кошерный, поставляемый из коробки интерфейс для SWIG а также Enthought’овский (сюрприз!) PyQL который работает поверх Cython но судя по комментариям в репо пока может не так много (плюс вроде не собирается на Windows, что как бы, это, проблемка).

Так что мы попробуем воспользоваться SWIG. Скажу сразу – будет это весьма непросто. Для того чтобы построить эту обертку, нам нужны следующие ингредиенты:

  • Полностью собранный Boost.

  • Собранный QuantLib (основные плюсовые либы). Параметры сборки должны быть, конечно же, совместимы с бустом.

  • Установленный SWIG, и swig.exe должен быть доступен в PATH.

  • Установленный Python, который опять же лучше сделать доступным везде.

Это все на самом деле очень болезненно. Например, мои Boost и QuantLib обычно оптимизированны Intel 64 компилятором, соответственно мне нужно добавлять в LIB и INCLUDE вагон всего! Пришлось написать целый batch-файл который выставляет все нужные переменные:

set ql_dir=c:\quantlib\quantlib
set path=%path%;c:\swig
set include=%include%;c:\boost
set lib=%lib%;c:\boost\stage\lib
set vs90comntools=%vs120comntools%

Но это еще не всё! Пришлось так же руками редактировать скрипт сборки чтобы добавить компилятору ключик /bigobj а в линковщике заменить /machine:I386 (wtf?!?) на /machine:X64.

Запуск

Если вы промучались и у вас вдруг все получилось, можно запускать ipython notebook и гонять примеры из квантлиба. Удивительно, но у меня примеры все заработали да и вообще, работать в этом можно!

ipython_quantlib

Written by Dmitri

7 Май 2015 at 12:42

Опубликовано в С++

Tagged with , ,

Cling — С++ интерпретатор на базе Clang

Один из самых серьезных проектов на земле – это Большой Адронный Коллайдер. Исследователи, которые с ним работают, собирают с него огромные объемы данных, а уж мы-то знаем насколько болезненна с ними работа, особенно если в качестве языка программирования ты, ради скорости, используешь С++ который может и исполняется быстро, но компилируется очень медленно.

В связи с этим, люди из CERN как раз и создали проект Root и, в частности, его часть под названием Cling. Cling — это интерпретатор С++, написан он на базе Clang, и является весьма уникальной тулзой в плане того, что для С++ это очень необычно.

Cling можно попробовать собрать из сорцов, но лень всегда побеждает, поэтому вместо этого можно скачать бинарники, которые каждый день собираются для Ubuntu, Mac OSX и Fedora.

А что на Windows?

С виндой все плохо, потому как Clang сам по себе не обладает ABI-совместимостью с местным MSVC и иже с ним, и вообще непонятно собирается ли Clang на “голой” Windows. Скорее всего нет. И в принципе можно его попробовать собрать под Cygwin (удачи!) но самое простое, если хочется поиграться, это развернуть Ubuntu’вую виртуалку и гонять все через SSH.

Вот собственно то кол-во телодвижений которое нужно сделать под Windows:

  1. Скачать образ Ubuntu Desktop.

  2. Сделать виртуальную машину. Если у вас работает Hyper-V (ага, вы потратились на современное железо, зачем?) то просто делаете виртуалку первого поколения (со 2-м Убунта не работает). Если Hyper-V не работает, воспользуйтесь VirtualBox.

  3. Ставите убунту на виртуалку

  4. Настраиваете сеть для убунты. Под Hyper-V это получилось не так уж и просто: сначала в Virtual Switch Manager нужно было сделать виртуальный External свич, а потом в убунте вместо DHCP, которое не поднялось, нужно было в сетевых настройках прописать статический IP.

  5. Чтобы не сидеть в убунте физически, вместо этого делаем

    sudo apt-get udpate
    sudo apt install ssh
    

  6. Теперь можно скачать .tar.gz собственно Cling и распаковать его куда-нибудь, например в home dir.

  7. Закрываем, но не выключаем, виртуалку. На хосте запускаем KiTTY или какой-нть еще SSH клиент и коннектимся к виртуалке удаленно.

  8. Подключаемся к виртуалке из хост системы, запускаем Cling, профит!

Как этим пользоваться?

По сути Cling – это REPL для С++, как бы безумно это не звучало. Вот типичная сессия:

[cling]$ #include <iostream>
[cling]$ #include <vector>
[cling]$ using namespace std;
[cling]$ vector<int> numbers{1,2,3};
[cling]$ for (auto& x : numbers) x *= 3;
[cling]$ for (auto& x : numbers) cout << x << "\t";
3       6       9

Единственная проблема что если хочется функции, то нужно переключиться командой в .rawInput, иначе работаеть не будет:

[cling]$ .rawInput
Using raw input
[cling]! int add(int i) { return i+1; }
[cling]! .rawInput
Not using raw input

Ну вот как-то так. Еще следует заметить что после объявления символ уже нельзя переопределять, это вам не MATLAB.

Метакомманды

Самому Cling можно посылать команды поведения через точку. Вот несколькие из них помимо .rawInput, о которой мы уже говорили:

  • .x foo.cpp загружает foo.cpp и вызывает из этого файла функцию void foo(), если таковая определена

  • .L mylib загружает либу или файл

  • .I path добавляет include path

  • .printAST показывает AST после каждого обработанного ввода

  • .help показывает короткую справку со списком всех метакоманд (я тут привожу лишь некоторые)

  • .q выходит из интерпретатора

Заключение

Cling позволяет работать с С++ как с MATLAB’ом, то есть в REPL-стиле. Конечно, с точки зрения юзабельности есть много косяков, и графики оно пока не строит (только если вы сами не сделаете для этого инфраструктуру), но для тех кто хочет быстро что-то посчитать, эта утилита – самое то!

P.S. большое спасибо Михаилу Филиппову за помощь при настройке всего этого счастья!

Written by Dmitri

26 Апрель 2015 at 9:38

Опубликовано в С++

Tagged with

Прокрастинация

Случаем наткнулся на анонс CodeFest’овского доклада под названием Тупняк как чума 21 века и что с этим делать и понял что пришло время написать пространный productivity-пост, т.к. сам являюсь и прямо и косвенно (через родственников) жертвой этой глобальной проблемы, имя которой прокрастинация.

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

Скриптинг

Давайте найдем еще какую-нибудь ситуацию, в которой человек «тупит». Например в знакомствах – встречаешь кого-то симпотичного, а найти интересные темы для разговора, когда это нужно вот прямо сейчас – крайне сложно, и ты начинаешь «тупить» и нести всякий бред. Причем, вспоминая себя лет 10 назад, это был действительно «бред», т.е. что-то что с рациональным мышлением связано очень слабо. Что в этом случае советуют психологи? Правильно, скриптинг.

Термин я правда сам выдумал. Только что. Но идея примерно такая: подготовься к разговору заранее. Иначе говоря, не поленись, залезь в новости, посмотри чего интересного произошло, что из этих тем было бы интересно собеседнику. Попытайся представить как может пойти разговор, какие темы позволят тебе выразить свою личную позицию в положительном свете так чтобы повысить свой авторитет в глазах собеседника. Для застенчивых, эта практика – самое то.

Теперь возвращаемся к работе. Первый принцип он тот же самый – знай что ты планируешь делать и когда. Если это неочевидно, можно попробовать составить нечто вроде графика, и вместо того чтобы использовать типовые решения вроде Outlook, самоуважающий айтишник уж может сам сесть и написать что-то кастомное, где можно быстро делать изменения, визуализировать, да все что душе угодно. Хоть в MATLAB’е, чесслово. На самом деле, с этим не все так гладко. У меня есть трекер, который если что выплюнет мне весь мой backlog. А как приоритизировать? Обычно что интереснее, тем и занимаемся в первую очередь. Иначе говоря, таски все конкурируют между собой, пытаясь меня соблазнить.

Соблазны

Человек – штука несовершенная, и падок на всякую наркоту. Только раньше наркотиками были опиум или абсент, а теперь наркотик – это «быстрая» информация (по аналогии с быстрыми углеродами). И «подсев» на них, эффект тот же самый – хочется полезть в интернет и посмотреть бредовый клип. ← вот, признайтесь что вы отвлеклись от этого поста и таки кликнули на ссылочку.

Самый простой способ – это сделать быструю информацию сложно доступной. Например у меня в hosts-файле (для тех кто не знает, там можно переопредить IP для того или иного домена) введены те сайты, которые в условно-рабочее время вообще трогать нельзя. В качестве примера: Хабр. Он раньше был интересный, но сейчас деградировал в маркетинговую помойку где 75% постов это «блог компании XYZ». Это конечно звучит очень лицемерно, т.к. я сам пишу в блог кое-какой компании, но для меня как программиста там мало чего интересного. Поэтому можно посмотреть и потом.

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

Единственное для чего может нужен браузер – это чтобы сделать шумовой фон. Это для тех из вас кто реально умеет работать под музыку. Но тут мои советы просты – поставьте отдельный плеер, установите что вам нравится (я рекомендую специальные фоновые дорожки, например 4-й диск Skyrim Soundtrack), и вперед. Ведь если открыть в браузере MP3 помойку, появится соблазн по ней побродить и это, опять же, выпилит у вас предостаточно времени.

Отвлечения

Вот тут мясо. Серьезно. Все знают что в «зону» войти сложно, а выбить человека из нее – тривиально. Поэтому у многих айтишников (у меня в том числе) рефлекс не реагировать вообще если со мной кто-то говорит пока я работаю. Я даже не пытаюсь слушать.

В open-plan офисах, все люди – жертвы шума. Тут спасают наушники – либо с активным шумоподавлением
либо, что лучше, с хорошей изоляцией. Но даже наушники нельзя слушать весь день – они давят на голову, так что это скорее временное решение.

Еще одна проблема – это всякие мессенджеры, email, нотификации и прочее. Тут, опять же, все просто – отключите все некритичные уведомления. Например, у меня issue tracker не присылает мне e-mailы, он вместо этого шлет все по google talk. А прелесть в том, что gmail (где gtalk как бы хостится) у меня закрыт, т.е. он просто накапливает сообшения пока я не приду и не прочитаю все залпом. А я это сделаю только когда освобожусь.

С моей стороны все это наверное звучит странно – ведь я большой адвокат использования большого количества экранов. Но эти экраны используются, в основном, для работы а не для того чтобы на меня сразу из нескольких мест обрушился поток данных. Поверьте, на сегодняшний день можно найти место на 6 экранов с одной лишь Visual Studio. 3 экрана только на редактор, одно на запуск тестов, другое на debug-related stuff, третье на профилирование. Вот вам, все место занято.

Так на что же можно отвлекаться? На передышки, конечно же. Достаточно поставить себе таймер-напоминалку. Есть правда и сложные технологические решения которые блокируют к чертям все ваши окна на какое-то время – не знаю, может это overkill, а может наоборот, хорошая практика. Надо будет попробовать.

Отдельно про экраны


By default, сторонние экраны жутко отвлекают. Не столько информационным контентом столько тем фактом что они светят. Экран (ровно как и iPad, например) – это лампа которая светит в глаза и не стесняется. Если их несколько, то у вас практически солярий. Чтобы все это не отклекало, нужно

  • Сделать все темным. В Visual Studio это темная тема, в IDEA-based IDE это Darcula. Насчет других тулов (к пр. MATLAB) – настроить как надо. Тут как бы все понятно, темно значит светит меньше, раздражитель слабее.

  • Удалите движение. Например, у музыкального плеера включен визуализатор уровней? Выключить! Появляется иконка нотификации на таскбаре? Спрятать весь таскбар вообще! И так далее.

  • Выпилить все крупные визуальные нотификации вроде всплывающих окон (Outlook, я смотрю на тебя) за исключением тех ситуаций когда это по работе и связанно конкретно с вами. Например, попап который показывает, прошел ли билд, если этот попап появляется крайне редко – это приемлимо.

Так или иначе, экраны даже в таком состоянии давят на нервную систему. Например, когда работаешь и с C++ и с MATLAB одновременно, хочется порой прыгать от одного к другому чтобы «че-то посмотреть», но ты толком не знаешь что. Иногда просто интересно лишний график написовать, хотя понимаешь что и не нужно это толком.

Внешние раздражители


Внешние факторы можно выпилить только если вы живете одни. Тогда да – можно вырубить телефон/домофон/мобильный, и никто трогать не будет. Но если (не дай сотона) вы живете не одни, тогда придется использовать все методы от уговоров и до эмоционального терроризма чтобы вбить в головы халопов что трогать вас нельзя. Помехи от близких – фактор №1 против самой идеи работы дома. Не коммуникации с коллегами, а как раз тот факт что коллеги-то ваши может и знают что друг друга без необходимости лучше не отвлекать, но как объяснить собственному котэ что приходить и ложиться на колени когда ты кодишь это как бы некомильфо? Хотя блин, рефлекс Павлова, можно битой наверное.

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

Резюмируя

Отвлечения, я считаю, это еще допустимая проблема. А вот прокрастинация – это действительно экономическая угроза обществу. Особенно обществу вроде Российского, где производительность труда в 3-4 раза меньше чем в Имперской Америке. Хотя с другой стороны, при 100%-й автоматизации, все люди по определению становятся потребителями и кроме прокрастинации не будет вообще ничего. Но мы пока все еще работаем.

Так вот, отчасти прокрастинация – это конечно синдром того печального факта, что многим людям их работа не нравится совсем и для них Reddit с котиками и собачками – это временный побег из этой тюрьмы (но только временный т.к. wage slavery – это как минимум до пенсии). Нам с вами повезло больше, но поскольку мы в самом эпицентре информационных технологий, весь этот шквал лишней информации пытается обвалиться и на нас тоже. От успешности противостояния этому напору собственно и зависит то, добъемся ли мы чего-нибудь в нашей жизни или нет. ■

P.S.: этот блог-пост был написан без отвлечения на что либо.

P.P.S.: надеюсь мой блог-пост не отвлек вас от более важных дел.

P.P.P.S.: а вот собственно видео доклада:

Written by Dmitri

21 Март 2015 at 18:18

Попытки отражения garbage-collected структур на ужасный неуправляемый С++

Если вы вдруг решили сконвертировать C# в C++, то большинство задач конверсии – тривиальны. int меняется на int32_t, string на std::wstring (хотя на самом деле просто string для большинства людей которым unicode не нужен). Ну и так далее. Различия в большинстве случаев несущественны.

Основной задачей, как ни странно, является конверсия reference типов, т.к. в C# можно создавать массивы, дженерики и просто ref-типы и пускать все на самотек дескать “когда-нибудь освободится”, а вот на C++ так делать нельзя. Напомню, что в С++ есть вот такие варианты:

  • Аллоцировать вещи на стеке. К сожалению, за исключением примитивных типов, в C# никто так не делает. Чтобы C#ный объект который кто-то аллоцировал через new аллоцировать в С++ коде на стеке, нужно быть увереным что объект маленький и что он действительно только вот тут, в локальном scope, что его никто не потребляет. Зато стек почистится по мере выхода их скоупа, что как бы неплохо.

  • Аллоцировать вещи вручную через new/delete: это нереально в принципе т.к. если идти по этому пути, то у каждого типа может быть свой набор ссылок на весь мир, ну и… вы поняли. Получится ад. Не вариант.

  • Использовать умные указатели так, как их нужно использовать. То есть например если у вас есть фабрика которая порождает объекты и выдает их наружу, то вы можете возвращать unique_ptr. И так далее. Одна лишь проблема: как понять какой указатель нужен? Опять нужен глубинный анализ, а это сложно.

  • Использовать везде shared_ptr, т.к. это как раз тот указатель, который можно либерально копировать повсюду и при этом не получить ситуацию когда вы пытаетесь вызвать что-то у объекта, который уже был перемещен куда-то.

Инициализация и присваивание

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

class Person
{
  string name;
public:
  Person(const string name) : name(name) {}
};

Опаньки! А мы-то думали что все не-примитивные объекты будут shared_ptr. В результате получается, что

  • Все типы которые мы считаем “маленькими” (а это включает всякие int, float и так далее) передаются by value

  • Строки и прочие типы которые нормально себя ведут в нынешней системе типов мы передаем как const ref

  • А вот все остальное – да, проблуем использовать shared_ptr

Полноценный пример

Давайте типичный пример с человеком у которого есть адрес:

struct Address
{
  int HouseNumber;
  string StreetName;
  Address(int houseNumber, const string streetName)
    : HouseNumber(houseNumber), StreetName(streetName) {}
};

Я намеренно использую struct и C#-ное именование а также не использую properties т.к. автосвойство C# можно смело конвертировать в поле C++ without loss of generality. Так вот, у нас есть адрес который берет const string во втором аргументе и это как бы правильно.

Теперь посмотрим на человека, который обладает адресом:

struct Person
{
  int Age;
  string Name;
  shared_ptr&lt;Address&gt; HomeAddress;
  Person(int age, const string name, shared_ptr&lt;Address&gt; homeAddress)
    : Age(age), Name(name), HomeAddress(homeAddress) {}
};

Вроде тоже неплохо. Сразу понятно что подсовывать Address нам не нужно, и что нам нужна “управляемая” версия. Теперь все это можно потреблять:

auto address = make_shared&lt;Address&gt;(221, &quot;Baker St&quot;);
auto person = make_shared&lt;Person&gt;(40, &quot;Sherlock&quot;, address);
cout &lt;&lt; person-&gt;Name &lt;&lt; endl;

Более того, мы можем не нервничать насчет удаления address если его “хозяин” надоел и его грохнули:

shared_ptr&lt;Address&gt; addr;
{
  auto address = make_shared&lt;Address&gt;(221, &quot;Baker St&quot;);
  auto person = make_shared&lt;Person&gt;(40, &quot;Sherlock&quot;, address);
  addr = person-&gt;HomeAddress;
}
cout &lt;&lt; addr-&gt;StreetName &lt;&lt; endl;

Ну ок, вроде оно как-то работает. Хотя тут мне подумалось… а ведь по идее можно и адрес было передавать как const shared_ptr<Address>, не так ли?

Ладно, что там следующее?

Массивы

Массивы – это вообще больное место. В C# есть два разных типа – прямоугольные [,] и угловатые [][], в С++ существует только 2й вариант. Но проблема даже не в этом. Проблема в том, как вообще представить N-мерный массив чего либо через умный указатель.

Начнем с простого: у человека несколько имен и это как-то нужно хранить. Тут, самое безопасное – это vector<string>. В принципе, со строками мы можем себе позволить такой вот расклад когда мы копируем by value. Но как насчет набора адресов?

Одномерный набор адресов в C# подразумевает конверсию как List<T> так и T[] в vector<shared_ptr<T>> – конечно, для тех типов где shared_ptr нужен, т.е. не для для примитивов или string:

struct Person
{
  int Age;
  vector&lt;string&gt; Names;
  typedef vector&lt;shared_ptr&lt;Address&gt;&gt; AddressCollection;
  AddressCollection Addresses;
  Person(int age, const vector&lt;string&gt; names, const AddressCollection addresses)
    : Age(age),
      Names(names),
      Addresses(addresses)  {  }
};

Ну а тут можно воспользоваться любезно предоставленым typedef’ом и проинициализировать все это счастье в стиле С++11:

auto person = make_shared&lt;Person&gt;(23, 
  vector&lt;string&gt;{&quot;Janes&quot;, &quot;Jimmy&quot;},
  Person::AddressCollection{ 
    make_shared&lt;Address&gt;(123, &quot;Hull Rd&quot;), 
    make_shared&lt;Address&gt;(23, &quot;Sesame St.&quot;)});
for (auto addr  : person-&gt;Addresses)
{
  cout &lt;&lt; addr-&gt;StreetName &lt;&lt; endl;
}

А что же насчет std::array или например boost::shared_array? Ну, std::array на самом деле требует (сразу!) известную длину. То есть если у вас в C# написано например что int i = new int[3] то тогда да, вам повезло:

struct Person
{
  array&lt;shared_ptr&lt;Address&gt;, 2&gt; HomeAndWorkAddresses;
  explicit Person(const array&lt;shared_ptr&lt;Address&gt;, 2&gt; home_and_work_addresses)
    : HomeAndWorkAddresses(home_and_work_addresses)
  {
  }
};

От кода выше в принципе уже должно тошнить, но для тех кто не понял в чем соль, вот то, как выглядит инициализация сего счастья:

array&lt;shared_ptr&lt;Address&gt;, 2&gt; addresses = { {
  make_shared&lt;Address&gt;(123, &quot;London Rd&quot;),
  make_shared&lt;Address&gt;(23, &quot;Shirley Ave&quot;)
} };
auto person = make_shared&lt;Person&gt;(addresses);
cout &lt;&lt; &quot;Work: &quot; &lt;&lt; person-&gt;HomeAndWorkAddresses[1]-&gt;StreetName &lt;&lt; endl;

Нда, мне определенно не нравится std::array. В большинстве случаев, мне кажется, лучше всего использовать vector<T>, vector<vector<T>> и так далее.

Полузаключение

На самом деле, то, что я описал – это верхушка айсберга. Например, допустим что мы допускаем хранения vector<string> но ведь по сути дела для передачи этой коллекции куда либо (а мало ли зачем?) мы не можем передавать ее by value (это расточительно!), и с другой стороны, она не shared_ptr<T>, то есть единственный наш вариант – это передавать ее как const vector<T>. Хмм, а вообще это не такая уж и плохая идея.

Вообщем, в этом посте я для себя вывел набор (вполне вероятно ошибочных) правил по тому, как конвертировать reference-конструкты C# в нечно С++ное чем можно хоть как-то управлять. Возможно в последствии построить поверх всего этого какие-то дополнительные оптимизации. Посмотрим…

Written by Dmitri

30 Январь 2015 at 1:20

Опубликовано в Programming

Tagged with , ,

Итоги 2014

personal efficacy treeСловами не передать какое нужно нынче количество усилий чтобы вот так взять и написать блог-пост. Вот сижу тут под новый год, а меня все постоянно отвлекают: например, человек только что прислал вот такую фотку (вам не покажу ибо бред). Мне кажется полное забрасывание информацией – это стало уже комильфо, в то время как мы должны, по идее, от людей которые нам что-то постоянно кидают, ну если не отстреливаться ружьем то хотя бы делать /alertsoff. Также, если вдруг вы еще помните черную магию batch-файлов, можно тупо настрочить

taskkill /f /im skype.exe
taskkill /f /im chrome.exe

И это уже закроет 99% информационного шума. Все, кажется можно начинать.

.NEXT

Вообще, .NET конференция – это была моя давняя мечта. А в этом году их было аж две: в апреле в СПб на 300 человек, и в Москве совсем недавно на 400. На обеих конфах top-3 места по докладам взяли сотрудники JetBrains, и если на первой конфе нас было очень много, то на второй – там уровень докладчиков был еще выше и соответственно конкуренция была серьезная.

Я в Top-3 не попал, зато попали

  1. Роман Белов: Memory & Performance. Tips & Tricks
  2. Дмитрий Иванов: Принципы построения многопоточных десктопных .NET-приложений на примере ReSharper
  3. Дино Эспозито: ASP.NET vNext: What it means to you and what it means to Microsoft

Дино был нашим keynote speaker на конференции, и в целом слушателям он понравился. Думаю и на будущие конференции его можно звать, хотя естественно хочется «повышать градусность» и звать других известных спикеров тоже. Получится это или нет – покажет время.

Пока план .NEXT – повторять то, что уже работает (2 эвента в год, один в СПб, другой в Мск). Я бы конечно хотел сделать что-нибудь за пределами: буду думать про Хельсинки, хотя опыта организации международной конфы у меня пока нет. И самое главное, совершенно непонятны финансовые риски и возможные доходы.

nesteruk_alt_enter

Технологии

Что могу сказать? Я вам не Thoughworks Technology Radar, у меня спектр применения всякого технологического счастья очень узкий.

Тем не менее, в плане .NET развитие очень интересное: много чего ушло в open-source и есть подозрение что вообще весь .NET станет cross-platform т.к. иначе никто на нем писать не будет. Ведь популярность всяких там Node и иже с ним никуда не делась: все хотят все гнать на Linux и точка. Я конечно этому очень рад т.к. для меня ASP.NET MVC это идеальный тул, хотя сейчас набегут рубисты и скажут что «все это уже было». Ну ок.

Помимо развития .NET, продолжается прогресс в степях С++: в этом году я пару раз выступал на встречах C++ User Group Russia, а в следующем году будет конференция (программа, как видите, формируется) и я буду там делать доклад и еще на будке немного (не всю конфу, увы).

Вообще, очень интересно заниматься двумя продуктами (CLion и ReSharper C++) которые в какой-то мере конкурирую друг с другом по feature set, хотя и покрывают разный технологический стек. Я конечно фанат «конвергенции» когда разные разработки можно свести в один большой продукт, но в данном случае боюсь этому не бывать.

Для тех кому С++ «до лампочки» скажу лишь что этот язык – живее всех живых, и что бы не творилось в мире в плане популярности языков, как минимум 3 конкретные индустрии – game dev, embedded и quant finance – использовали и будут использовать именно C/C++. Меня конечно из всего этого интересует последняя (финансовая математика), поэтому я сейчас в процессе обкатывания библиотек (таких как QuantLib) под вышеупомянутыми продуктами.

Как ни странно, в этом году я не смог попользоваться ни D ни F#. Вообще мне кажется что с учетом прогресса в С++ (а также того факта что рано или поздно, ну может лет через 5, вы сможете шипить C# native), использование альтернативных языков хоть и возможно, но скорее «для души» нежели ради денег.

Гаджеты

В этом году не удалось попробовать ничего нового. 13-дюймовый айпад так и не зарелизили, а больше ничего перспективного и не было. Да, единственное, я наконец-то перешел на Blackberry, но в отличии от других людей, которые считают что писать блог-посты про то «как я перешел на WP/Android/iOS» это уместно, для меня это – ниже плинтуса. Так что и не надейтесь. Скажу так: BB Q10 меня всем устраивает, и точка.

А, да, к концу года Intel устроил распродажу Xeon Phi по $200 штука. Вот вам вполне гаджет, но поскольку нынешние разработчики о performance знают лишь краем уха, все это мимо цели. Наверное потому такая и цена, да.

Социалочка

Как человек которые сидит по 16 часов в день (с перерывами) за компом, моя социальная жизнь ограничена всякими эвентами вроде .NEXT, NDC London, выступлениями на user-группах в таких злачных местах как Таллинн или Рига, ну вот собственно и всё. И не то чтобы я планирую как-то это status quo менять.

Чего вообще пропало из жизни так это всякие посиделки с родственниками. Мне кажется в 21-м веке никто никому не нужен, и люди тебе в основном звонят только когда им чего-то от тебя надо. Да, это тотальная деградация, но с другой стороны, следует признать что не все люди вот прям такие интересные. Я например достаточно унылый: я могу разве что деньги обсуждать.

Политика и экономика

В этом году случился какой-то эпик фейл в РФ. Все уже надеялись что отношения с западом будут как-то но развиваться, и тут нате вам Украина. Причем весь разлад поначалу пошел именно на экономической почве: правительство Украины не захотело подписывать договор с ЕС, а люди взяли и смекнули что это как бы плохо, т.к. что покупать у РФ и таможенного союза – непонтятно, а вот в ЕС есть печеньки, Amazon.de и иже с ними.

Дальше последовал «захват» Крыма, сакнции, и хоть все и трубят изо всех дыр что де сакнции бессмысленные и на нас не влияют, но факт таков, что среднестатистический россиянин потерял как минимум 50% покупательной способности, если не больше. Так что санкции оказались не просто болезненными, а прям катастрофическими. Поэтому USDRUB на момент написания этого поста выглядит вот как-то так:

usdrub_epic_fail

Больше всего мне кажется народ офигел от сбитого Боинга (строго говоря, год оказался горазд на падения азиатских самолетов, да и паромам тоже не повезло). Я сам в тот момент летел из СПб в UK (хорошо что не не над Украиной маршрут), прилетаю, включаю BBC, а там такое… я бы тоже озверел, наверное. Ну и конечно тот поток лжи и откровенных фейков на федеральных каналах, не говоря о бреде вроде превратить США в гору радиоактивного пепла… позор, просто позор… ну как так можно позориться-то, а?

Тем временем… в магазинах, где и изначально-то нормальной еды не было (в РФ нормальная еда только в ресторанах, на прилавках ее нет), теперь вообще все плохо. Хуже может быть только голод и еда по талонам, как в 90е – и не стоит зарекаться что их не будет. Но с другой стороны в магазинах и телевизоров-то нет (упс!) а это значит что все такие богатые-шоколадные и вообще все супер, хотя когда у меня на графике USDRUB добил до 80, я думал что вот оно – market crash, дальше дефолты, девальвация и гори оно все огнем. А доллар за 500 это не так нереально как может показаться. И эти рынки не закрыть, разве что можно сделать рубль неконвертируемым, но это такой же адъ как и отключение SWIFT (которое, кстати, еще может случиться). Поразительно что каналы вроде RBC могут еще шутить (хотя улыбаться определенно не время):

Ну да ладно, про РФ забудем, ну ее – вот в Штатах все вообще шоколадно: DJIA бьет рекорды, NASA планирует лететь на Марс, Elon Musk продолжает выпускать новые модели Tesla (единственная машина, которую вообще стоит покупать), ну и капиталиация Apple или Google теперь больше чем весь рынок РФ. Так что повод для оптимизма в плане инвестиций есть. Ну и шортить USDRUB никто не запрещает… хотя как не запрещает, в Британии уже косяки с этим.

Итого

Как-то действительно получилось в этот раз. И я не в коей мере не ставлю себе целью на следующий год написать 100500 статей. Мне бы книгу дописать. Кстати, одну уже сделал, вот ловите, MATLAB Succintly (бесплатно и про MATLAB). А сейчас я как бы пишу серьезную книгу для Apress, тему не скажу, не просите. Может и не допишу вообще, т.к. денег в этом мало, а тщеславие можно тешить и по-другому.

Еще, я почти уверен, что я убью devtalk.net и spbalt.net. Касательно первого — один блог-пост за год (wordpress так говорит!) это не стоит того, а что касается spbalt.net то извините, но поскольку никто все еще не готов ничего рассказывать на встречах юзергрупп (а я насильно заставлять никого не буду!) то имеем что имеем. Впрочем, имхо .NEXT-а должно хватать. Но если не хватает — велкам в личку!

И еще, я сейчас занят небольшим e-learning проектом, так что что-нибудь я точно вам покажу в следующем году. Когда – это вопрос.

С Новым Годом! ■

Written by Dmitri

31 Декабрь 2014 at 12:31

Опубликовано в Technology

Неожиданные изменения в экосистеме .NET

Думаю многие из вас смотрели вчерашний Connect(); — там Microsoft в очередной раз показывали что происходит в плане технологий и инструментария для разработки. Но мало кто ожидал что .NET (конечно не весь, а только некое «ядро») будет выпущен в опенсорс, да еще с гарантией отказа от судебного преследования.

На текущий момент у нас, правда, уже много всего в Open Source, включая языки C#/F#/VB.NET, ASP.NET а также (удивительно) Entity Framework, не говоря о более мелких проектах вроде MEF. Так вот, теперь о ядро дотнета, включая такие сакральные вещи как GC (сборщик мусора, чей алгоритм держался в строжайшем секрете) теперь тоже идут на GitHub (да-да, не на CodePlex а туда, где реально сидят разработчики).

.NET Core

Вот что уже было выложено на GitHub:

  • Immutable Collections — те самые немутабельные коллекции о которых я писал.

  • SIMD — т.е. поддержка длинных регистров которые используются для SSE/AVX. Что ж, хорошо! Пока что доступ к SIMD возможен только через С++, правда основная головная боль по использованию SIMD уже ушла благодаря умным компиляторам. Писать assembler или использовать intrinsics нужно только в очень крайних случаях.

  • AssemblyMetadataReader — всякие там CustomAttribute и иже с ним. Странно как-то отделять это от всего остального, ну да ладно.

  • XDocument и XmlDocument — ну то есть поддержка Xml и в частности моего любимого (хоть и бажного, увы) System.Xml.Linq.

Одна из идей всего этого – нечто под названием Core CLR, т.е. возможность шипить некое ядро CLR вместе с вашей собственной программой. Это даст некую отвязку от ситуации когда ваше ПО не поставить, не выкачав предварительно из интернета еще 100Мб файлов .NET Framework 4 (по собственному опыту). И да, урезанная версия .NET Framework проблему эту не решила, увы.

Visual Studio Community

Основная пробема была и есть что VS бесплатной редакции не дает шипить ПО и не дает ставить плагины. Проехали! Теперь VS Community – новая редакция, которая

  • Поддерживает расширения

  • Позволяет распостранять ПО в коммерческих целях

Единственный нюанс – эта штука имеет ограничения по размеру компании. То есть это как бы для «небольшого бизнеса». На самом деле, все немного туманно:

In non-enterprise organizations, up to 5 users can use Visual Studio Community. In enterprise organizations (meaning those with >250 PCs or > $1MM in annual revenue), no use is permitted beyond the open source, academic research, and classroom learning environment scenarios described above.

Понятие «enterprise» еще нужно объяснить, но по крайней мере любая команда из 5 человек может смело брать и использовать, и при этом поставить на студии ReSharper без каких-либо проблем.

ASP.NET vNext

Дино Эспозито обещал на киноуте .NEXT как раз и рассказать поподробнее про ASP.NET vNext, но тот факт что эта технология теперь едет и на Linux/OSX — это серьезно. У меня, например, все сайты используют ASP.NET (большинство – MVC, но один старый сайт 2003 года все еще на WebForms), и мне развитие ASP.NET только на руку – я вряд ли буду изучать такие вещи как Node/Ruby/PHP/whatever.

С другой стороны, я признаю что все классные фреймворки где-то за пределами .NET области: я про WordPress по сравнению с Orchard, например. Мне разработчики написали, что Orchard не будет работать с моим IIS 6 (да, у меня старый IIS, и что?), а мои попытки использовать .NETные блогодвижки, в т.ч. всякий адъ вроде N2… не, ну хорошо что такие фреймворки есть, но я честно, не фанат.

Что меня радует так то, что скорее всего мы увидим C# Native на не-Windows системах. А вот это уже интересно, т.к. нужно оно не только для вебного быстродействия, но и для того чтобы в некоторых случаях можно было не страдать с С++ (хотя я уже практически привык).

C++

Да, над С++ тоже поработали (что неудивительно), добавив помимо всего прочего поддержку мобильной разработки на С++ (не забываем, что теперь и Microsoft производит Android-телефоны, если что), ну и конечно же некоторые подвижки в плане C++11/14/17, такие как generic лямбды, await, и много всего другого.

Заключение

Не знаю насчет C++, а вот за .NET беспокоиться не стоит. Такая демократизация на руку всем, и я доволен что >10 лет назад я выбрал направление, которое пока и не думает умирать.

Если вас впечатляют эти подвижки и хочется «проникнуться» средой .NET, то все просто: приходите на .NEXT 8 декабря. Это большая .NET конфа в Москве. Там буду я, коллеги из комманды ReSharper, многие известные эксперты (в т.ч. много людей из «топа» .NET-секции Хабра), и много .NET разработчиков. До встречи!

Written by Dmitri

13 Ноябрь 2014 at 12:30

Опубликовано в .NET

Фотоотчет с конференции .NEXT

Я должен признаться, что я редко участвую в конференциях. Во встречах юзер-групп – да, бывает, но на конференции меня мало кто зовет (хотя доклады я подаю постоянно). Поэтому тот факт что я не только участвовал в конференции спикером но еще и принимал участие непосредственно в организации – это исключение из правил. А если учесть что конференция была в России — вообще курьез!

То что следует ниже – это небольшой фотоотчет о том что же собственно было, а также немного инфы о том кто на картинках. Основная программа пероприятия находится на http://dotnext.ru, но читать ее наверное не так интересно.

Итак, поехали.

Общая часть

Прежде всего, вот он – Алексей Федоров, человек без которого бы ничего этого не произошло. Алексей организует много конференций, в т.ч. Joker и JPoint, также именно он придумал логотип .NEXT (все варианты от дизайнеров были унылыми). Вообщем, respect!

Собственно сам киноут делал я :) рассказывал про то как эволюционируют процессы разработки, что нового и интересного, под конец поотвечал на вопросы зрителей, в очередной раз показал в деталях поддержку в R# интерфейса INotifyPropertyChanged :)

Далее в главном зале доклад делал Станислав Сидристый – рассказывал он про детали реализации CLR. Очень хардкорно, и насколько я знаю он теперь делает мероприятие в Москве, workshop как раз в продолжение этой темы.

Впрочем, меня там уже не было т.к. я в это время был у нашей «будки» вместе с еще одним соорганизатором конференции – Филиппом Торчинским:

Будка выглядит как-то одиноко, но на самом деле в перерывах там была масса людей, у меня даже голос сел после нескольких часов общения.

Часть 1я

Тем временем, конференция разделилась на 2 трека. В большом зале делал доклад Сергей Шкредов, тим лид команды ReSharper. Доклад был про организацию системы зависимостей в большом продукте, а Решарпер по меркам индустрии о-о-очень большой продукт, 300+ проектов.

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

Далее в главном зале Кирилл Скрыган, который тоже работает в команде ReSharper, рассказывал про оптимизацию приложений. Согласно рейтингам, доклад Кирилла был самый популярный на конференции, мне же в свою очередь осталось лишь довольствоваться 2-м местом.

В малом зале доклад делал Алексей Садомов. Алексей – в прошлом один из активных участников Петербургской Группы Alt.Net – приехал к нам из Финляндии. Рассказывал он про интеграцию ASP.NET MVC приложений с Yandex.Market.

На этом этапе был кофе-брейк…

Часть 2я

После перерыва, в главном зале Влад Чистяков, наш коллега из JetBrains Moscow, рассказывал про фреймворк Nitra.

В это же время, Юлия Фаст из компании М13 (тоже кстати из Москвы) рассказывала про автоматизацию приемочного тестирования с помощью Fitnesse и TeamCity.

Далее, в главном зале был еще один доклад по TeamCity, уже непостредственно от сотрудника команды TeamCity. Евгений Кошкин расскывал про feature branches и их роль в процессе непрерывной интеграции.

А в малом зале, доклад проводил… я! Ну, как вы знаете, на любом эвенте бывают косяки и в этом случае, докладчик Виталий Баум (кстати тоже один из основателей Петербургской Группы Alt.Net) не смог к нам приехать, поэтому доклад мы делали по Скайпу. Виталий рассказал про то, как их компания использует Windows Azure для автоматизации управления функционалом автомобилей, а я в это время играл роль «ведущего телемоста» :)

Далее, Роман Белов (тоже из JetBrains) рассказал про профилировщик памяти dotMemory.

…а Станислав Сидристый в это время сделал короткий доклад на тему использования Xamarin для кроссплатформенной разработки.

Ну и в заключение, Антон Оникийчук (еще один человек из нашей ALT.NET тусовки) рассказал про использование TDD для MVVM приложений…

…а Павел Цытович из Luxoft Training в это время рассказал про использование WF для построения WCF сервисов. Я правда почему-то думал что WF уже умер в силу невостребованности, а оказывается нет.

Заключение

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

Мысли о следующией .NET конференции уже витают в облаках, но я пока обещать ничего не могу в силу огромных геополитических рисков. Надо еще посмотреть, выключат ли VISA/Mastercard 1го Июля, введут ли выездные визы, отменят ли двойное гражданство? Кто знает, кто знает…

Да, и кстати, вот все видеозаписи с конференции:

Written by Dmitri

18 Май 2014 at 15:13

Опубликовано в Events

Tagged with

Отслеживать

Настройте получение новых записей по электронной почте.

Присоединиться к ещё 129 подписчикам