Category: it

Category was added automatically. Read all entries about "it".

general

We are hiring!

Давненько не писал я о работе. А работа у нас интересная, вот только проблемы с кадровым составом. Проект потихоньку захватывает мир, людей не хватает. С улицы приходит много людей, но профессионалов мало. Решил попробовать поискать через соцсети. Итак.

Компания Deutsche Bank. Russian Development Center. Москва, метро и платформа Беговая, ТТК. Мы занимаемся разработкой программ для высокоскоростной торговли (high-frequency algo trading, подробнее прочитать можно в вики http://en.wikipedia.org/wiki/High-frequency_trading). Конкретно наша группа делает фреймворк и создает инфраструктуру (собственные каналы связи, затюненные серверы и т.п.). Потом другие программисты создают при помощи этого фреймворка торговые стратегии.

Наш проект оказался успешен и, следовательно, команда расширяется. Проект был создан около 2 лет назад. Команда распределенная, кроме Москвы разработчики сидят в Нью-Йорке и Лондоне. Большинство программистов находится в Москве.

Нам нужны

Программист на C++

Основная задача написание коннекторов к рынкам. Насколько я знаю, в других проектах - это считается скучным занятием, но мне более чем за год не наскучило. Потому что требования к latency заставляют выжимать из системы все. В принципе, наш проект, это то место где использование C++ наиболее оправдано (конкурирующий продукт на Java работает в 50 раз медленнее). Мы используем всякие низкоуровневые фишки: kernel bypass, привязка потоков к процессам, собственные аллигаторы и т.п. Мы используем C++11 и у нас нет ограничений какие библиотеки можно использовать, а какие нет (при условии, что они open source :) Написание собственных велосипедов приветствуется, если вы докажете, что ваш велосипед решает задачу на порядок быстрее.

Нужно глубокое и уверенное знание C++, TCP/IP, Linux/Unix. Аккуратность и внимание к деталям (подсказка: лучше прийти на собеседование в чистой одежде, выключить телефон и писать ровным почерком). Говорить и писать на английском. На собеседовании еще придётся писать код на бумажке (задачки стандартные, не сложнее чем были на собеседованиях в Microsoft, Amazon). Подсказка: неплохо знать математику за 3-й класс средней школы (деление уголком, сложение дробей).

Infrastructure Engineer

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

Требуется: хороший английский, быть организованным и внимательным к деталям. Опытный пользователь Unix. Навыков системного администрирования не требуется, но нужно уметь работать с текстами и процессами (emacs/vi, sed, awk, grep). Основные знания о сетях (что такое TCP, UDP, multicast, как пользоваться netstat).

Детали

Подробнее узнать про наш офис и культуру компании можно в фейсбуке: https://www.facebook.com/dbdevcenter.ru?fref=ts

Если вы живете в другом городе, то компания оплатит вам переезд в Москву. На днях взяли парня из Челябинска, например.

Резюме присылайте на: vadim.khoryakov@db.com Вопросы можно задавать в комментариях :)
красная шапочка

cygwin и немного putty

Я тут обнаружил, что cygwin-овская консольска стала вполне юзабельной. У нас как-то все используют либо putty либо виртуальные машины, чтобы коннектиться по ssh к юниксовым боксам.

А я как-то привык к cygwin. Так вот последние версии очень хорошо эмулируют поведение линуксовых konsole и т.п. Т.е. копирование в буфер выделением и вставка из буфера по клику колесом. Еще офигенная фича, что динамически меняется размер шрифта по "колесико+контрол", как в браузерах.

Сижу на работе под виндой, запускаю несколько сигвинов и никакого дискомфорта :)
красная шапочка

Introduction to Search with Sphinx

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

Sphinx - это опен-сорсный (GPL) поисковый движок с поддержкой русского стемминга. На нем работает поиск таких сайтов как Хабр и Викимапия.

Книга представляет собой краткое и очень хорошее введение в Sphinx (и поиск в целом) для новичков. Причем написана она автором системы. В книге поэтапно описываются все аспекты создания поисковой системы для небольшого-среднего проекта, типа форума, магазина или блога.

В книге нет подробной информации по распределенным индексам, морфологии и другим продвинутым аспектам.

Для чтения книги нужно обладать базовыми знаниями SQL. Хотя примеры даны на PHP, но они элементарные и я не зная PHP все понимал. После прочтения книжки где-то дня за 3 написал сервлет на Java, который бодренько полнотекстово ищет по PostgreSQL-базе из двух таблиц и строит нормальные сниппеты.


 
красная шапочка

