вторник, 8 декабря 2015 г.

О типах наследования в C++



Часто люди путаются с ограничениями, которые накладывают ключевые слова public, protected и private при наследовании классов в C++. Ниже приведен код, который наглядно иллюстрирует различия с правами доступа.
class A 
{
public:
    int x; // доступно извне класса
protected:
    int y; // недоступно извне класса, но доступно в методах наследника
private:
    int z; // недоступно извне класса и в методах наследника
};

class B : public A
{
    // тут x будет public
    // тут y будет protected
    // z недоступен в B
};

class C : protected A
{
    // тут x будет protected
    // тут y будет protected
    // z недоступен в C
};

class D : private A
{
    // тут x будет private
    // тут y будет private
    // z недоступен в D
};
Стоит иметь ввиду, что если ничего не указывать при наследовании классов, то по умолчанию используется private. При наследовании структур умолчания другие — там будет public.

вторник, 24 ноября 2015 г.

Как создать правильное описание вакансии



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

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

Серьезный кандидат видя такое объявление понимает, что он не подходит, и с высокой вероятностью не откликнется на вакансию, чтобы не тратить свое время. А те, кто не ценит свое время, будут тратить время работодателя на пустое первичное интервью.

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

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

Также крайне важно иметь раздел с описанием обязанностей нового сотрудника. Вы же знаете чем он будет заниматься, не так ли? Если нет, то подумайте, стоит ли вам вообще кого-то искать. Обязанности сотрудника — это то, что он будет делать на работе каждый день. Писать код, ходить на совещания, общаться с клиентами, писать документацию, считать ROI? Все обязанности стоит указать, даже если вам кажется и так все очевидным из названия вакансии. Это, с одной стороны отсеет всех, кому работа неинтересна, а с другой — люди не узнают внезапно через месяц работы, что они в должности программиста должны вести бэклог продукта и составлять отчеты по KPI.

Ну и конечно, стоит описать все преимущества, которые есть у вас в компании для таких хороших людей, которые пройдут все ваши испытания. Пишите обо всем честно. Оплата больничных по закону? Вы серьезно? Вы же не кассиров в Ашан набираете, в IT никому не интересно получить половину зарплаты после недели работы из дома из-за болезни. Разобрались, что это не преимущество, можете указать в разделе «Мы классная компания, НО». Оплаченные обеды в офисе, бассейн, футбол, фитнес? Хорошо. ДМС? Если в него ничего не включено, кроме оказания экстренной помощи в критических ситуациях, то лучше не позориться, чтобы потом не было разочарования. Подписываетесь под The Programmer's Bill of Rights? Тогда это точно стоит указать. В общем, хвалите компанию, но будьте честны, так как нет ничего хуже обманутых ожиданий.

Удачной охоты.

четверг, 8 октября 2015 г.

Притча об архитекторах



Пришел заказчик к архитектору и говорит:
— Спроектируй мне самый крутой дом, с кучей комнат, красивым оформлением и вообще чтобы удобно было.
Архитектор спрашивает:
— А где будет стоять этот дом?
Заказчик отвечает:
— Ты же крутой архитектор, ты спроектировал много разнообразных домов, просто сделай мне тоже самый крутой и удобный, а где он будет стоять — это тебя уже не касается.
Архитектор подумал и говорит:
— Да, я спроектировал очень много домов и поэтому я знаю, что если дом будет стоять в пустыне, то мне не нужно придумывать гидроизоляцию фундамента, но зато нужно подумать о мощной системе кондиционирования, чтобы вы не мучились о жары. А если он будет за полярным кругом, то мне нужно подумать о хорошем отоплении и огромных окнах на крыше, чтобы вы могли наслаждаться северным сиянием. Есть много неявных деталей, которые делают жизнь комфортной. Но если я не знаю где будет стоять дом, то как я смогу сделать его удобным?

пятница, 2 октября 2015 г.

Windows port mapping



Работая в Windows бывает нужно, чтобы виртуалка могла подключиться не только к хост-машине, но и к некоторым удаленным сервисам. Это легко осуществить создав «зеркало» удаленного порта на локальном хосте. Оказывается, это очень просто сделать встроенными средствами Windows. Достаточно ввести следующую команду (с правами администратора):
C:\>netsh interface portproxy add v4tov4 listenport=8080 listenaddress=192.168.33.11 connectport=80 connectaddress=64.233.162.101

