Обновить
4
0

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

Отправить сообщение

Техподдержка всего мира: местный колорит IT, сдобренный своей версией английского

Время на прочтение14 мин
Охват и читатели78K

Всемирная техподдержка


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

Конечно можно возразить, мол, что это за разделение такое, но такую вещь как национальный колорит отрицать ну никак нельзя, как и то, что он накладывает свой отпечаток на все сферы жизнедеятельности человечества.
Но начнём по порядку

Что нам стоит сеть построить

Время на прочтение8 мин
Охват и читатели60K
Когда пользуешься сложными алгоритмами для решения задач компьютерного зрения — нужно знать основы. Незнание основ приводит к глупейшим ошибкам, к тому, что система выдаёт неверифицируемый результат. Используешь OpenCV, а потом гадаешь: «может, если сделать всё специально под мою задачу ручками было бы сильно лучше?». Зачастую заказчик ставит условие «сторонних библиотек использовать нельзя», или, когда работа идёт для какого-нибудь микроконтроллера, — всё нужно прогать с нуля. Вот тут и приходит облом: в обозримые сроки реально что-то сделать, только зная как работают основы. При этом чтения статей зачастую не хватает. Прочитать статью про распознавание номеров и попробовать самому такое сделать — огромная пропасть. Поэтому лично я стараюсь периодически писать какие-нибудь простенькие программки, включающие в себя максимум новых и неизвестных для меня алгоритмов + тренирующих старые воспоминания. Рассказ — про один из таких примеров, который я написал за пару вечеров. Как мне показалось, вполне симпатичный набор алгоритмов и методов, позволяющий достичь простенького оценочного результата, которого я ни разу не видел.



Сидя вечером и страдая от того, что нужно сделать что-то полезное, но не хочется, я наткнулся на очередную статью по нейросетям и загорелся. Нужно сделать наконец-таки свою нейросеть. Идея банальная: все любят нейросети, примеров с открытым кодом масса. Мне иногда приходилось пользоваться и LeNet и сетями из OpenCV. Но меня всегда настораживало, что их характеристики и механику я знаю только по бумажкам. А между знанием «нейросети обучаются методом обратного распространения» и пониманием того, как это сделать пролегает огромная пропасть. И тогда я решился. Пришло время, чтобы 1-2 вечера посидеть и сделать всё своими руками, разобраться и понять.
Читать дальше →

Улучшаем производительность: boxing в .NET, которого можно избежать

Время на прочтение5 мин
Охват и читатели25K
Мы в своем проекте занимаемся разработкой сервера на C#. Этот сервер должен выдерживать очень высокие нагрузки, по этой причине мы стараемся написать код как можно оптимальней. C# редко ассоциируют с высокой производительностью, но если с умом подходить к разработке, то можно достичь очень даже неплохого уровня.

Одним из недешевых процессов с точки зрения производительности является boxing и unboxing. Напоминалку о том, что это такое, можно найти тут. Недавно я решил посмотреть весь IL код наших проектов и поискать инструкции box и unbox. Нашлось достаточно много участков, boxing'а в которых можно избежать легким движением руки. Все случаи, приводящие к ненужному boxing'у, очевидны, и допускаются по невнимательности в моменты концентрации на функциональности, а не на оптимизации. Я решил выписать наиболее часто встречающиеся случаи, чтобы не забывать о них, а затем автоматизировать их исправление. В данной статье и перечислены эти случаи.
Читать дальше →

Стереть нельзя восстановить

Время на прочтение9 мин
Охват и читатели66K
Две любопытные исследовательские статьи из разных концов планеты, опубликованные в Сети практически сразу друг за другом, дают существенно новый взгляд на криминалистические аспекты в работе SSD, или твёрдотельных устройств хранения данных, часто именуемых флэш-драйвами.
Внутренние механизмы работы SSD настолько существенно отличаются от традиционных накопителей на жёстких магнитных дисках, что криминалисты уже не могут опираться на нынешние технологии хранения данных в тех ситуациях, когда улики с носителей типа SSD фигурируют в судебных разбирательствах.
С другой стороны, фрагменты данных, хранимых в памяти флэш-драйвов, могут оказываться практически неуничтожаемыми.
Читать дальше →