Какие бывают программисты

По запросам "программист", "разработчик", "programmer" и "developer" Headhunter.ru выдает кучу разных названий вакансий. Что не очень интересно. Поэтому я написал небольшой фильтр (из 30 правил, например объединяющий "PHP-программиста" и "Программиста PHP") и составил список "плохих названий" (это всякие "менеджеры продаж" и "директоры по развитию") и стоп-слов (например, sales или lead auditor). Стоп-слов и плохих названий в сумме набралось около 400.

После фильтрации у меня получилось около 1130 названий из 1785 вакансий.



Вот самые популярные. Мы воочию наблюдаем, что программистов 1С аж 128, больше чем просто программистов, которых всего 72. На третьем месте Java-программист (49). 1С всепобеждающий :)

Интересности.

Интересно, что у нас чаще пишут в тексте вакансии "Java-программист" и "PHP-программист", но "Программист C++".

Еще очень много вакансий, где пишут английский текст кириллицей, например РНР (эр-эн-эр) или "С/С++" (эс/эс++).

Еще есть смешная вакансия: "Ведущий программист по разработке и сопровождению Новой Афины"

UPD: Кстати, эта диаграмка ставит под сомнение популярный на кувте миф, что сишарпников, как собак нерезаных :)
красная шапочка

C++ для троллей. raw_storage_iterator

Есть в темных подземельях стандартной библиотеки одна не совсем понятная вещь - raw_storage_iterator. Честно сказать, это не настоящий итератор, а адаптер итератора, также как stack и priority_queue -- это адаптеры контейнеров, а не контейнеров. Хотя, для STL понятие адаптер итератора лишено смысла, т.к. если, что-то выглядит как итератор, то это и есть итератор. Например указатель - это итератор.

Другие примеры итераторов-адаптеров - это всем известные и употребимые back_insert_iterator и ostream_iterator.

Так вот, по легенде, raw_storage_iterator используется только троллями для своих грязных целей. Рассмотрим пример:

class X
{
public:
...
// assignment
X& operator = ( const X& x )
{
delete impl;
impl = x.impl->make_copy();
}
...
private:
Ximplementation* impl; // стандартная идиома pimpl
};

Теперь, предположим, что у нас есть неинициализированная область памяти, сиречь буфер.

X* buf10x = static_cast <X*> ( malloc ( sizeof( X ) * 10 ) );

И мы хотим скопировать в этот буфер вектор класса X:

 std::copy ( vecX.begin(), vecX.begin() + 10, buf10x ); // crash! boom! bang! 

Стандартный алгоритм copy реализован как-то так:

  while (first!=last) *result++ = *first++;
return result;

Вот этот самый оператор присвоения и приведет к неизбежным проблемам, т.к. в реализации нашего класса X будет вызван delete с указателем на неинициализированную память. Чтобы избежать проблем тролли-программисты придумали raw_storage_iterator, в котором оператор присвоения реализован следующим образом:

template <typename Out, typename T>
raw_storage_iterator<Out,T> &
raw_storage_iterator<Out,T>::operator =( const T &v ) {
T *elem = &*ptr; // ptr - это указатель на текущий элемент в буфере
new ( elem ) T(v);
return *this;
}

Самое интересное - это выделенная красным строчка. В ней вместо опасного присвоения для нашего класса X будет вызван размещающий и копирующий оператор new. После того как у нас появился raw_storage_iterator мы можем использовать алгоритм copy безопасно:

std::copy ( vecX.begin(), vecX.begin() + 10, raw_storage_iterator <X*, X> ( buf10x ) ); // OK!

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


красная шапочка

Static & unnamed namespaces

Еще одна штука в стандарте меня малость напрягла:

The use of the static keyword is deprecated when declaring objects in namespace scope, the unnamed namespace provides a superior alternative.

Перевод: Использование ключевого слова static не рекомендуется при объявлении объектов в области пространства имен, анонимное пространство имен предоставляет лучшую альтернативу.


Т.е. стандарт не рекомендует писать вот так:
namespace MySpace
{
  static int x = 5;
  static const char* y = "abc";
  static double z = 3.14;
}
вместо этого рекомендуется писать так:
namespace MySpace
{
  namespace {
     int x = 5;
     const char* y = "abc";
     double z = 3.14;
  }
}
Одно из назначений static - сказать компилятору, что объект имеет внутреннюю компоновку, то есть сделать его видимым только внутри определенной единицы трансляции. Хотя главное значение - сказать, что внутри функции данная переменная имеет время жизни до конца программы или что данный член класса должен хранить одно значение для всех его экземпляров.

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

