Pull to refresh
0
0
geka @geka

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

Send message

Assembler вместе с C++ в Visual Studio 2013

Reading time4 min
Views107K
Идея этой статьи отнюдь не новая, но, поскольку мне пришлось потратить два дня на разбор всех ошибок компиляции и линковки, а также поиск ответов на свои вопросы, решил, что читатели Хабра заслуживают экономии времени. Тех, кто желает быстро узнать, как использовать одновременно *.asm и *.cpp файлы в проекте, как вызывать методы C++ из ассемблера и наоборот, прошу пожаловать под кат.
Читать дальше →
Total votes 33: ↑29 and ↓4+25
Comments29

Полноценный веб-сайт на C++ и немного диванной аналитики

Reading time20 min
Views128K
Но зачем?
Тут должна быть картинка про троллейбус

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

Думаю, многим знакома такая разновидность веб-форумов, как имиджборды. Да-да, вы правильно поняли — именно на примере имиджборды я расскажу об опыте создания сайта на C++. Что же сподвигло меня заняться столь сомнительной пользы проектом? Левая пятка. В этом случае действительно никаких особых причин не было. Просто проснулся однажды утром и понял — хочу. Но это все лирика.

На Хабре хватает статей о веб-сайтах на C++: например, с использованием FastCGI или CppCMS. Но все это — HelloWorld'ы и туториалы. Я же вам расскажу о полноценном (пусть и не идеальном с точки зрения архитектуры и чистоты кода) проекте, постараюсь осветить различные тонкости.
Перейдем же к делу
Total votes 51: ↑45 and ↓6+39
Comments85

Сага о E_RPC_DISCONNECT

Reading time5 min
Views10K

Вначале был код


И был тот код написан на дотнете (еще версии 1.1) много лет назад. Код был простой и дубовый — где-то в дебрях проекта лежала стопка Interop*.*.DLL для еще более древних TLB. Очевидно, был заведен интерфейс, имплементирующий три с половиной метода, и рожден в муках набор реализаций, к моменту раскопок — их было шестнадцать (!) штук. Factory и прочие синглтоны — в комплекте.

Создавал тот код классический Application, и у всех 16 реализаций в интересующем нас месте код был скопипастан и идентичен — отличались лишь неймспейсы из интеропов.

Примерно вот так:

Type apptype = Type.GetTypeFromProgID("CoolAppID", false);
var app = Activator.CreateInstance(apptype) as Cool.Application;

var lib = app.Open(file, ... /* many flags */) as Cool.Library;
foreach(var asset in lib.Assets) {
    /* some long operations */
}

С тех пор код пережил много всего — переезд на дотнеты 2.0, 3.5, 4.0 и т. д. Стал поддерживать тех интеропов с двух до упомянутых шестнадцати — а код все тот же и все так же не меняется, лишь размножается почкованием иногда. Ни одного разрыва с 2007 года. Пока однажды не запустили этот код на Windows 8.1.
Читать дальше →
Total votes 35: ↑31 and ↓4+27
Comments8

Построение графиков в LaTeX/PGFPlots

Reading time13 min
Views96K
image

Данная статья посвящена описанию работы с пакетом PGFPlots, разработанного для популярной настольной издательской системы LaTeX. Однако, если вы даже не знакомы с последней, это не повод расстраиваться и бросать чтение этой статьи, ведь, возможно, те замечательные примеры, которые будут далее приведены, и необычайная мощность и удобство PGFPlots вдохновят вас на изучение LaTeX.
Читать дальше →
Total votes 53: ↑53 and ↓0+53
Comments20

JIT-компилятор как учебный проект в Академическом Университете

Reading time10 min
Views29K
Около шестнадцати лет назад вышла первая версия Hotspot – реализация JVM, впоследствии ставшая стандартной виртуальной машиной, поставляемой в комплекте JRE от Sun.

Основным отличием этой реализации стал JIT-компилятор, благодаря которому заявления про медленную Джаву во-многих случаях стали совсем несостоятельными.
Сейчас почти все интерпретируемые платформы, такие как CLR, Python, Ruby, Perl, и даже замечательный язык программирования R, обзавелись своими реализациями JIT-трансляторов.

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

Таким образом вам может быть интересно под катом, если:
  • Вы принципиально не понимаете, что такое JIT-компилятор, или у вас есть легкое непонимание, чем такой подход существенно лучше интерпретации.
  • Вы хотели бы написать простой JIT для своего интерпретируемого языка.
  • Вы преподаете курс «Языки программирования и компиляторы», и не против сделать практическое задание для студентов еще интересней.
  • Вам интересно, как нарисована эта картинка.