В данной команде 64.233.162.101 и 80 — это адрес удаленного сервера. А 192.168.33.11 и 8080 — адрес порта в виртуальной сети (или любой другой локальный интерфейс).

пятница, 7 августа 2015 г.

Немобильная мобильность
или как я подключал клавиатуру и мышь к планшету

Казалось бы планшеты придумали для мобильности. Я решил проверить планшет с операционной системой Android в этом разрезе.

Все эксперименты проводились на устройстве Samsung Galaxy Tab S с операционной системой Android 4.4.2. Никто мне его не выдавал для тестов или рекламы, это мой личный аппарат для игры в танчики отладки Android приложений.

Оказалось, что с помощью OTG-кабеля можно подключить клавиатуру, мышь и флешку. При этом поддерживаются различные раскладки клавиатур. А вот действие кнопок мыши совсем неочевидно. Левая кнопка действует как касание, а действие правой зависит от приложения — где-то она работает как аппаратная кнопка «Назад», а где-то как правая кнопка мыши. На фото видно, что использовались проводная клавиатура и Bluetooth мышь фирмы Apple. Прокрутка на мыши работает как в Windows, что, учитывая сенсорную природу мыши, неудобно. Попытка воткнуть флешку в клавиатуру (в ней есть два разъема для подключения дополнительных устройств) не нашла понимания и флешка даже не замигала диодом. Возможно, этой проблемы нет при использовании более навороченного, чем мой, OTG-кабеля, но я этого не проверял.

Конечно, здорово, что все это поддерживается. Однако, подключив это разнообразие я понял, что таскать весь этот набор с собой гораздо сложнее, чем небольшой ноутбук. Результат можно увидеть на фото. Выглядит громоздко, не так ли?
Выводы у меня следующие — планшет предназначен больше для потребления информации, чем для ее создания. Смотреть что-то в интернете, разглядывать фотки и проверять почту очень удобно. А вот написать что-то... Мне конечно удалось подготовить весь этот текст пользуясь только планшетом, но не могу сказать, что клавиатура и мышь сделали жизнь проще. Разве что печатать с полноценной клавиатурой быстрее. Но вряд ли я стану таскать ее с собой. Может надо было попробовать голосовой ввод? К тому же как уменьшить фотографию до необходимого размера, сохранив при этом терпимое качество, я не понял. Все популярные приложения с Гугл Маркета сильно искажают картинку. Лучшее, чего удалось добиться видно на фото выше.

четверг, 6 августа 2015 г.

Twitter

Я заметил, что стало модно читать новости с помощью подписки в Twitter, а не через RSS. Поэтому для вашего удобства уже какое-то время существует канал @codeatcpp.

А для тех, кто любит получать статьи по старинке, продолжает свое вещание RSS канал.


Инкубатор Twitter. Подлинная история денег, власти, дружбы и предательства | Ник Билтон
(Hatching Twitter: A True Story of Money, Power, Friendship, and Betrayal | Nick Bilton)

Опять про Visual Studio Code

Судя по всему, Microsoft активно взялась за доведение Visual Studio Code до ума. Во-первых, они фиксят баги. Да, баг, который я нашел при разборе старых файлов и сообщил о нем разработчикам, пофиксили уже в следующем выпуске.
Во-вторых, они продолжают активно развивать поддержку различных языков. Поддерживают, например, Swift, который мягко говоря мало распространен среди разработчиков ПО под Windows.

Если вы хотите получать самые последние версии VS Code, то достаточно сменить канал обновлений. Для этого в файле storage.json нужно заменить строку "updateChannel": "stable" на "updateChannel": "insiders".

Расположение файла storage.json зависит от операционной системы: в Windows ищите его в %APPDATA%\code, а в OS X он лежит в ~/Library/"Application Support"/Code. С Linux все «проще» — автоматом ничего не происходит и надо каждую новую версию сливать вручную.

четверг, 16 июля 2015 г.

Даже не знаю, прочтет ли кто-нибудь эти строки