В блоге у Томаса Рестрепо мы можем прочитать: "Интересное использование безымянных пространств имен - это скрывать имена внутри модулей. До их появления это можно было бы сделать при помощи ключевого слова static... Лично я считаю, что безымянные пространства имен это намного лучшее решение проблемы, чем static, но не лучшее из того, что могло бы быть. По мне, использование безымянных пространств таким способом слишком похоже на использования "побочного" эффекта от отсутствия имени у неймспейса. Мне было бы гораздо комфортнее, если бы было подходящее ключевое слово, отражающее такое поведение (например hidden или internal)".

Пожалуй, что главное достоинство при использовании анонимных неймспейсов вместо статиков, это их внешняя линковка, что позволяет использовать их в качестве параметров для шаблонов. Ну и "меньше буков - больше ясность" :)
красная шапочка

Тяжела и неказиста жизнь простого программиста

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

Цитата из книги Ф. Фрёбеля "Воспитание человека" (1820-е). Перед этим он описывал как дети смотрят за работой пахаря, пастуха, садовника, лесника, кузнеца и торговца с красильщиком.

Интересно, что увидит ребенок в работе программиста, юриста, бухгалтера? Как папа или мама уткнулись в компьютер и нажимают кнопки?

Программисту еще легко. Можно купить робота и программировать его, еще можно показать ему "черепашье програмирование" (Logo), рисовать с ним GUI в Qt-дизайнере в конце-то концов. Но все равно за 200 лет мы так далеко оторвались от реальности, что малышу сложно понять чем же конкретно занимаются папа-программист и мама-юрист :)
красная шапочка

Тимоти Бадд "ООП в действии"

An Introduction to Object-Oriented Programming



Книжка у меня валяется аж с 1998, но осилил ее только сейчас.
В книжке описывается ООП на примере языков Object Pascal, Delphi, Smalltalk, Objective C, C++ и Java. Чувствуется, что автор преподает в университете -- от книжки отдает академическим подходом. Но в данном случае это хорошо. Отдельно уделено внимание паттернам и STL. Неплохо прочищает мозг показывая альтернативы и доказывая, что серебрянной пули нет. Набор языков для введения в ООП тоже довольно правильный. Жаль, что у нас в ВУЗе игнорировали Smalltalk и Objective C.

Удивительно, что в 1997 году уже активно использовались паттерны, признавалось, что STL есть смесь ФП и ООП и это не есть плохо.
красная шапочка

Приключения виндузятника в Кубунтии. Часть 2.

Фотоаппарат подцепился. Для этого нужно было поставить DigiKam (в составе которого идет gPhoto2, через которую фотик и становится доступен). DigiKam - это довольно удобный доступ к фоткам, понимает CR2 (Canon Raw), может заливать фотки на Пикасу (но я не пробовал еще).

DigiKam

С веб-камерой проблемы. Что я только уже и не делал. Прочитал кучу форумов. Скачал исходники драйвера. Они не собираются. Скачал патчи, снова не собираются. Поправил исходники руками. Собрал. В результате в каком-то ненужном мне приложении камера заработала с офигительным качеством, я не ожидал даже. Причем лампочка-индикатор "идет съемка" была выключена. Но в скайпе вместо видео невнятный шум.

Вокруг слышны крики, что мол, KDE тормозит и глючит. У меня не тормозит, не глючит, по ощущением работает быстрее чем стоящая на этой же машине WinXP. Да и многие вещи сделаны приятнее. Например, копирование файлов по FTP через Konqueror и Dolphin меня порадовало :)
Кстати, наличие у Дельфина режимов Columns и Split делает жизнь приятнее.

Dolphin

Понадобилось мне нарисовать генеалогическое древо нашего семейства. Через кубунтушную "Установку и удаление программ" тут же ставится GRAMPS. Достаточно написать в строке поиска "genealogy tree". Этот GRAMPS оказался жутко навроченной штукой. Но минут через 15 получилось нарисовать деревце.



Надыбал книжку "Программирование под Linux" издательства Вильямс. Озаботился выбором IDE. Привык уже к MS Visual Studio и хочется аналогичного по мощности и удобству работы под Linux. В книжке пишут - используйте emacs и будет вам счастье. Запустил я emacs (который под XWindow), решил поискать альтернативы. Их есть.
Collapse )