Читать дальше
Total votes 59: ↑56 and ↓3+53
Comments22

Аннотация к «Effective Modern C++» Скотта Майерса. Часть 2

Reading time18 min
Views23K
Продолжение предыдущего поста.

image

В этой части мы будем рассматривать не столько технические изменения в С++, сколько новые подходы к разработке и возможности которые дают новые средства языка. Предыдущий пост был с моей точки зрения просто затянувшимся вступлением, тогда как здесь можно вволю подискутировать.
Читать дальше →
Total votes 38: ↑37 and ↓1+36
Comments54

Аннотация к «Effective Modern C++» Скотта Майерса

Reading time11 min
Views56K
Пару месяцев назд Скотт Майерс (Scott Meyers) выпустил новую книгу Effective Modern C++. Последние годы он безусловно является писателем №1 «про это», кроме того он блестящий лектор и каждая его новая книга просто обречена быть прочитана пишущими на С++. Более того, именно такую книгу я ждал давно, вышел стандарт С++11, за ним С++14, уже виднеется впереди С++17, язык стремительно меняется, однако нигде так и не были описаны все изменения в целом, взаимосвязи между ними, опасные места и рекомендуемые паттерны.

Тем не менее, регулярно просматривая Хабр, я так и не нашел публикации о новой книге, похоже придется писать самому. На полноценный перевод меня конечно не хватит, поэтому я решил сделать краткую выжимку, скромно назвав ее аннотацией. Еще я взял на себя смелость перегруппировать материал, мне кажется для короткого пересказа такой порядок подходит лучше. Все примеры кода взяты прямо из книги, изредка с моими дополнениями.
Читать дальше →
Total votes 52: ↑52 and ↓0+52
Comments42

Главное преимущество Go

Reading time5 min
Views39K
Если спросить среднестатического Go-девелопера, какие есть преимущества у Go — скорее всего вы услышите уже знакомый перечень плюшек. О них уже написано немало, но очень часто обходится стороной другая вещь, гораздо более интересная — долгосрочный эффект тех или иных решений дизайна языка. Я хочу раскрыть эту тему чуть шире, которая на самом деле актуальна не только для Go. Но в данной статье я возьму для примера два аспекта — способ обработки ошибок в Go и систему тестирования и постараюсь показать, как дизайн языка вынуждает людей писать более качественный код.


Читать дальше →
Total votes 94: ↑70 and ↓24+46
Comments207

Встраиваем бэкдор в Bitcoin (ECDSA) или еще раз о клептографии

Reading time3 min
Views43K
Привет, %username%!
Пользуешься неофициальными bitcoin клиентами? Есть повод присмотреться к ним повнимательней.
После реализации бэкдора для RSA мне стало интересно, как обстоят дела с остальными криптографическими примитивами. Оказывается, целая наука под названием клептография занимается передачей информации в так называемых «подсознательных» каналах. Таких, о которых никому не известно кроме отправителя и получателя. Вроде стеганографии, только внутри криптоалгоритмов.
Читать дальше →
Total votes 61: ↑60 and ↓1+59
Comments36

Simple container

Reading time18 min
Views11K
Да-да, вы все правильно поняли, это статья об еще одном велосипеде — о моем Dependency Injection (DI) контейнере. За окном уже 2015-ый год, и самых разных контейнеров на любой вкус и цвет полным полно. Зачем может понадобиться еще один?

Во-первых, он может просто образоваться сам собой! Мы в Эльбе довольно долго использовали этот контейнер, и некоторые из описываемых в статье идей (Factory Injection, Generics Inferring, Configurators) изначально были реализованы поверх него через публичное API.

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

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

Эта статья — не введение в DI. На эту тему есть много других прекрасных публикаций, в том числе и на Хабре. Скорее здесь собран набор рецептов приготовления DI так, чтобы получившееся блюдо было вкусным, но не острым. Если у вас DI-контейнер в продакшене или вы написали свой собственный самый лучший контейнер, то здесь отличное место для холиваров о том, чей контейнер круче!
Читать дальше →
Total votes 16: ↑13 and ↓3+10
Comments20

Как начать работу в Kaggle: руководство для новичков в Data Science

Reading time4 min
Views144K
Доброго времени суток, уважаемые хабровчане! Сегодня я хотел бы поговорить о том, как не имея особого опыта в машинном обучении, можно попробовать свои силы в соревнованиях, проводимых Kaggle.

image

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

Мы попробуем поучаствовать в обучающем соревновании, не предусматривающем каких-либо поощрений, кроме опыта.
Читать дальше →
Total votes 19: ↑19 and ↓0+19
Comments11