Банкомат. Некоторые особенности

Время на прочтение5 мин
Охват и читатели358K


Никого из нас не удивить банкоматом (АТМ). Даже люди старшего поколения мало-помалу привыкли к этому устройству и свою пенсию в состоянии как-то снять. Однако кроме всего прочего — банкомат – это крайне занятная штука с технической и организационной точки зрения. Даже сотрудники банковских учреждений (в т.ч. и связанных с платежными картами) не всегда представляют себе тонкости его работы. В прошлой жизни я достаточно много лет был связан с платежными картами и обслуживанием банкоматов. Мне доводилось и отогревать его феном и выковыривать оттуда по кусочкам мышь кровь кишки, застрявшую в обнимку с купюрами. Даже спалил один из подконтрольных банкоматов. Дважды. Поэтому поделюсь некоторыми, на мой взгляд, интересными техническими нюансами в работе АТМ.

Подробности

Банкомат. По ту сторону провода

Время на прочтение6 мин
Охват и читатели80K
В связи с затронутой недавно темой устройства банкоматов, желании хабра узнать о них побольше, а также просто зашкаливающему количеству домыслов от такой, казалось бы, технически подкованной аудитории, я решил написать этот пост. В отличии от UserSide, который в основном занимался физическим обслуживанием банкоматов, и как мне кажется, весьма далек от тех, кто собственно пишет софт для его управления хостом, я расскажу о «той стороне». Естественно, в меру своих познаний, пока еще слишком скромных.

Так как это моя первая статья на хабре, прошу прощения за, возможно, излишнюю сумбурность.

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

Типичные ошибки API платежных систем

Время на прочтение2 мин
Охват и читатели36K
imageЕсли вы собираетесь написать n-ную платежную систему, рекомендую ознакомиться с типичными ошибками в реализации API, которые я собрал в процессе написания модулей для своего проекта.

Читать дальше →

Путешествия банковской транзакции

Время на прочтение8 мин
Охват и читатели157K
image

Некоторое время назад на Хабре уже мелькали посты о работе банкоматов: один и два, но оба они описывали принципы работы банкоматов и вообще карточного процессинга весьма поверхностно.
Для интересующихся под катом много подробностей работы карточного процессинга банка (много букв).
Читать дальше →

Секреты auto и decltype

Время на прочтение5 мин
Охват и читатели119K
Новый стандарт языка принят относительно давно и сейчас уже, наверное, нет программиста, который не слышал о новых ключевых словах auto и decltype. Но как почти с любым аспектом С++, использование этих новых инструментов не обходится без нюансов. Некоторые из них я постараюсь осветить в этой статье.
Читать дальше →

Идиомы С++. Static visitor

Время на прочтение5 мин
Охват и читатели27K
Паттерн Visitor предлагает еще один способ отделить алгоритм обработки данных от самих данных. В этой статье я кратко опишу идею, стоящую за оригинальным паттерном, его С++ специфическую вариацию и приведу несколько простых примеров использования.
Читать дальше →

Method chaining

Время на прочтение2 мин
Охват и читатели25K
В этом посте я поговорю о простом, но иногда полезном приеме программирования — method chaining. Также расскажу про потенциальный подводный камень, связанный с его использованием
Читать дальше →

«Правило ноля»

Время на прочтение5 мин
Охват и читатели48K
Применительно к с++03 существует “правило трех”, с появлением с++11 оно трансформировалось в “правило 5ти”. И хотя эти правила по сути являются не более чем неформальными рекомендациями к проектированию собственных типов данных, но тем не менее часто бывают полезны. “Правило ноля” продолжает ряд этих рекомендаций. В этом посте я напомню о чем, собственно, первые 2 правила, а также попробую объяснить идею, стоящую за “правилом ноля”.
Читать дальше →