Обычно я не пишу ничего про художественные книги, но не могу не поделиться впечатлениями о книге Марсианин, которую написал программист Энди Вейр (Andy Weir). В этом году по ней выходит фильм, но несомненно эту историю лучше прочитать, так как в фильме вряд ли смогут отразить все технические детали, а они довольно интересны. Тут можно увидеть сложности удаленной поддержки, с которыми некоторые разработчики сталкиваются и в реальной жизни. Так же кто-то сможет провести параллели со своими пользователями, которые вдруг начинают использовать ваш продукт не по назначению, а потом жалуются, что он не работает. Ну и куда же без дэдлайнов. Все это очень захватывает и читается на одном дыхании. Если посмотреть только фильм, то может получится такая же история как с фильмом Doom, который сам по себе, без ночей проведенных в игре, был бы никаким. Поэтому рекомендую читать. Я прочитал в переводе, но послушав советы коллег, хочу уже перечитать в оригинале.

UPD: Как я и писал, фильм не передает атмосферу книгу и в нем выкинуты все интересные мелочи, а сюжет упрощен. Ну и книгу в оригинале я тоже прочитал, это оказалось не сложнее чтения технических статей, поэтому рекомендую всем, кто без труда читает MSDN в оригинале.

четверг, 9 июля 2015 г.

Разбирая старые диски


Некоторое время назад начал разбирать старые диски от ZX Spectrum и от первых IBM PC. Удивительно, что гибкие диски, котором по 20-30 лет все еще хранят информацию в целости и ее можно прочитать. Диски от Спектрума и сегодня можно прочитать на PC и запустить в эмуляторе. О том как это происходило и что интересного там оказалось будет отдельный рассказ, если тема покажется интересной читателям. Забегая вперед скажу, что для этого нужен дисковод 5.25 дюймов (его видно на фотке) и он есть у меня на стареньком 286-м компе.

В старых архивах нашел несколько школьных проектов из середины 90-х, которые написаны на Turbo Pascal 7 фирмы Borland. Один из них — редактор матричных шрифтов, которые использовались в операционной системе MS-DOS.


Графических фреймворков тогда было не очень много. Это было время MS-DOS и текстовых программ. Windows 95 тогда еще только-только вышла и достать ее было сложно при том, что интернет был по модему и торрентов тогда еще не было. Гораздо позже я столкнулся с фреймворком Zinc, который повторял интерфейс Windows 3.11 (сейчас он существует как проект OpenZinc), и удивительно, но Zinc развивается до сих пор и существует его современная коммерческая версия. Но в середине 90-х мне был доступен только 286-й комп с одним мегабайтом памяти и без жесткого диска. Сначала надо было запустить операционную систему MS-DOS, а уже потом вставить другую дискету с Turbo Pascal и запустить среду разработки, конечно в текстовом режиме. В таких условиях и был разработан проект Font Editor, исходные коды которого теперь можно посмотреть.

Для того, чтобы программа работала со сносной скоростью на процессорах 80286, некоторые операции приходилось писать вставками на ассемблере. Это сейчас легко найти в интернете документацию по набору команд для любого процессора, а тогда основным источником для меня была книга Питера Абеля по ассемблеру для IBM PC.


Исходные коды имеют комментарии в кодировке CP866. Все это удалось скомпилировать и запустить в виртуалке с DOS в VirtualBox. Ну и, конечно, это собралось на компе с 286-м процессором и работает неплохо, без неприятных задержек.

Позже попробую выложить еще один редактор шрифтов, который был написан мной еще раньше и полностью на ассемблере процессора Z80 для компьютера ZX Spectrum 48K отечественной сборки (их собирали в Павловском Посаде). Вся программа умещалась в несколько килобайт.

среда, 20 мая 2015 г.

Анализ зависимостей в проекте своими руками

Ранее я уже писал про скрипт, который позволяет построить граф зависимостей между проектами Visual Studio.
В последней версии я добавил поддержку C# проектов. А теперь я расскажу как создавался этот скрипт.

пятница, 15 мая 2015 г.

Обработка данных на F#

В нынешнее время годные программисты неустанно изучают новые технологии. Вот хорошая лекция по потоковой обработке данных на языке F#:


Если кто-то будет пробовать код, который приводится в лекции, то стоит иметь ввиду — если вы сидите за корпоративным прокси с авторизацией, то будут следующие проблемы:
  • Компилятор F#, как и все остальные .NET приложения, не умеет по умолчанию проходить авторизацию на прокси-сервере. В результате при компиляции выдаются такие ошибки:
    C:\Users\user853423\Documents\Visual Studio 2013\Projects\ConsoleApplication3\Program.fs(15,21,15,129): typecheck error FS3033: The type provider 'Microsoft.FSharp.Data.TypeProviders.DesignTime.DataProviders' reported an error: Error reading schema. The remote server returned an error: (407) Proxy Authentication Required.
    Чтобы это исправить, нужно найти рядом с компилятором (Fsc.exe) файл Fsc.exe.config и внести в <configuration> следующий раздел:
    <system.net>
        <defaultProxy useDefaultCredentials="true" />    
    </system.net>
    В файл App.config для вашего F# приложения нужно добавить тоже самое, т.к. это тоже .NET приложение.
  • Такая же ошибка выдается в интерактивном режиме. Исправить можно указав в коде какой прокси использовать:
    let proxy = new WebProxy("http://192.168.151.1:3128") :> IWebProxy
    proxy.Credentials <- NetworkCredential("proxy_user", "proxy_password")
    
    type dataType = ODataService<"https://api.datamarket.azure.com/bigml/CarCrashUSA2011/v1/">
    let data = dataType.GetDataContext()
    
    Также можно использовать прокси и авторизацию, которые уже указаны и использовались в IE, добавив следующий код вместо явного указания адреса прокси:
    WebRequest.DefaultWebProxy <- WebRequest.GetSystemWebProxy()
    WebRequest.DefaultWebProxy.Credentials <- CredentialCache.DefaultNetworkCredentials
    

По теме можно почитать:
  1. fsharpforfunandprofit.com
  2. Real-World Functional Programming: With Examples in F# and C# (автор небезызвестный Jon Skeet)

вторник, 12 мая 2015 г.

Встречайте Visual Studio Code


Не так давно завершилась конференция Build 2015, на которой Microsoft рассказывала о новинках для разработчиков. На что точно стоит обратить внимание — это новый редактор Visual Studio Code. Это не совсем среда разработки и чуть больше, чем просто редактор.

пятница, 8 мая 2015 г.

Незаметный выход из https зоны

Я активный пользователь портала городских услуг города Москвы. Недавно заметил странное мелькание в браузере при заходе на страницу https://pgu.mos.ru. Поскольку там имеются персональные данные, то решил посмотреть повнимательнее на то, что же происходит.

Первым делом отключил JavaScript в отладочной консоли Chrome:


Так, и что же мы видим:


А видим мы то, что чудесным образом покинули зону https и браузер никак про это не сообщил. Аналогично происходит в Internet Explorer в Windows и в Safari в OS X. Это кажется немного странным, при том, что браузеры обычно переживают из-за смешанного содержимого на странице или о том, что вы покидаете безопасную зону.

Разбор лога показал, что происходит следующая цепочка перенаправлений:

  1. Заходим на https://pgu.mos.ru и получаем ответ от сервера «301 Moved Permanently» с адресом http://pgu.mos.ru/ru/ (вот он, тихий выход из https).
  2. По адресу http://pgu.mos.ru/ru/ возвращается ответ «403 Forbidden» и страница «Privacy Required» как на картинке выше. На странице, которая «This is a WebSEAL error message template file», содержится следующий скрипт:
    <script language="JavaScript"> var href = self.location.href; var originalURL = href.substring(7,href.length); self.location = 'https://' + originalURL;</script>
  3. Попадаем на https://pgu.mos.ru/ru/.

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

Перенаправление с главной страницы не единственное. Аналогично происходит если ткнуть во многие ссылки на портале. Например, так происходит со ссылкой «Центры госуслуг» на главной страницы (https://pgu.mos.ru/ru/mfc). Серверу не нравится что адрес не имеет «/» на конце и он перенаправляется через http зону в правильный, по мнению сервера, адрес.

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