Встраиваем бэкдор в публичный ключ RSA

Reading time4 min
Views111K

Привет, %username%!
Когда я увидел, как это работает, сказать, что я был в шоке — ничего не сказать. Это довольно простой трюк но после прочтения этой статьи вы больше никогда не будете смотреть на RSA по-прежнему. Это не взлом RSA, это нечто, что заставит вашу паранойю очень сильно разбухнуть.
Читать дальше →
Total votes 135: ↑125 and ↓10+115
Comments75

Xargs: многообразие вариантов использования

Reading time7 min
Views139K
xargs

Об утилите xargs написано очень много — что можно написать еще? Но если, что называется, копнуть поглубже, то выясняется, что во многих публикациях излагаются лишь самые основы, но нет главного: не объясняется, как можно применять xargs в реальной практике. Статей с разбором сложных и нетривиальных вариантов применения этого весьма полезного для системного администратора инструмента, к сожалению, очень мало. Именно поэтому мы написали свою статью и постарались включить в нее как можно больше примеров использования xargs для решения различных проблем.

Сначала мы рассмотрим принцип работы xargs и разберем примеры попроще, а затем перейдем к разбору сложных и интересных кейсов.
Читать дальше →
Total votes 68: ↑65 and ↓3+62
Comments44

Онтоинженер: от сотворения мира к порождению сущностей

Reading time12 min
Views16K
В этом посте я продолжу рассказ о той части Compreno, которая связана с профессией онтоинженера. Ну или о той работе онтоинженера, которая связана с упомянутой технологией — это уж кому как удобнее воспринимать.

Напомню, первая часть подвела нас к тому, что онтоинженеры строят онтологии, чтобы технология могла работать (без них — никуда, так уж всё устроено).
Чуть более полное описание первой части:
  • Наша система извлечения информации опирается на представление текста в виде синтактико-семантических деревьев Compreno.
  • Узлы деревьев примерно соответствуют словам в предложении, а дуги отражают зависимости между ними (с точки зрения грамматики зависимостей).
  • Деревья являются формальным представлением «смысла» высказывания, поэтому в них уже разрешены языковые неоднозначности.
  • Получив на вход эти деревья, на выходе система выдает информационные объекты — сущности (персоны, организации, локации и т.п.) или факты (аресты, смерти, покупки, родство, получение образования и т.п.).
  • Формальные модели действительности, внутри которых существуют все эти факты и сущности, называются онтологиями. Онтоинженеры разрабатывают онтологии, используя стандарт OWL.

О том, что ещё, и, конечно, зачем делают онтоинженеры, я предлагаю узнать прямо сейчас.

Семь битв – одно поддерево


Основную часть рабочего времени онтоинженер посвящает не «моделированию мира» (хотя это и звучит очень гордо), а созданию системы извлечения. И хотя мы всё больше экспериментируем со статистикой, машинным обучением и автоматическим извлечением паттернов, пока в наших продуктах и проектах используются правила, написанные вручную. Однако правила эти представляют собой не какие-то жесткие шаблоны, опирающиеся на линейный порядок слов в предложении, а описания фрагментов семантико-синтаксических деревьев ABBYY Compreno. Это позволяет нам сравнительно легко обходить вариативность и неоднозначность языка, кратко задавая множество вариантов, используемых для выражения одного и того же смысла.
Читать дальше →
Total votes 28: ↑26 and ↓2+24
Comments21

Именованные параметры C++. Не пригодились

Reading time5 min
Views30K
Время от времени вдруг начинает хотеться именованных параметров в C++. Не так давно была статья, да и сам какое-то время назад писал на эту тему. И вот что удивительно — со времен той своей статьи я участвую в новом проекте без необходимости тащить за собой старый код, и как-то удивительным образом всего этого описанного собой же не использую. Т.е. в вопросе разобрался, восхитился перспективами… и продолжил работать по-старинке! Как же так? Лень? Инерция? Ответ постараюсь дать под катом.
Читать дальше →
Total votes 76: ↑64 and ↓12+52
Comments86

Ручной монтаж сложных плат на компонентах 0402, 0603, QFN, LQFP и THT

Reading time5 min
Views84K
Приветствую!



Сегодня речь пойдет о том, как добиться высокого качества монтажа на платах с большим количеством компонентов — до 1500шт (можно и больше при плотном монтаже или при сборке 1-2 плат одновременно — не более). Потребность в таком сложном монтаже обычно возникает при изготовлении первого макета или нескольких образцов, чтобы убедиться в правильности трассировки печатной платы (основных сложных моментов) или же при разовом производстве. После получения такого макета можно начинать отлаживать программное обеспечение и вносить корректировки в плату. Заводская сборка, в этом случае, не совсем подходит из-за ее стоимости, подготовки конструкторской документации, подборки компонентов, сроков, макетирования и многого другого (под катом картинки на 8Мб).
Читать дальше →
Total votes 67: ↑65 and ↓2+63
Comments72