Variadic templates. Tuples, unpacking and more

Время на прочтение7 мин
Охват и читатели109K
В этом посте я поговорю о шаблонах с переменным числом параметров. В качестве примера будет приведена простейшая реализация класса tuple. Также я расскажу о распаковке tuple'а и подстановки, хранимых там значений в качестве аргументов функции. И напоследок приведу пример использования вышеописанных техник для реализации отложенного выполнения функции, которое может быть использовано, например, в качестве аналога finally блоков в других языках.
Читать дальше →

Крестики-нолики: компилятор против человека — экстремальный метапрограмминг

Время на прочтение34 мин
Охват и читатели24K
"- После Мятежа Галактическое Содружество наложило строгие ограничения на метафункции высшего порядка. И не только из соображений этики; их власти опасаются вообще всякого проявления мании величия..."
(из поисковой выдачи google)
Предлагаю Вам сыграть в крестики-нолики с компилятором. Для игры знания c++ не потребуются, достаточно наличия cmake, python и собственно компилятора c++ ( потянет даже такой древний как gcc-3.3 ). Python используется только для ввода данных пользователя, запуска компилятора после каждого хода, и скомпилированной программы для получения результата. Все вычисления (следующий ход, определение победителя или констатации ничьей) производятся на этапе компиляции, в run-time только вывод результата.
Итак, готовы сразиться с компилятором?

Спецификатор constexpr в C++11 и в C++14

Время на прочтение16 мин
Охват и читатели252K
Одна из новых возможностей C++11 — спецификатор constexpr. С помощью него можно создавать переменные, функции и даже объекты, которые будут рассчитаны на этапе компиляции. Это удобно, ведь раньше для таких целей приходилось использовать шаблоны. Но тут все не так просто. У тех, кто не так хорошо знаком с constexpr, может сложиться впечатление, что теперь не будет никаких проблем с расчетами на этапе компиляции. Но на constexpr-выражения наложены серьезные ограничения.

В первой части будет рассказано про constexpr, о том, какие будут изменения в стандарте C++14, а во второй части будет пример использования constexpr: библиотека, которая считает результат математического выражения в строке.
С помощью нее можно будет написать следующий код:
constexpr auto x = "(4^2-9)/8+2/3"_solve;
std::cout << "Answer is " << x;

И ответ в виде дроби будет получен на этапе компиляции:
Answer is 37/24
Сразу предупреждаю, код этой библиотеки сложно понять.
Кому эта тема интересна, добро пожаловать под кат!
Читать дальше →

Передача умных указателей по константной ссылке. Вскрытие

Время на прочтение4 мин
Охват и читатели20K
Умные указатели часто передаются в другие функции по константной ссылке. Эксперты C++, Андрей Александреску, Скотт Мейэрс и Герб Саттер, обсуждают этот вопрос на конференции C++ and Beyond 2011 (Смотреть с [04:34] On shared_ptr performance and correctness).

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

Но этот пост не про корректность. Здесь мы рассмотрим производительность, которую мы можем получить при переходе на константные ссылки. На первый взгляд может показаться, что единственная выгода это отсутствие атомарных инкрементов/декрементов счётчика ссылок при вызове конструктора копирования и деструктора. Давайте напишем немного кода и посмотрим более внимательно, что же происходит под капотом.

Читать дальше →

Как я возил робота, чуть не поседел и залил кровью серверную

Время на прочтение13 мин
Охват и читатели216K
Это история одного из самых запомнившихся случаев в моей инженерной практике. По понятным причинам я поменял имена, места и некоторые узнаваемые детали, чтобы нельзя было точно определить заказчика и других участников истории.