imarker — коммерческая СОРМ-like веб-аналитика уже у вашего провайдера

Reading time4 min
Views93K
Используете провайдера Акадо, ТТК, Ростелеком, Эр-Телеком, NetByNet или qwerty? Имеете веб-сайт, и видели запросы с IP 92.242.35.54 и User-Agent WebIndex? Возможно, вам будет интересно узнать больше о вашем провайдере и о компании imarker.

О чем речь-то?

Вышеперечисленные провайдеры подключены к сервису «таргетированной рекламы» imarker, которому они зеркалируют исходящий от пользователя трафик. Зеркалируют не только саму ссылку, но и, как минимум, все заголовки до удаленного HTTP-сервера. Как они сами заявляют, у них обрабатывается 38 млн. абонентов ISP.

image

Как только они получают трафик от пользователя, они переходят по ссылке, по которой только что перешел пользователь, и, вероятно, анализируют данные со страницы. Переход происходит буквально моментально (как правило, до 0.5 секунды), информация кешируется примерно на сутки.
Читать дальше →
Total votes 106: ↑105 and ↓1+104
Comments169

О переводе времени 2 / Не забываем пропатчить XP и 2003, иначе будет сюрприз в ночь с 6 на 7 января

Reading time4 min
Views39K
Извините за подъем несколько некрофильской темы, когда все обсуждают Windows 10. Если вы по каким-то причинам ещё используете системы десятилетней давности и до сих пор не обновили Windows 2003/XP, возможно, это пост позволит вам сэкономить время и нервы в новогодние каникулы.

Итак, вышло декабрьское обновление таймзон kb3013410. Если его (или эквивалентные изменения реестра) не установить на 2003/XP с установленным kb2998527, они и дальше продолжат переводить время. Причина — неполная поддержка Dynamic DST, значения в реестре есть, но для действий по переводу времени времени они не используются. Грубо говоря, переводить стрелки в каждый год по-разному научилась только Vista и выше (ядро 6.0). Конкретно в 2015 году, если ничего не предпринимать, 2003/XP с установленным kb2998527 переведут стрелки на летнее время (+1 час) в ночь с 6 на 7 января, и на зимнее (-1 час) 25 октября.

Чтобы этого не произошло, есть простой способ — заранее снять галку перевода времени (она опять появилась после установки kb2998527), и правильный способ — установить kb3013410 (или эквивалентные ему изменения реестра). На домашнем компьютере никаких дополнительных действий не надо, сервера я бы советовал перезапустить, т.к., как выяснилось 26 октября, некоторые приложения, а так-же службы (например, IIS в Exchange) не понимают изменения таймзон до рестарта службы.
Читать дальше →
Total votes 19: ↑19 and ↓0+19
Comments27

Параллельное программирование с CUDA. Часть 1: Введение

Reading time11 min
Views128K

Еще одна статья о CUDA — зачем?


На Хабре было уже немало хороших статей по CUDA — раз, два и другие. Однако, поиск комбинации «CUDA scan» выдал всего 2 статьи никак не связанные с, собственно, алгоритмом scan на GPU — а это один из самых базовых алгоритмов. Поэтому, вдохновившись только что просмотренным курсом на Udacity — Intro to Parallel Programming, я и решился написать более полную серию статей о CUDA. Сразу скажу, что серия будет основываться именно на этом курсе, и если у вас есть время — намного полезнее будет пройти его.
Читать дальше →
Total votes 29: ↑26 and ↓3+23
Comments36

Сводная таблица по поддержке C++ 11/14/17

Reading time5 min
Views65K
Как любому C++ разработчику, следящему за новинками в отрасли и стандартами в частности, мне стало интересно, насколько полно вообще поддерживается стандарт C++ 11 (а также 1y и 1z) разными компиляторами? Да, существуют разные сводные таблицы, но чаще всего это сравнение двух компиляторов или двух версий одного компилятора, либо сводная таблица, но уже устаревшая, либо вообще неполный список. В общем, сел я да и сделал полную таблицу (на основе списка Clang-a и GCC) по четырем компиляторам: Clang, GNU C++, MSVC и Intel C++.
Таблица под катом
Total votes 73: ↑71 and ↓2+69
Comments46

Information

Rating
Does not participate
Location
Санкт-Петербург, Санкт-Петербург и область, Россия
Registered
Activity