Вот так выглядит ленточное хранилище (наше было поменьше) и библиотечный робот (наш такой же). Китаец в комплект не входит.

Часть 1. Коробка


Помню, стояли последние дни ноября. Уже думая об окончании рабочего дня, я планировал свой вечер, когда вдруг мне сообщили, что в славном сибирском городе N у нашего заказчика сломалась ленточная библиотека. Запчасть сразу же отправили транспортной компанией, но вот уже 3 дня, как она все еще была в пути. Транспортная компания невнятно объяснялась и хмыкала в телефон, а заказчик стал не в шутку нервничать. Прогнозы были неопределенные, поэтому было принято решение везти еще одну запчасть своими силами на самолете. Сотрудник склада вручил мне габаритную коробку весом килограмм десять, обклеенную штрих-кодами и стикерами, и радостно хлопнул меня по плечу со словами: «Только не вздумай в багаж сдавать — помнут».

Коробка меня, безусловно, беспокоила, но не меньшее беспокойство мне внушал пакет с сухим молоком, который в последний момент мне вручил менеджер проекта. «У них там какие-то траблы с молочкой сейчас… из-за непогоды что ли… ребята местные просили 2 кг им привезти. Тебе ж не сложно?» — сказал он. По выражению его лица и характерному жесту ладони, как бы прикрывавшей мне рот, было ясно, как он сейчас хотел, чтобы я оказался сговорчивым или даже немым.
Читать дальше →

Пишем интерпретатор скрипта и стековую машину

Время на прочтение15 мин
Охват и читатели72K

В этой статье речь пойдет о довольно необычном проекте. Однажды меня посетило желание написать свой интерпретатор какого-нибудь скриптового языка и исполняющую машину для него. Просто для того, чтобы посмотреть, как оно внутри работает. Такая цель звучит не очень благородно и я отложил затею в долгий ящик, т.к. мне хотелось более полезной формулировки.
Как-то раз, один мой знакомый посетовал, что нужно написать скрипт автоматизации на WSH, но ни VBScript, ни Javascript он не знает. Тут «благородная» формулировка возникла сама собой… нужно помочь товарищу. В результате был написан компилятор и исполняющая машина, позволяющая исполнять скрипты для Windows Script Host, не прибегая к VBScript и JS. Под катом — краткая предыстория проекта и его внутреннее устройство и сам язык программирования.
Читать дальше →

Стековые языки программирования

Время на прочтение6 мин
Охват и читатели19K
concatenative
Функциональное программирование снова в моде. В зависимости от того, предпочитаете ли вы классику или хардкор, страдаете от навязанных промышленных стандартов или вы просто хипстер, вашим любимым предпочтением может быть Scala, Haskell, F# или даже старый добрый Lisp. Такие сочетания слов, как функция высшего порядка, отсутствие побочных эффектов, и даже монады, ласкают слух всех «неокрепших юных умов», будь-то ребят из JetBrains или студента, впервые увидевшего SICP.

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

4 причины, почему люди чего-то не делают или “Как раскачать low-performer’а”

Время на прочтение8 мин
Охват и читатели108K
Так получилось, что тесть и теща у меня доктора педагогических наук. Что приводит к тому, что волей-неволей начинаешь постигать различные полезные методики :)

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

Честно сказать, вопрос поставил меня в тупик. Я начал фантазировать: ну, обстоятельства мешают, черты характера, недостаток опыта…

Не-не, сказал, тесть, все не так. Если люди чего-то не делают, для этого может быть 4 причины. После чего мой арсенал управленческих инструментов пополнился еще одним. И именно об этом инструменте мы сегодня поговорим, а заодно разберем несколько историй из реальной жизни:
  • Почему менеджеров проектов надо пересаживать в отдельное здание
  • Что делать, когда ваш заказчик не пользуется вашей системой отчетов
  • Как раскачать low-performer’а


Читать дальше →

Информация

В рейтинге
Не участвует
Зарегистрирован
Активность